Terraform多AWS区域别名Provider迁移:状态文件配置疑问
问题解答
正确的状态文件Provider字段值
对于module.provider_us-east-1模块内的aws_instance.name_of_aws_instance资源,其在terraform.tfstate中的provider字段应设置为:
module.provider_us-east-1.provider["registry.terraform.io/hashicorp/aws"]
原因说明
你的配置存在冲突:模块内部资源显式指定provider = aws.us-east-1,同时又通过模块的providers块将根模块的aws.us-east-1别名Provider传递给模块的默认AWS Provider。这种情况下,Terraform会将模块内资源与模块级别的默认Provider绑定,而非直接绑定根模块的别名Provider。
正确的模块内资源配置应移除显式的provider指定,让资源使用模块继承的默认Provider:
# ./us-east-1/ec2.tf resource "aws_instance" "name_of_aws_instance" { # 移除 provider = aws.us-east-1 ... }
修正步骤
- 修改模块内资源配置,删除
provider = aws.us-east-1行; - 编辑
terraform.tfstate,将目标资源的provider字段替换为module.provider_us-east-1.provider["registry.terraform.io/hashicorp/aws"]; - 执行
terraform validate验证配置,确认无报错; - 运行
terraform plan确认状态与配置匹配,无额外变更。
补充说明
若你坚持在模块内部直接引用根模块的别名Provider(不推荐,会降低模块可移植性),则状态文件中的provider字段应设置为:
provider["registry.terraform.io/hashicorp/aws"].us-east-1
但此时需要删除模块定义中的providers块,避免Provider绑定冲突。
内容的提问来源于stack exchange,提问作者Neil
相关产品推荐
相关产品推荐

