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

使用for_each创建多实例模块后,Terraform输出引用报错问题

解决Terraform ECS模块for_each实例动态引用问题

当你用for_each创建模块实例后,module.container_definition_sidecar不再是单个模块对象,而是一个键值对映射(map),键是你for_each使用的标识符,值是对应模块实例。这就是为什么用列表遍历符[*]会报错“Unsupported attribute”——[*]只能用于列表或集合类型,不能直接作用于map。

动态获取所有sidecar容器定义的方法

不需要手动指定实例键,用values()函数把map类型的模块实例转换成列表,再提取每个实例的json_map_object输出即可:

resource "aws_ecs_task_definition" "main" {
  family                   = "my-task"
  network_mode             = "awsvpc"
  requires_compatibilities = ["FARGATE"]
  cpu                      = "256"
  memory                   = "512"

  container_definitions = jsonencode(
    concat(
      # 主容器定义
      [module.main_container.json_map_object],
      # 所有sidecar容器定义,自动遍历for_each创建的实例
      values(module.container_definition_sidecar)[*].json_map_object
    )
  )
}

原理说明

  • values(module.container_definition_sidecar):将模块实例的map转换为包含所有模块对象的列表,自动忽略for_each的键名。
  • [*].json_map_object:对列表中的每个模块实例,提取其json_map_object输出,最终得到一个包含所有sidecar容器定义的列表。
  • concat():把主容器和所有sidecar的容器定义合并成一个列表,再用jsonencode()转换成ECS要求的JSON字符串。

这种方式完全不需要依赖ecs-service模块的sidecars变量,直接从已创建的模块实例中动态收集所需输出。

内容的提问来源于stack exchange,提问作者Michael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:50:27