Terraform用for_each创建的子网绑定EC2报id属性不存在如何解决
错误根因
你通过for_each创建的aws_subnet.Private资源集合是映射(Map)结构,而[*] splat运算符仅适用于用count创建的列表/元组类型资源集合,因此无法通过aws_subnet.Private[*].id直接提取所有子网ID,触发属性不存在报错。
解决方法
修改EC2资源中subnet_id的取值逻辑即可,常用两种方案:
方案1:将映射转列表后按索引取值(适配你当前用count创建EC2的场景)
把subnet_id行替换为以下代码:
subnet_id = element(values(aws_subnet.Private)[*].id, count.index)
values()函数会把for_each生成的资源映射转为资源列表,之后就可以用splat运算符提取所有子网ID,再配合element按索引取值。
方案2:直接指定子网AZ取值(适合固定EC2部署在指定AZ的场景)
如果你不需要按索引动态选子网,也可以直接指定子网对应的AZ键名取值:
subnet_id = aws_subnet.Private["eu-west-1a"].id
修改完成后执行terraform plan验证,无报错后再执行apply即可正常部署。
内容的提问来源于stack exchange,提问作者Gaddenna NK
相关产品推荐
相关产品推荐

