如何使用Java SDK创建基于自定义VM映像的Azure批处理池

时间:2019-04-17 23:15:07

标签: azure azure-batch

我想使用按批处理作业创建的自定义ubuntu VM映像。我可以通过从azure门户网站本身选择自定义映像来创建新池,但是我想编写构建脚本以使用azure批处理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映像创建池的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

必须使用Azure Active Directory凭据才能创建具有自定义映像的池。它位于Batch Custom Image doc的先决条件部分。

这是一个常见问题:

  1. Custom Image under AzureBatch ImageReference class not working
  2. Azure Batch Pool: How do I use a custom VM Image via Python?

答案 1 :(得分:1)

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

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

然后,我认为您还需要验证您的批处理帐户。有以下两种方法:

  • 使用帐户名,密钥和URL创建一个BatchSharedKeyCredentials实例,以使用Azure Batch服务进行身份验证。 BatchClient类是创建和与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