使用Terraform ec2-instance模块创建多EC2实例,如何单输出块获实例ID?
问题:通过单个Output块获取批量创建的EC2实例ID
使用Terraform的terraform-aws-modules/ec2-instance/aws模块(版本5.5.0)批量创建2台EC2实例时,期望通过单个output块获取所有实例ID,当前配置如下:
locals { app = { instance1 = { name = "instance1" az = "eu-west-1a" } instance2 = { name = "instance2" az = "eu-west-1c" } } } module "ec2-instance" { for_each = local.app source = "terraform-aws-modules/ec2-instance/aws" version = "5.5.0" name = each.value.name availability_zone = each.value.az } output "ids_of_instances" { value = module.ec2-instance[*].id }
执行时触发如下错误:
Error: Unsupported attribute
│
│ on main.tf line 96, in output "ids_of_instances":
│ 96: value = module.ec2-instance[*].id
│
│ This object does not have an attribute named "id".
虽然可以通过多个output块分别输出实例ID:
output "instance1" { value = module.ec2-instance["instance1"].id } output "instance2" { value = module.ec2-instance["instance2"].id }
但需求是通过单个output块实现,解决思路如下:
核心原因
使用for_each迭代创建模块实例时,module.ec2-instance是**映射(Map)**类型,而非列表(List),因此不能直接使用列表遍历的[*]语法。
解决方法
方法1:输出实例ID列表
用values()函数将映射的所有值提取为列表,再批量提取id属性:
output "ids_of_instances" { value = values(module.ec2-instance)[*].id }
执行后输出示例:
ids_of_instances = [ "i-0abc123def456", "i-0xyz789uvw012", ]
方法2:输出带实例名称的ID映射
如果需要保留实例名称与ID的对应关系,用for表达式构建键值对映射:
output "ids_of_instances" { value = { for instance_key, instance in module.ec2-instance : instance_key => instance.id } }
执行后输出示例:
ids_of_instances = { "instance1" = "i-0abc123def456" "instance2" = "i-0xyz789uvw012" }
内容的提问来源于stack exchange,提问作者elmario-nc
相关产品推荐
相关产品推荐

