293
技術社區[雲棲]
Java 如何啟用 ARM 虛擬機診斷
現象描述
如何通過 Java 語言實現在創建 ARM 虛擬機時開啟診斷,並配置相關指標。
實現思路
調研最高版本的 JAVA SDK(1.1.0)源碼發現,SDK 層麵並未提供任啟動診斷和配置診斷的相關接口。然而官方提供了相關的 REST 接口,參考:如何增加及更新虛擬機擴展。
這個接口為我們提供了向現有的 ARM 虛擬機添加或更新虛擬機擴展(vm extension)的功能,而我們在 Portal 上配置的“診斷功能”其實是一個名為 “IaaSDiagnostics” 的一個擴展。結合上述的 REST 接口,該 REST 請求示例如下:
https://management.chinacloudapi.cn/subscriptions/<subId>/resourceGroups/<groupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/extensions/IaaSDiagnostics?api-version=2016-03-30
這是一個 Put 請求,請求的參數主要包括 Header 和 Request Body 兩部分,官方連接中提供的解釋略有不足,以下是我們關於相關參數的說明:
-
Header:主要包括 Authorization、Content-Type 及 Host 的設置:
- Authorization:提供認證的憑據,如何獲取這個值請參考下麵認證憑據描述。
- Content-Type:指定為 application/json,以 JSON 數據返回響應。
- Host:指定為“management.chinacloudapi.cn”,終結點地址。
-
Request Body:關於擴展的配置信息,可以參考 Azure Windows VM 擴展配置示例或以下模板:
{ 'type':'Microsoft.Compute/virtualMachines/extensions', 'id':'/subscriptions/<subId>/resourceGroups/<groupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/extensions/IaaSDiagnostics', 'location':'<location>', 'name':'IaaSDiagnostics', 'properties':{ 'type':'IaaSDiagnostics', 'publisher':'Microsoft.Azure.Diagnostics', 'typeHandlerVersion':'1.5', 'settings':{ 'StorageAccount':'<storageAccountName>', 'xmlCfg':'<診斷 XML 配置的 Base64 編碼值>' }, 'protectedSettings':{ 'storageAccountName':'<storageAccountName>', 'storageAccountKey':'<storageAccountKey>', 'storageAccountEndPoint':'https://core.chinacloudapi.cn'}, 'autoUpgradeMinorVersion':true, 'instanceView':null } }
- subId:虛擬機所屬的訂閱 ID
- groupName:虛擬機所屬的資源組名稱
- vmName:虛擬機名稱
- location:虛擬機地理位置(“China North” 或 “China East”)
- storageAccountName:虛擬診斷數據存儲賬號名稱
- storageAccountKey:虛擬診斷數據存儲賬號秘鑰
- 診斷 XML 配置的 Base64 編碼值:這個值是指是將診斷指標配置做 Base64 編碼計算得到的值。關於診斷指標配置參考診斷 1.2 配置架構、診斷 1.3 及更高版本的配置架構。同時,我們在 GitHub 中提供了相關測試用例:WadCfg
接下來我們可以通過 Java 來模擬提交該請求,實現為虛擬機開啟診斷功能。
認證憑據
Authorization Header 的值是基於 AAD 方式驗證返回的 Token 字符串,詳細參考以下步驟:
-
通過 PowerShell 獲取認證憑據:
PowerShell# 1.在 PowerShell 中,登錄 Azure 賬戶 Login-AzureRmAccount -EnvironmentName AzureChinaCloud # 2.選擇當前訂閱 ID Set-AzureRmContext -SubscriptionId "訂閱 ID" # 3.創建 AD Application $azureAdApplication = New-AzureRmADApplication -DisplayName "georgeapp" -HomePage "https://www.georgeapp.org" -IdentifierUris "https://www.georgeapp.org/example" -Password "1QAZxsw2" $azureAdApplication # 4.為你的 AD 應用創建服務憑證 New-AzureRmADServicePrincipal -ApplicationId $azureAdApplication.ApplicationId # 5.為服務憑證授權。如果想了解更多內容,請參考:https://azure.microsoft.com/en-us/documentation/articles/role-based-access-control-what-is/ New-AzureRmRoleAssignment -RoleDefinitionName Contributor -ServicePrincipalName $azureAdApplication.ApplicationId
執行上述操作後,就可以獲取可用的認證憑據信息:
- tentantId:第二步執行完成後返回
- subId:第二步指定的訂閱 ID
- clientId:第三步執行完成後返回
- clientSecret:第三步中設置的 Password
-
獲取 Token :
Javaprivate String getAccessToken() { AuthenticationContext context = null; AuthenticationResult result = null; ExecutorService service = null; service = Executors.newFixedThreadPool(1); try { context = new AuthenticationContext( String.format("%s/%s", "https://login.chinacloudapi.cn", tentantId), true, service); ClientCredential cred = new ClientCredential( clientId, clientSecret); Future<AuthenticationResult> future = context.acquireToken( "https://management.chinacloudapi.cn/", cred, null); result = future.get(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } finally { service.shutdown(); } return result.getAccessToken(); }
-
Authorization: Bearer ,以下是一個實際的示例:
BearereyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Im0yZmFQUUZkQzFEVGRmWU1pb09kaHdSblFUMCIsImtpZCI6Im0yZmFQUUZkQzFEVGRmWU1pb09kaHdSblFUMCJ9.eyJhdWQiOiJodHRwczovL21hbmFnZW1lbnQuY29yZS5jaGluYWNsb3VkYXBpLmNuLyIsImlzcyI6Imh0dHBzOi8vc3RzLmNoaW5hY2xvdWRhcGkuY24vYjM4OGI4MDgtMGVjOS00YTA5LWE0MTQtYTdjYmJkOGI3ZTliLyIsImlhdC26MTQ5ODcyMzc1OSwibmJmIjoxNDk4NzIzNzU5LCJleHAiOjE0OTg3Mjc2NTksImFjciI6IjEiLCJhaW8iOiJZMkJnWU5pN2ZUS2Q0WDFxaHFOeGkvUDNsWTJUUXU5ZG1McmR5OEpucnJuTkhMV0RnYzhCIiwiYW1yIjpbInB3ZCJdLCJhcHBpZCI6ImM0NGI0MDgzLTNiYjAtNDljMS1iNDdkLTk3NGU1M2NiZGYzYyIsImFwcGlkYWNyIjoiMiIsImVfZXhwIjoyNjI4MDAsImZhbWlseV9uYW1lIjoiVGVzdDAzIiwiZ2l2ZW5fbmFtZSI6IkNJRSIsImlwYWRkciI6IjEwNi4xMjAuNzguMTkwIiwibmFtZSI6IkNJRSBUZXN0MDMiLCJvaWQiOiI3Njg2OTZiYi1hYjVlLTQ0YzYtOGUxYi03MTIyYjYxYjVlODEiLCJwbGF0ZiI6IjMiLCJwdWlkIjoiMjAwMzNGRkY3MDAxQjlEMCIsInNjcCI6InVzZXJfaW1wZXJzb25hdGlvbiIsInN1YiI6ImZZVkRjRHRKTzlqcTY0VUllU0todnc3LVh3U1JqOGw5cjJvZ3pSRVkwUlkiLCJ0aWQiOiJiMzg4YjgwOC0wZWM5LTRhMDktYTQxNC1hN2NiYmQ4YjdlOWIiLCJ1bmlxdWVfbmFtZSI6IkNJRVRlc3QwM0BNaWNyb3NvZnRJbnRlcm5hbC5wYXJ0bmVyLm9ubXNjaGluYS5jbiIsInVwbiI6IkNJRVRlc3QwM0BNaWNyb3NvZnRJbnRlcm5hbC5wYXJ0bmVyLm9ubXNjaGluYS5jbiIsInZlciI6IjEuMCJ9.C3n47Eoqvo65hYQa9UrZ6yRmedPA4HM96ZEoIQFkyeaql-ezNJVklkO0qUjA567REUJnFvQ_zSDPufLvbrO-VAqCto3w3MN4Pjlkk-4qGTNEAzeoS6k4LOC0-YHHnP_DJGv159IyUoukArNNnWrMs4ELTOw_SbhqB5usTNs7N1GPoZPJCwj5wYryFVlwYA5PN_o0ysIEj3XcdMvY18SEhsz663EJzxe-fwA0XRn7wejbbbTtXlTxvQfno5ZcB8t1IraL51CbZqyNyojc4Ya7n3ZsW6sX12Tt5e0DpMO4QpkIdyrSo1xZ3Mi7uJBAJIol-XIXnrO93_8xTfjn5Mu8_g
原文來自這裏。
最後更新:2017-08-28 13:32:19