如何使用 java sdk 基于自定义 VM 映像创建 Azure 批处理池

how to create azure batch pool based on custom VM image using java sdk

我想使用我通过批处理作业创建的自定义 ubuntu VM 映像。我可以通过从 azure 门户本身选择自定义图像来创建一个新池,但我想使用 azure batch java sdk 编写构建脚本来执行相同的操作。这是我能够想出的:

List<NodeAgentSku> skus = client.accountOperations().listNodeAgentSkus().findAll({ it.osType() == OSType.LINUX })
String skuId = null
ImageReference imageRef = new ImageReference().withVirtualMachineImageId('/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.Compute/images/$CUSTOM_VM_IMAGE_NAME')

for (NodeAgentSku sku : skus) {
    for (ImageReference imgRef : sku.verifiedImageReferences()) {
        if (imgRef.publisher().equalsIgnoreCase(osPublisher) && imgRef.offer().equalsIgnoreCase(osOffer) && imgRef.sku() == '18.04-LTS') {
            skuId = sku.id()
            break
        }
    }
}

VirtualMachineConfiguration configuration = new VirtualMachineConfiguration()
configuration.withNodeAgentSKUId(skuId).withImageReference(imageRef)
client.poolOperations().createPool(poolId, poolVMSize, configuration, poolVMCount)

但我遇到异常:

Caused by: com.microsoft.azure.batch.protocol.models.BatchErrorException: Status code 403, {
  "odata.metadata":"https://analyticsbatch.eastus.batch.azure.com/$metadata#Microsoft.Azure.Batch.Protocol.Entities.Container.errors/@Element","code":"AuthenticationFailed","message":{
    "lang":"en-US","value":"Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.\nRequestId:bf9bf7fd-2ef5-497b-867c-858d081137e6\nTime:2019-04-17T23:08:17.7144177Z"
  },"values":[
    {
      "key":"AuthenticationErrorDetail","value":"The specified type of authentication SharedKey is not allowed when external resources of type Compute are linked."
    }
  ]
}

我绝对认为我获取 skuId 的方式是错误的。由于 client.accountOperations().listNodeAgentSkus() 没有列出自定义图像,我只是想根据我用来创建自定义图像的 ubuntu 版本提供 skuId。

那么使用 java sdk 为 Azure 批处理帐户使用自定义 VM 映像创建池的正确方法是什么?

如错误所示,您需要先向 Azure 进行身份验证,然后您可以根据需要使用自定义映像创建池。

首先,您需要一个 Azure Batch 帐户,您可以在 Azure 门户中或使用 Azure CLI 创建它。或者您也可以通过Java创建批量账号。参见 Manage the Azure Batch Account through Java

那我想你还需要对你的批处理帐户进行身份验证。有以下两种方式:

  • 使用帐户名、密钥和 URL 创建一个 BatchSharedKeyCredentials 实例,用于使用 Azure Batch 服务进行身份验证。 BatchClient class 是创建 Azure Batch 对象并与之交互的最简单入口点。

    BatchSharedKeyCredentials cred = new BatchSharedKeyCredentials(batchUri, batchAccount, batchKey); BatchClient client = BatchClient.open(cred);

  • 另一种方法是使用 AAD (Azure Active Directory) 身份验证来创建客户端。有关详细信息,请参阅此 document

    BatchApplicationTokenCredentials cred = new BatchApplicationTokenCredentials(batchEndpoint, clientId, applicationSecret, applicationDomain, null, null); BatchClient client = BatchClient.open(cred);

然后您可以根据需要创建具有自定义的池。就像这样:

System.out.println("Created a pool using an Azure Marketplace image.");

VirtualMachineConfiguration configuration = new VirtualMachineConfiguration();
configuration.withNodeAgentSKUId(skuId).withImageReference(imageRef);
client.poolOperations().createPool(poolId, poolVMSize, configuration, poolVMCount);

System.out.println("Created a Pool: " + poolId);

有关详细信息,请参阅 Azure Batch Libraries for Java

您必须使用 Azure Active Directory 凭据才能使用自定义图像创建池。它位于 Batch Custom Image doc.

的先决条件部分

这是一个常见问题:

  1. Azure Batch Pool: How do I use a custom VM Image via Python?