如何使用SharedKey授权调用Azure Batch REST API创建任务
前置准备确认
先确认你手里已经有以下信息,不需要额外做其他前置配置:
- Batch账户名称、所在区域代码(比如eastasia、chinanorth3)
- Batch账户的访问密钥(Azure门户进入Batch账户,在「密钥」菜单可复制主密钥或辅助密钥,任意一个可用,建议存在ADF关联的Key Vault中引用,不要硬编码)
- 已存在的目标作业ID:
TestBatchJob
SharedKey授权核心规则
Azure Batch的SharedKey授权不是直接传密钥,必须按官方规则生成签名放到Authorization头里,规则如下:
授权头固定格式为
SharedKey <Batch账户名>:<签名值>,其中签名值是用账户访问密钥,对规范化请求字符串做HMAC-SHA256哈希后转Base64字符串得到的。
待签名的规范化字符串必须严格按以下顺序拼接,每部分结尾加换行符\n,无值的位置直接留空行,少一个空行都会直接返回403:
- HTTP请求方法,创建任务用
POST - Content-Encoding头值,无则留空
- Content-Language头值,无则留空
- Content-Length头值,无则留空
- Content-MD5头值,无则留空
- Content-Type头值,固定用
application/json; odata=minimalmetadata - Date头值,无则留空(Batch统一用ocp-date传时间,这里直接留空)
- If-Modified-Since头值,无则留空
- If-Match头值,无则留空
- If-None-Match头值,无则留空
- If-Unmodified-Since头值,无则留空
- Range头值,无则留空
- 所有以
ocp-开头的自定义头按字典序排列,这里只需要传ocp-date,值为GMT格式的当前时间,和请求头里传的ocp-date必须完全一致,时间偏差不能超过15分钟 - 规范化资源路径,格式为
/<Batch账户名>/jobs/TestBatchJob/tasks?api-version=<API版本号>,查询参数按字典序排列,这里固定用稳定版API2023-05-01.17.0即可
ADF管道配置步骤
全程用ADF内置活动实现,不需要自定义代码:
步骤1:初始化基础变量
拖入「设置变量」活动,创建以下字符串类型变量:
batchAccountName:值填你的Batch账户名batchRegion:值填Batch账户所在区域代码batchAccountKey:值引用Key Vault中存储的Batch账户访问密钥jobId:值填TestBatchJobapiVersion:值固定填2023-05-01.17.0gmtTime:值填表达式@utcNow('r'),直接生成符合要求的RFC1123格式GMT时间
步骤2:生成授权头
再拖入一个「设置变量」活动,创建变量authHeader,值填以下表达式,自动生成符合规则的签名和授权头:
@concat( 'SharedKey ', variables('batchAccountName'), ':', base64( hmac( base64ToString(variables('batchAccountKey')), concat( 'POST\n','\n','\n','\n','\n', 'application/json; odata=minimalmetadata\n', '\n','\n','\n','\n','\n','\n', concat('ocp-date:', variables('gmtTime'), '\n'), concat('/', variables('batchAccountName'), '/jobs/', variables('jobId'), '/tasks?api-version=', variables('apiVersion')) ), 'SHA256' ) ) )
步骤3:配置Web活动调用API
拖入「Web」活动,按以下参数配置:
- URL:
https://@{variables('batchAccountName')}.@{variables('batchRegion')}.batch.azure.com/jobs/@{variables('jobId')}/tasks?api-version=@{variables('apiVersion')} - 请求方法:
POST - 请求头添加3个键值对:
Content-Type:application/json; odata=minimalmetadataocp-date:@variables('gmtTime')Authorization:@variables('authHeader')
- 请求正文填任务的配置JSON,基础示例如下:
{ "id": "test-task-001", "commandLine": "/bin/bash -c 'echo Hello Azure Batch'", "userIdentity": { "autoUser": { "scope": "pool", "elevationLevel": "nonadmin" } } }
如果要调用你已经绑定的应用程序包,在正文里添加applicationPackageReferences字段,指定包ID和版本号即可。注意同一个作业下任务ID不能重复,重复会返回409冲突。
常见问题排查
- 返回403:优先检查签名拼接时有没有少空行、资源路径是否和请求URL完全匹配、ocp-date时间是否和签名中用的时间一致、账户密钥是否正确
- 返回404:检查Batch账户名、区域代码、作业ID是否拼写错误
- 返回409:更换唯一的任务ID重试即可
内容的提问来源于stack exchange,提问作者cgsabari
相关产品推荐
相关产品推荐

