Logic Apps ワークフローのアクション分岐をまとめる
こんなこと書いてます
- Logic Apps は既定でワークフローは順番で実行される
- 分岐をさせる方法をまとめました
分岐方法のいくつか
Logic Apps を利用してワークフローを実行させる場合、通常であれば順に沿って実行されます。
ただし、条件を付けて「特定の曜日の場合は実行させない」などといったことを実施したいことはあると思います。
その場合にどのような方法があるかをまとめました。
以下のような方法があります。
- Conditional
- Switch
- Branches
- Loop
- Scopes
Conditional
まずは Conditional、条件です。 その名の通り、条件に合致すればxxxする、合致しなければ△△△する、といった条件分岐です。
下記の例は「注文金額が10万円以上なら承認処理を呼び出す、10万円未満なら即時処理」です。
"actions": {
"CheckAmount": {
"type": "If",
"expression": {
"greaterOrEquals": [
"@int(body('GetOrder')?['amount'])",
100000
]
},
"actions": {
"CallApproval": {
"type": "ApiConnection",
"inputs": {
"host": {
/* 承認API接続情報 */
}
}
}
},
"else": {
"actions": {
"AutoApprove": {
"type": "Compose",
"inputs": "自動承認"
}
}
}
}
}
- typeにIfを指定
- expressionで真偽を判定
- actionsにTrue時の処理、elseにFalse時の処理を記述
Switch
スイッチです。条件式に合致するかどうかを複数パターンに振り分けます。 下記の例はケースごとに新規通知・確認通知・その他通知をさせるような処理をしています。
"actions": {
"OrderStatusSwitch": {
"type": "Switch",
"expression": "@body('GetOrder')?['status']",
"cases": {
"New": {
"actions": {
"NotifyNew": {
/* 新規通知処理 */
}
}
},
"Confirmed": {
"actions": {
"NotifyConfirmed": {
/* 確認通知処理 */
}
}
}
},
"default": {
"actions": {
"NotifyUnknown": {
/* その他通知処理 */
}
}
}
}
}
- casesでキーごとに処理を定義
- defaultでどのケースにも該当しない値をハンドリング
Branches
いわゆるパラレル処理、処理を並列で走らせ、処理の高速化や非同期実行を実現させます。 下記の例は、メール送信とログ記録を同時に行わせています。
"actions": {
"SendEmail": {
"type": "Compose",
"inputs": "メール送信",
"runAfter": {
"PreviousAction": ["Succeeded"]
}
},
"LogApi": {
"type": "Http",
"inputs": {
/* ログ記録API */
},
"runAfter": {
"PreviousAction": ["Succeeded"]
}
}
}
- Logic Apps には「Parallel」タイプは存在しない
- 同じ runAfter の依存先を指定することで、複数アクションが並列実行される
- 上記の例では SendEmail と LogApi が PreviousAction の後に同時に実行される
Loop
繰り返し処理です。Loop は For each と Until の 2 種類があります。
For each
配列内にある要素を処理します。 parallel で同時実行数を調整できます。 下記の例の場合は 5 回繰り返します。
"actions": {
"ForEachItem": {
"type": "Foreach",
"foreach": "@body('GetList')",
"actions": {
"ProcessItem": {
"type": "Compose",
"inputs": "@item()"
}
},
"runtimeConfiguration": {
"concurrency": {
"repetitions": 5
}
}
}
}
- foreachで対象の配列を指定
- runtimeConfiguration.concurrency.repetitionsで同時実行数を設定
Until
条件が満たされるまで繰り返します。無限ループを防ぐためにも limit や timeout を設定するといいでしょう。
"actions": {
"UntilLoop": {
"type": "Until",
"expression": {
"equals": [
"@variables('done')",
true
]
},
"actions": {
"CheckStatus": {
/* ステータス確認処理 */
},
"Delay": {
"type": "Wait",
"inputs": {
"interval": {
"count": 10,
"unit": "Second"
}
}
}
},
"limit": {
"count": 20,
"timeout": "PT5M"
}
}
}
- limitで最大試行回数
- timeoutで全体の実行上限時間
Scopes
複数アクションをまとめて、成功・失敗時の後続処理を一括で設定します。
"actions": {
"TryScope": {
"type": "Scope",
"actions": {
"StepA": { /* 処理A */ },
"StepB": { /* 処理B */ }
}
},
"CatchScope": {
"type": "Scope",
"runAfter": { "TryScope": ["Failed"] },
"actions": {
"LogError": { /* エラーログ記録 */ },
"NotifyAdmin": { /* 管理者通知 */ }
}
},
"FinallyScope": {
"type": "Scope",
"runAfter": {
"TryScope": ["Succeeded"],
"CatchScope": ["Succeeded"]
},
"actions": {
"Cleanup": { /* 後始末処理 */ }
}
}
}
- Scopeを3つ用意してTry/Catch/Finally構成を実現
- runAfterで実行条件をまとめて指定
まとめ
改めて、それぞれの分岐方法の紹介です。
- Conditional:Ifタイプでシンプルに2択分岐
- Switch:複数ケースの振り分けに最適
- Branches:Parallelで並列実行を実現
- Loop:Foreach/Untilでバッチや条件付き繰り返し
- Scopes:Scope+RunAfterでTry/Catch/Finallyを実装
ワークフローで適切な分岐を選択することで、拡張性の高い設計が可能となります。