Terraform:如何从for_each资源集合提取属性及类型判定
Terraform资源集合数据提取问题解答
先看原配置示例:
resource "aws_instance" "web" { for_each = {for k,v in var.input_var: k => v if v.enabled} name = each.key ami = each.value.ami instance_type = each.value.instance_type } resource "aws_db_instance" "db" { for_each = var.another_map aws_instance_id = aws_instance.web[index(aws_instance.web[*].name, each.value.name)].id }
问题1:aws_instance.web的类型是什么?
aws_instance.web是对象映射(Map of Objects)。因为你在for_each中使用了映射类型的表达式({for k,v in var.input_var: k => v if v.enabled}生成键值对集合),Terraform会为映射中的每个键创建对应的aws_instance对象,最终aws_instance.web就是以原表达式的键为索引、对应EC2实例对象为值的映射结构。
问题2:匹配元素并提取id属性的正确语法是什么?
根据你的配置特点,aws_instance.web中每个实例的name属性等于它在映射中的键(name = each.key),且name唯一,最简洁高效的写法是直接通过键访问:
aws_instance.web[each.value.name].id
如果后续name和映射键不再绑定,也可以通过for表达式构建一个以name为索引的新映射实现匹配:
{ for inst in aws_instance.web : inst.name => inst }[each.value.name].id
这个表达式会遍历所有EC2实例,生成name到实例对象的映射,再通过目标name取出对应实例的id。
内容的提问来源于stack exchange,提问作者codiac
相关产品推荐
相关产品推荐

