Terraform用for_each调用模块时如何逐个创建aws_servicecatalog_provisioned_product资源
实现Terraform for_each资源串行创建的方法
Terraform默认对无依赖关系的独立资源会并行执行创建操作,for_each生成的多个模块/资源实例默认没有关联依赖,所以会并行创建。要实现逐个串行创建,核心是给每个实例添加对序列中前一个实例的显式/隐式依赖。
具体实现步骤
- 先将待遍历的对象列表转换为带索引的映射结构,方便关联前后实例
- 通过显式
depends_on或者隐式属性引用,给每个实例添加对前一个实例的依赖,强制Terraform等待前序实例创建完成再执行当前实例操作
代码示例
1. 根目录预处理遍历列表
variable "provisioned_products" { type = list(object({ name = string # 其他你需要的自定义参数 })) } # 把列表转成带数字索引的映射,适配for_each使用 locals { products_map = { for idx, item in var.provisioned_products : idx => item } }
2. 调用模块时添加前序依赖
如果你的Terraform版本支持在depends_on中使用动态表达式,可以直接用显式依赖:
module "servicecatalog_product" { for_each = local.products_map source = "./modules/你的服务目录模块路径" # 传入业务所需参数 product_name = each.value.name # 其他参数... # 非第一个实例依赖前一个实例完成创建 depends_on = [ each.key > 0 ? module.servicecatalog_product[each.key - 1] : null ] }
如果Terraform版本不支持动态depends_on,可以改用隐式依赖实现:
module "servicecatalog_product" { for_each = local.products_map source = "./modules/你的服务目录模块路径" product_name = each.value.name # 其他参数... # 新增占位参数,模块内不需要实际使用该参数,仅用于触发隐式依赖 previous_product_id = each.key > 0 ? module.servicecatalog_product[each.key - 1].id : "" }
注意事项
- 该方案适合资源数量较少的场景,列表过长会大幅提升部署耗时
- 由于
aws_servicecatalog_provisioned_product的创建是AWS侧异步执行的,建议在模块内添加time_sleep或者状态校验逻辑,确认上一个实例确实进入可用状态后再启动下一个创建,避免依赖不生效
内容的提问来源于stack exchange,提问作者Dani Wol.
相关产品推荐
相关产品推荐

