在Terraform模块中批量获取子网可用区ID遇错求助
Terraform AWS RDS集群配置错误排查
问题场景与代码
我正在开发一个部署至外部声明VPC的应用模块,相关资源配置如下:
variable "vpc_id" { } data "aws_subnets" "private" { filter { name = "vpc-id" values = [data.aws_vpc.vpc.id] } filter { name = "tag:Visibility" values = ["private"] } } data "aws_subnet" "private" { for_each = toset(data.aws_subnets.private.ids) vpc_id = data.aws_vpc.vpc.id id = each.value } resource "aws_rds_cluster" "database" { availability_zones = data.aws_subnet.private.*.availability_zones }
执行terraform plan时触发错误:
│ Error: Unsupported attribute │ │ on ../../../../../appmodule/rds_postgres.tf line 23, in resource "aws_rds_cluster" "webapp": │ 23: availability_zones = data.aws_subnet.private.*.availability_zone_id │ │ This object does not have an attribute named "availability_zone_id".
环境版本:aws-provider 4.18.0、Terraform v1.1.2,查阅子网数据源文档确认存在availability_zone_id属性,请问忽略了什么明显问题?
错误原因与解决方案
核心问题:
data.aws_subnet.private是通过for_each创建的映射类型对象,Terraform 1.1.x不支持对映射使用旧式的*.列表展开语法,该语法仅适用于列表/集合类型。正确写法:使用
values()函数提取所有子网对象,结合for表达式遍历获取目标属性:resource "aws_rds_cluster" "database" { # 注意:RDS集群的availability_zones参数要求传入可用区名称(如us-east-1a),而非可用区ID(如use1-az1) # 若业务确需使用可用区ID,请先确认RDS集群参数是否支持,通常场景下使用availability_zone即可 availability_zones = [for s in values(data.aws_subnet.private) : s.availability_zone] }额外注意点:
- 属性名拼写:错误信息中使用的
availability_zone_id与初始配置中的availability_zones(多了后缀s)均存在问题,aws_subnet数据源的正确单可用区属性为availability_zone。 - 版本适配:虽然aws-provider 4.18.0确实包含
availability_zone_id属性,但for_each生成的映射对象无法用*.语法展开,必须通过values()+for表达式处理。
- 属性名拼写:错误信息中使用的
内容的提问来源于stack exchange,提问作者voxobscuro
相关产品推荐
相关产品推荐

