如何使用 Java API 获取 Azure 虚拟机列表(non-classic/Resource 托管)

How to get list of Azure VMs (non-classic/Resource Managed) using Java API

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

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

Why we need tenant id, client id and client key to create 'com.microsoft.azure.management.compute.ComputeManagementClient' object?

在幕后,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 是您的应用程序的唯一标识。

一切设置正确后,为了使用库,用户将针对他们的 Azure AD 进行身份验证。作为 authentication/authorization 流程的一部分,用户获得一个令牌,该库使用此令牌向 ARM API 发出经过身份验证的请求以管理虚拟机。

Can it be done using subscription id and Azure Portal credentials? Sample provided with azure-mgmt-compute project needs these tenant id, client id where as we don't need these details when we create VM (selecting Resource Manager) on Azure Portal.

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

感谢@GauravMantri 的详细讲解。

How to get list of VMs (non-classic) using Java API, which are created using resource Manager?

根据 Virtual Machine REST, you can get the list of all VMs in a resource group using the REST API that need to authenticate Azure Resource Manager requests in the common parameters and headers 的 Azure 参考。

下面是使用 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();