Terraform中传递`aws=aws.stg`与`aws.stg=aws.stg`的配置差异
两种AWS Provider传递方式的差异解析
先看现有配置背景:
配置文件说明
根模块 providers.tf
provider "aws" { region = "ap-northeast-1" allowed_account_ids = [local.one_account_id] } provider "aws" { alias = "stg" region = "us-east-1" allowed_account_ids = [local.one_account_id] }
模块调用文件 base/one.tf
方式一(部署到us-east-1):
module "one" { source = "../../modules/one" providers = { aws = aws.stg } resource_name_prefix = local.xxxx }
方式二(部署到ap-northeast-1):
module "one" { source = "../../modules/one" providers = { aws.stg = aws.stg } resource_name_prefix = local.xxxxx }
子模块 module/one.tf
terraform { required_providers { aws = { source = "hashicorp/aws" version = "4.20.1" # configuration_aliases = [aws.stg] } null = { source = "hashicorp/null" version = ">= 3.1.1" } } }
核心差异说明
1. aws = aws.stg:直接替换子模块默认Provider
这种写法是把根模块里别名stg的AWS Provider(对应us-east-1区域),赋值给子模块的默认AWS Provider(也就是子模块中不带别名的aws)。
- 子模块里所有没指定
provider参数的AWS资源,都会直接用这个us-east-1的Provider,完全替代了原本会继承的根模块默认Provider(ap-northeast-1),所以资源会部署到us-east-1。
2. aws.stg = aws.stg:无效的别名传递
这种写法试图把根模块的aws.stg传递给子模块的aws.stg别名Provider,但子模块的required_providers里注释掉了configuration_aliases = [aws.stg]——这意味着子模块根本没定义这个别名Provider。
- 这个传递操作完全不生效,子模块的AWS资源还是会默认继承根模块的默认Provider(ap-northeast-1),所以资源会部署到这个区域。
- 如果要让这个传递生效,必须取消子模块中
configuration_aliases = [aws.stg]的注释,之后子模块里的资源可以通过provider = aws.stg来指定使用这个us-east-1的Provider。
内容的提问来源于stack exchange,提问作者Jatin Mehrotra
相关产品推荐
相关产品推荐

