如何在Terraform中循环创建存在依赖的Azure Logic App动作?
问题描述
我的Azure Logic App中有10余个动作,因内容较长(超1000行),我将动作定义存储在JSON文件中。
多数动作之间存在依赖关系,因此需要按特定顺序创建动作以避免Terraform执行失败。我知道可以创建多个azurerm_logic_app_action_custom资源并使用depends_on参数,但这会产生大量重复代码。
我想了解是否可通过for_each或count循环来创建这些动作,以避免代码重复。我尝试过for_each和count,但问题在于depends_on不支持动态资源名称。
更新#1
resource "azurerm_logic_app_action_custom" "this" { for_each = local.actions name = each.key logic_app_id = azurerm_logic_app_workflow.this.id body = jsonencode(each.value) depends_on = [ // 这里需要传入当前动作依赖的其他Logic App动作,或许可以用runAfter属性里的动作 ] }
解决方案
可以通过解析每个动作runAfter属性中的依赖关系,动态生成depends_on列表,具体实现步骤如下:
- 确保JSON动作定义包含
runAfter字段
每个动作的JSON定义里要明确标注依赖的前置动作名称,示例格式:
{ "action1": { "type": "xxx", "runAfter": {} }, "action2": { "type": "xxx", "runAfter": { "action1": ["Succeeded"] } } }
- 动态生成
depends_on依赖列表
利用Terraform的for表达式,遍历当前动作runAfter中的所有依赖动作名称,映射到对应的资源实例:
resource "azurerm_logic_app_action_custom" "this" { for_each = local.actions name = each.key logic_app_id = azurerm_logic_app_workflow.this.id body = jsonencode(each.value) // 从runAfter中提取依赖动作名称,动态生成depends_on列表 depends_on = [ for dep_name in keys(each.value.runAfter) : azurerm_logic_app_action_custom.this[dep_name] ] }
- 关键注意事项
- 确保
local.actions是映射(map)类型,键为动作名称,值为包含runAfter字段的动作定义; - 检查并避免循环依赖:如果动作A依赖动作B,动作B又依赖动作A,Terraform会直接报错;
- 无依赖的动作
runAfter为空,keys()会返回空列表,depends_on自动为空,符合预期逻辑。
这种方式既通过for_each实现了批量创建动作,又自动处理了所有依赖关系,彻底避免重复代码。
内容的提问来源于stack exchange,提问作者cahitihac
相关产品推荐
相关产品推荐

