如何避免Azure APIM订阅主键被Terraform修改?
解决方案:手动指定Azure APIM订阅主键避免部署时变更
核心问题原因
Azure APIM的订阅资源在Terraform中,若仅设置primary_key而未显式指定secondary_key,Terraform会自动生成一个secondary_key,且每次执行apply时可能触发资源更新;另外,若Terraform状态文件记录的键值与Azure端实际值存在差异,也会导致主键被重新生成。
具体修复步骤
1. 同时显式配置primary_key和secondary_key
修改azurerm_api_management_subscription资源定义,同时指定primary_key和secondary_key,确保两者都使用固定的现有值:
resource "azurerm_api_management_subscription" "test" { api_management_name = upper("${lower(local.apim_name)}") resource_group_name = var.resource_group_name user_id = azurerm_api_management_user.test.id product_id = data.azurerm_api_management_product.crm.id display_name = "testCRM" state = "active" primary_key = var.crm_subscription_key secondary_key = var.crm_subscription_secondary_key # 新增配置 depends_on = [ azurerm_api_management_user.test, module.api_product_xxx ] }
对应的变量补充定义:
variable "crm_subscription_key" { default = "your-existing-primary-key" sensitive = true } variable "crm_subscription_secondary_key" { default = "your-existing-secondary-key" sensitive = true }
2. 同步Terraform状态与Azure实际资源
如果之前已部署过该资源,需先将Azure端的实际主键值同步到Terraform状态中,避免后续部署触发变更:
- 执行
terraform state show azurerm_api_management_subscription.test查看当前状态记录的键值 - 若状态值与Azure端实际值不一致,执行
terraform state rm azurerm_api_management_subscription.test删除现有状态记录 - 执行导入命令将Azure端现有订阅资源导入状态:
替换命令中terraform import azurerm_api_management_subscription.test "/subscriptions/<your-sub-id>/resourceGroups/<rg-name>/providers/Microsoft.ApiManagement/service/<apim-name>/subscriptions/<subscription-name-or-id>"<>内的实际参数(订阅名称或ID可在Azure门户APIM的订阅页面获取) - 执行
terraform plan确认无变更提示
3. 确保无自动生成逻辑
只要显式指定了primary_key和secondary_key,Terraform就不会自动生成新的键值,避免部署时的意外变更。
验证方式
完成配置调整后执行terraform plan,若输出显示No changes. Your infrastructure matches the configuration.,则说明配置生效,后续部署不会再修改主键。
内容的提问来源于stack exchange,提问作者Sudhir Goswami
相关产品推荐
相关产品推荐

