閱讀293 返回首頁    go 技術社區[雲棲]


Java 如何啟用 ARM 虛擬機診斷

現象描述

如何通過 Java 語言實現在創建 ARM 虛擬機時開啟診斷,並配置相關指標。

portal

實現思路

調研最高版本的 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 的設置:

    1. Authorization:提供認證的憑據,如何獲取這個值請參考下麵認證憑據描述。
    2. Content-Type:指定為 application/json,以 JSON 數據返回響應。
    3. 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
        }
    }
    
    1. subId:虛擬機所屬的訂閱 ID
    2. groupName:虛擬機所屬的資源組名稱
    3. vmName:虛擬機名稱
    4. location:虛擬機地理位置(“China North” 或 “China East”)
    5. storageAccountName:虛擬診斷數據存儲賬號名稱
    6. storageAccountKey:虛擬診斷數據存儲賬號秘鑰
    7. 診斷 XML 配置的 Base64 編碼值:這個值是指是將診斷指標配置做 Base64 編碼計算得到的值。關於診斷指標配置參考診斷 1.2 配置架構診斷 1.3 及更高版本的配置架構。同時,我們在 GitHub 中提供了相關測試用例:WadCfg

接下來我們可以通過 Java 來模擬提交該請求,實現為虛擬機開啟診斷功能。

認證憑據

Authorization Header 的值是基於 AAD 方式驗證返回的 Token 字符串,詳細參考以下步驟:

  1. 通過 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
  2. 獲取 Token :

    Java
    private 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();
    }
    
  3. Authorization: Bearer ,以下是一個實際的示例:

    BearereyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Im0yZmFQUUZkQzFEVGRmWU1pb09kaHdSblFUMCIsImtpZCI6Im0yZmFQUUZkQzFEVGRmWU1pb09kaHdSblFUMCJ9.eyJhdWQiOiJodHRwczovL21hbmFnZW1lbnQuY29yZS5jaGluYWNsb3VkYXBpLmNuLyIsImlzcyI6Imh0dHBzOi8vc3RzLmNoaW5hY2xvdWRhcGkuY24vYjM4OGI4MDgtMGVjOS00YTA5LWE0MTQtYTdjYmJkOGI3ZTliLyIsImlhdC26MTQ5ODcyMzc1OSwibmJmIjoxNDk4NzIzNzU5LCJleHAiOjE0OTg3Mjc2NTksImFjciI6IjEiLCJhaW8iOiJZMkJnWU5pN2ZUS2Q0WDFxaHFOeGkvUDNsWTJUUXU5ZG1McmR5OEpucnJuTkhMV0RnYzhCIiwiYW1yIjpbInB3ZCJdLCJhcHBpZCI6ImM0NGI0MDgzLTNiYjAtNDljMS1iNDdkLTk3NGU1M2NiZGYzYyIsImFwcGlkYWNyIjoiMiIsImVfZXhwIjoyNjI4MDAsImZhbWlseV9uYW1lIjoiVGVzdDAzIiwiZ2l2ZW5fbmFtZSI6IkNJRSIsImlwYWRkciI6IjEwNi4xMjAuNzguMTkwIiwibmFtZSI6IkNJRSBUZXN0MDMiLCJvaWQiOiI3Njg2OTZiYi1hYjVlLTQ0YzYtOGUxYi03MTIyYjYxYjVlODEiLCJwbGF0ZiI6IjMiLCJwdWlkIjoiMjAwMzNGRkY3MDAxQjlEMCIsInNjcCI6InVzZXJfaW1wZXJzb25hdGlvbiIsInN1YiI6ImZZVkRjRHRKTzlqcTY0VUllU0todnc3LVh3U1JqOGw5cjJvZ3pSRVkwUlkiLCJ0aWQiOiJiMzg4YjgwOC0wZWM5LTRhMDktYTQxNC1hN2NiYmQ4YjdlOWIiLCJ1bmlxdWVfbmFtZSI6IkNJRVRlc3QwM0BNaWNyb3NvZnRJbnRlcm5hbC5wYXJ0bmVyLm9ubXNjaGluYS5jbiIsInVwbiI6IkNJRVRlc3QwM0BNaWNyb3NvZnRJbnRlcm5hbC5wYXJ0bmVyLm9ubXNjaGluYS5jbiIsInZlciI6IjEuMCJ9.C3n47Eoqvo65hYQa9UrZ6yRmedPA4HM96ZEoIQFkyeaql-ezNJVklkO0qUjA567REUJnFvQ_zSDPufLvbrO-VAqCto3w3MN4Pjlkk-4qGTNEAzeoS6k4LOC0-YHHnP_DJGv159IyUoukArNNnWrMs4ELTOw_SbhqB5usTNs7N1GPoZPJCwj5wYryFVlwYA5PN_o0ysIEj3XcdMvY18SEhsz663EJzxe-fwA0XRn7wejbbbTtXlTxvQfno5ZcB8t1IraL51CbZqyNyojc4Ya7n3ZsW6sX12Tt5e0DpMO4QpkIdyrSo1xZ3Mi7uJBAJIol-XIXnrO93_8xTfjn5Mu8_g

原文來自這裏

最後更新:2017-08-28 13:32:19

  上一篇:go  成為阿裏雲大使遇到的問題
  下一篇:go  淺析智慧醫療一卡通模式