如何在不同Azure APIM实例的产品中使用相同订阅密钥
跨Azure APIM实例复用订阅密钥(CLI/ARM模板+ADO自动化实现)
可以通过Azure CLI或ARM模板实现同一产品在两个APIM实例中使用相同订阅密钥的需求,下面是具体操作步骤,以及如何集成到ADO流水线自动化:
Azure CLI 实现流程
1. 在主APIM实例创建订阅并提取密钥
先创建订阅,再通过命令提取生成的主/次密钥:
# ADO流水线中建议用服务主体登录,避免交互式操作 az login --service-principal -u "${SP_CLIENT_ID}" -p "${SP_CLIENT_SECRET}" --tenant "${TENANT_ID}" # 在主APIM实例创建订阅 az apim subscription create \ --resource-group "your-main-rg" \ --service-name "your-primary-apim" \ --product-id "target-product-id" \ --name "shared-subscription" \ --owner-id "user-or-sp-object-id" # 获取订阅密钥,保存为变量 PRIMARY_KEY=$(az apim subscription show \ --resource-group "your-main-rg" \ --service-name "your-primary-apim" \ --subscription-id "shared-subscription" \ --query 'primaryKey' -o tsv) SECONDARY_KEY=$(az apim subscription show \ --resource-group "your-main-rg" \ --service-name "your-primary-apim" \ --subscription-id "shared-subscription" \ --query 'secondaryKey' -o tsv)
2. 在辅APIM实例创建带指定密钥的订阅
Azure APIM支持在创建订阅时自定义主/次密钥,直接复用主实例的密钥即可:
az apim subscription create \ --resource-group "your-secondary-rg" \ --service-name "your-secondary-apim" \ --product-id "target-product-id" \ --name "shared-subscription" \ --owner-id "user-or-sp-object-id" \ --primary-key "${PRIMARY_KEY}" \ --secondary-key "${SECONDARY_KEY}"
ARM模板实现流程
1. 主APIM订阅创建模板(含密钥输出)
部署此模板创建主实例的订阅,并输出密钥供后续使用:
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "apimServiceName": { "type": "string", "metadata": { "description": "主APIM实例名称" } }, "productId": { "type": "string", "metadata": { "description": "目标产品ID" } }, "subscriptionName": { "type": "string", "metadata": { "description": "共享订阅名称" } }, "ownerObjectId": { "type": "string", "metadata": { "description": "订阅所有者的Object ID" } } }, "resources": [ { "type": "Microsoft.ApiManagement/service/subscriptions", "apiVersion": "2022-08-01", "name": "[concat(parameters('apimServiceName'), '/', parameters('subscriptionName'))]", "properties": { "productId": "[concat('/products/', parameters('productId'))]", "ownerId": "[concat('/users/', parameters('ownerObjectId'))]", "displayName": "[parameters('subscriptionName')]" } } ], "outputs": { "primaryKey": { "type": "string", "value": "[reference(resourceId('Microsoft.ApiManagement/service/subscriptions', parameters('apimServiceName'), parameters('subscriptionName'))).primaryKey]" }, "secondaryKey": { "type": "string", "value": "[reference(resourceId('Microsoft.ApiManagement/service/subscriptions', parameters('apimServiceName'), parameters('subscriptionName'))).secondaryKey]" } } }
2. 辅APIM订阅复用密钥模板
将主模板输出的密钥作为参数传入,创建与主实例密钥一致的订阅:
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "apimServiceName": { "type": "string", "metadata": { "description": "辅APIM实例名称" } }, "productId": { "type": "string", "metadata": { "description": "目标产品ID(需与主实例一致)" } }, "subscriptionName": { "type": "string", "metadata": { "description": "共享订阅名称(需与主实例一致)" } }, "ownerObjectId": { "type": "string", "metadata": { "description": "订阅所有者的Object ID(需与主实例一致)" } }, "primaryKey": { "type": "string", "metadata": { "description": "主实例生成的订阅主键" } }, "secondaryKey": { "type": "string", "metadata": { "description": "主实例生成的订阅次键" } } }, "resources": [ { "type": "Microsoft.ApiManagement/service/subscriptions", "apiVersion": "2022-08-01", "name": "[concat(parameters('apimServiceName'), '/', parameters('subscriptionName'))]", "properties": { "productId": "[concat('/products/', parameters('productId'))]", "ownerId": "[concat('/users/', parameters('ownerObjectId'))]", "displayName": "[parameters('subscriptionName')]", "primaryKey": "[parameters('primaryKey')]", "secondaryKey": "[parameters('secondaryKey')]" } } ] }
ADO流水线自动化要点
- 权限配置:确保流水线使用的服务主体拥有两个APIM实例所在资源组的
Microsoft.ApiManagement/service/subscriptions/write权限。 - CLI任务集成:添加两个Azure CLI任务,第一个执行主APIM订阅创建和密钥提取,将密钥存入流水线秘密变量;第二个任务读取变量,执行辅APIM订阅创建。
- ARM模板集成:先用"Azure Resource Group Deployment"任务部署主模板,捕获输出的密钥变量;再部署辅模板,将密钥作为参数传入。
- 安全注意:所有密钥变量需标记为ADO秘密变量,避免明文泄露。
关键注意事项
- 两个APIM实例中的目标产品ID必须完全一致,否则订阅无法关联产品。
- 订阅名称、所有者ID建议保持一致,便于管理和后续切换。
内容的提问来源于stack exchange,提问作者Vowneee
相关产品推荐
相关产品推荐

