Terraform如何获取count创建的EC2模块实例ID并绑定到目标组
错误原因
- 通过count创建的
aws_instance.ProductionServer是列表类型的资源集合,原输出配置返回的是整个EC2资源对象的列表,列表本身没有.id属性,直接调用module.GetInstanceId.InstanceId.id会触发属性不存在报错。 for_each要求传入可遍历的map/set类型结构,直接传入列表会触发参数类型不匹配报错。
修复步骤
- 调整EC2模块的outputs.tf配置,直接输出实例ID的集合,避免返回不必要的完整资源属性:
output "instance_ids" { value = toset([for instance in aws_instance.ProductionServer : instance.id]) description = "批量创建的EC2实例ID集合" }
- 调整tgroup模块的目标组绑定配置,直接引用上述输出的ID集合作为for_each的遍历源:
resource "aws_alb_target_group_attachment" "TgProdRegister" { for_each = module.GetInstanceId.instance_ids target_group_arn = var.TgroupArn target_id = each.value port = var.TgPort }
这里可以删除冗余的
depends_on配置,Terraform会自动根据模块输出的引用关系建立隐式依赖。
可选替代方案(不推荐)
如果不想调整EC2模块的输出,也可以在tgroup模块中直接用count实现绑定,但该方式在EC2实例列表发生中间元素删除等变更时,会引发不必要的绑定资源重建:
resource "aws_alb_target_group_attachment" "TgProdRegister" { count = length(module.GetInstanceId.InstanceId) target_group_arn = var.TgroupArn target_id = module.GetInstanceId.InstanceId[count.index].id port = var.TgPort }
内容的提问来源于stack exchange,提问作者Noob ers
相关产品推荐
相关产品推荐

