使用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
相关产品推荐
相关产品推荐

