Terraform模块调用双azurerm provider时中国区订阅找不到报错如何解决
Azure双云环境Terraform配置修复方案
问题根因
你的配置存在三处核心错误导致中国区订阅识别失败:
- 资源与provider类型不匹配:
kubernetes_namespace属于kubernetes provider资源,你错误绑定了azurerm.sub2作为provider,导致上下文串用 - 默认azurerm provider未显式指定环境和认证参数,运行时可能错误继承中国区订阅ID去国际区Azure API请求,导致404
- 子模块provider传递写法不符合Terraform规范,别名provider映射错误
- 中国区认证凭据可能不匹配:Azure中国与国际区租户、服务主体完全隔离,不能混用凭据
具体修正步骤
- 修正K8s资源的provider关联
删除kubernetes_namespace资源中provider = azurerm.sub2的错误配置,单独为两个环境配置独立的kubernetes provider:
- 修正K8s资源的provider关联
# 国际区K8s provider provider "kubernetes" { alias = "global" config_path = "./kubeconfig_global" # 替换为国际区AKS的kubeconfig路径 } # 中国区K8s provider provider "kubernetes" { alias = "cn" config_path = "./kubeconfig_cn" # 替换为中国区AKS的kubeconfig路径 }
中国区命名空间资源显式指定provider即可:provider = kubernetes.cn
- 补全双azurerm provider的全量参数,避免上下文继承歧义
# 国际区默认provider provider "azurerm" { features {} environment = "public" subscription_id = "你的国际区订阅ID" tenant_id = "你的国际区租户ID" client_id = "国际区服务主体ID" client_secret = var.global_client_secret } # 中国区别名provider provider "azurerm" { features {} alias = "sub2" environment = "china" subscription_id = "你的中国区订阅ID" client_id = "中国区服务主体ID" client_secret = var.cn_client_secret tenant_id = "中国区租户ID" }
注意:中国区的服务主体必须在Azure中国门户创建,不能使用国际区的服务主体访问中国区订阅。可以提前用az cli验证凭据有效性:
az cloud set --name AzureChinaCloud az login --service-principal -u <中国区client_id> -p <中国区client_secret> --tenant <中国区tenant_id> az account show确认能正常返回订阅信息再运行Terraform。
- 修正子模块provider传递逻辑
首先在子模块namespace的根目录下的main.tf顶部声明需要的别名provider:
- 修正子模块provider传递逻辑
terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = "=2.78.0" } azurerm = { source = "hashicorp/azurerm" version = "=2.78.0" alias = "cn" } } }
根模块调用子模块时修正provider映射:
module "helm_ns_creation" { source = "./namespace/" providers = { azurerm = azurerm azurerm.cn = azurerm.sub2 } applications = var.applications geo = var.geo ns_values = ["${file("../namespace/values.yaml")}"] }
- 保持现有角色分配的provider关联即可
你当前custom_cn/builtin_cn角色分配已绑定azurerm.sub2,custom/builtin绑定默认国际区provider,逻辑正确不需要修改。
- 保持现有角色分配的provider关联即可
内容的提问来源于stack exchange,提问作者pk_dhruv
相关产品推荐
相关产品推荐

