You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:53:10