Terraform中无需逐个指定索引批量引用count创建的多资源的方法
解决方案
你可以通过Terraform的splat表达式快速批量提取所有count创建的资源的指定属性,无需逐个指定索引,写法如下:
subnets = aws_subnet.private[*].id
这个表达式会自动遍历aws_subnet.private的所有实例,提取每个实例的id属性,生成和你手动逐个写索引完全一致的ID列表,后续你修改private_subnets变量增减子网时,引用部分不需要做任何调整。
其他可选用法
- 如果你使用的是Terraform 0.11及更早版本,也可以用旧版splat语法:
aws_subnet.private.*.id - 如果你需要对子网做额外过滤、转换操作,可以用for表达式实现,效果和splat一致,灵活度更高:
subnets = [ for subnet in aws_subnet.private : subnet.id ]
之前配置不生效的原因
你之前在ECS配置中直接用count/element不生效,是因为count.index只有在定义了count参数的资源块内部才存在上下文,其他资源的参数中没有这个内置变量,自然无法识别。
ECS配置完整示例
resource "aws_ecs_service" "demo" { name = "demo-service" cluster = aws_ecs_cluster.demo.id task_definition = aws_ecs_task_definition.demo.arn desired_count = 3 network_configuration { # 直接用splat批量引用子网ID即可 subnets = aws_subnet.private[*].id security_groups = [aws_security_group.ecs_task.id] assign_public_ip = false } }
内容的提问来源于stack exchange,提问作者cashman04
相关产品推荐
相关产品推荐

