Terraform调用模块传入provider报不支持参数错误如何解决
问题原因
你收到的报错是因为provider不属于模块的普通输入参数,Terraform有专门的provider传递语法,不能直接在模块参数列表中传递。
正确配置步骤
- 第一步:在子模块中声明依赖的provider
在networking/main.tf的头部添加如下配置,声明模块需要用到aws provider即可,不需要用variable块声明provider相关变量,provider是Terraform的特殊对象,走专门的传递逻辑:
terraform { required_providers { aws = { source = "hashicorp/aws" version = ">= 4.0" # 可根据你的实际需求调整版本范围 } } }
- 第二步:修改根模块的模块调用语法
把原模块调用中写在普通参数里的provider = aws.first移到专门的providers映射块中,修改后的根模块调用配置如下:
module "networking" { source = "./networking" # 保留原来所有的普通参数不变 vpc_cidr = local.vpc_cidr1 access_ip = var.access_ip security_groups = local.security_groups public_sn_count = 2 private_sn_count = 3 max_subnets = 20 public_cidrs = [for i in range(2, 255, 2) : cidrsubnet(local.vpc_cidr1, 8, i)] private_cidrs = [for i in range(1, 255, 2) : cidrsubnet(local.vpc_cidr1, 8, i)] nat_gw_eip_count = 0 nat_gw_count = 0 # 添加专门的providers映射块 providers = { aws = aws.first } }
多provider传递扩展(适配多账号多区域部署TGW的需求)
如果后续需要给模块传递多个aws provider(比如跨账号关联TGW需要同时用到两个账号的provider),可以按以下方式配置:
- 在子模块的
required_providers块中声明带alias的provider:
terraform { required_providers { aws = { source = "hashicorp/aws" version = ">= 4.0" } aws.second = { source = "hashicorp/aws" version = ">= 4.0" } } }
- 根模块调用时传入对应provider即可:
module "networking" { source = "./networking" # 其他普通参数省略 providers = { aws = aws.first aws.second = aws.second } }
额外优化建议
根目录的terraform块建议补充required_providers配置,统一锁定aws provider版本,避免多环境运行出现版本不一致的问题:
terraform { required_version = ">= 0.12" required_providers { aws = { source = "hashicorp/aws" version = ">= 4.0" # 和子模块版本范围保持一致即可 } } }
内容的提问来源于stack exchange,提问作者JonBot
相关产品推荐
相关产品推荐

