如何使用Java API获取Azure VM列表(非经典/资源管理)

时间:2016-03-23 12:56:38

标签: java azure azure-virtual-machine azure-resource-manager azure-java-sdk

如何使用Java API获取使用资源管理器创建的VM(非经典)列表?为什么我们需要租户ID,客户端ID和客户端密钥来创建com.microsoft.azure.management.compute.ComputeManagementClient'宾语?

可以使用订阅ID和Azure门户凭据完成吗? 随azure-mgmt-compute项目提供的示例需要这些租户ID,客户端ID,因为我们在Azure门户上创建VM(选择资源管理器)时不需要这些详细信息。

2 个答案:

答案 0 :(得分:3)

  

为什么我们需要租户ID,客户端ID和客户端密钥来创建   ' com.microsoft.azure.management.compute.ComputeManagementClient'   对象

在幕后,com.microsoft.azure.management.compute.ComputeManagementClient使用Azure Resource Manager (ARM) REST API来执行与虚拟机相关的操作。 ARM API使用Azure Active Directory (AD)进行身份验证和授权。为了将Azure AD用于此目的,您需要在Azure AD中创建一个应用程序,并授予该应用程序执行Azure Service Management API的权限。您只需要Tenant IdClient Id和其他内容。因此,用户可以通过允许将应用程序安装在Azure AD中来使用您的应用程序。 Tenant Id是您的应用在用户的Azure AD中的唯一ID。 Client Id是您的应用程序的唯一ID。

一切设置正确后,为了使用库,用户将根据其Azure AD进行身份验证。作为身份验证/授权流程的一部分,用户获取令牌,此库使用此令牌对ARM API进行经过身份验证的请求以管理虚拟机。

  

可以使用订阅ID和Azure门户凭据完成吗?   使用azure-mgmt-compute项目提供的示例需要这些租户ID,   客户端ID我们在创建VM时不需要这些细节   (在Azure门户上选择资源管理器)。

如果您注意到,您首先需要使用Microsoft帐户或Work / School帐户登录Azure Portal。门户网站软件将令牌作为登录过程的一部分提取。之后,它使用租户ID,客户端ID和此令牌来执行所有操作。所以基本上它正在做同样的事情但是你不可见。

答案 1 :(得分:1)

感谢@GauravMantri详细解释。

  

如何使用Java API获取使用资源管理器创建的VM(非经典)列表?

根据Virtual Machine REST的Azure参考,您可以使用the REST API中需要authenticate Azure Resource Manager requestscommon parameters and headers获取资源组中所有虚拟机的列表。< / p>

以下是使用Java API的示例代码。

// The parameters include clientId, clientSecret, tenantId, subscriptionId and resourceGroupName.
private static final String clientId = "<client-id>";
private static final String clientSecret = "<key>";
private static final String tenantId = "<tenant-id>";
private static final String subscriptionId = "<subscription-id>";
private static final String resouceGroupName = "<resource-group-name>";

// The function for getting the access token via Class AuthenticationResult
private static AuthenticationResult getAccessTokenFromServicePrincipalCredentials()
        throws ServiceUnavailableException, MalformedURLException, ExecutionException, InterruptedException {
    AuthenticationContext context;
    AuthenticationResult result = null;
    ExecutorService service = null;
    try {
        service = Executors.newFixedThreadPool(1);
        // TODO: add your tenant id
        context = new AuthenticationContext("https://login.windows.net/" + tenantId, false, service);
        // TODO: add your client id and client secret
        ClientCredential cred = new ClientCredential(clientId, clientSecret);
        Future<AuthenticationResult> future = context.acquireToken("https://management.azure.com/", cred, null);
        result = future.get();
    } finally {
        service.shutdown();
    }

    if (result == null) {
        throw new ServiceUnavailableException("authentication result was null");
    }
    return result;
}

// The process for getting the list of VMs in a resource group
Configuration config = ManagementConfiguration.configure(null, new URI("https://management.core.windows.net"),
        subscriptionId,
        getAccessTokenFromServicePrincipalCredentials().getAccessToken());
ComputeManagementClient client = ComputeManagementService.create(config);
VirtualMachineListResponse listResponse = client.getVirtualMachinesOperations().list(resourceGroupName);
ArrayList<VirtualMachine> list = listResponse.getVirtualMachines();