Terraform逐子网部署EC2实例报无法访问原始string类型属性错误
报错根因
- 你使用的v3.12.0版本terraform-aws-modules/vpc/aws模块,
module.vpc.public_subnets输出本身就是公有子网ID组成的字符串元组,每个元素就是可直接引用的子网ID字符串,并非带id属性的对象列表。你在引用时追加.id,本质是尝试在字符串类型值上访问属性,因此触发类型错误。 - 现有VPC配置存在一处隐患:
azs = [var.azs]的写法会把var.azs整体作为列表的单个元素,如果var.azs本身是存储多个可用区的列表类型,会生成嵌套列表,和模块期望的参数类型不匹配,后续还会触发计数、映射类错误。
配置调整步骤
- 修正VPC模块的可用区配置,去掉多余的方括号:
azs = var.azs
- 修正EC2资源块的配置,去掉子网ID引用处多余的
.id后缀,同时建议count参数直接对齐公有子网的实际数量,避免索引越界:
resource "aws_instance" "bastion" { count = length(module.vpc.public_subnets) ami = var.instance_ami key_name = aws_key_pair.bastion_auth.id instance_type = var.instance_type security_groups = [aws_security_group.bastion-sg.id] associate_public_ip_address = true subnet_id = module.vpc.public_subnets[count.index] user_data = file("userdata.tpl") root_block_device { volume_size = var.main_vol_size } tags = { Name = "${var.name}-bastion-host-${count.index + 1}" } }
调整后重新执行terraform plan即可看到3台EC2实例会分别关联到3个公有子网,不会再出现类型报错。
内容的提问来源于stack exchange,提问作者MP32
相关产品推荐
相关产品推荐

