Azure Logic Apps を使用してワークフローでアクションを繰り返すためのループを作成する
適用対象: Azure Logic Apps (従量課金プラン + Standard)
Azure Logic Apps には、ワークフローで使用できる次のループ アクションが含まれています。
配列内の項目に対して 1 つ以上のアクションを繰り返すには、For each アクションをワークフローに追加します。
または、配列を受け取るトリガーがあり、各配列項目の反復を実行する場合は、SplitOn トリガー プロパティを使用してその配列をバッチ解除できます。
条件が満たされるか、状態が変更されるまで 1 つ以上のアクションを繰り返すには、Until アクションをワークフローに追加します。
ワークフローでは、まずループ内部のすべてのアクションが実行されてから、条件や状態がチェックされます。 条件が満たされると、ループが停止します。 そうでない場合は、ループが繰り返されます。 ワークフローで処理できる Until ループの回数の既定値と上限値については、コンカレンシー、ループ、および分割処理の制限に関する記事をご覧ください。
前提条件
Azure アカウントとサブスクリプション。 サブスクリプションをお持ちでない場合には、無料の Azure アカウントにサインアップしてください。
ロジック アプリ ワークフローに関する基本的な知識
For each
For each アクションは、配列でのみ動作し、配列内の各項目に対して 1 つ以上のアクションを繰り返します。 次の一覧には、For each アクションを使用する場合のいくつかの考慮事項が含まれています。
For each アクションは、制限された数の配列項目を処理できます。 この制限については、「コンカレンシー、ループ、および分割処理の制限」を参照してください。
既定では、For each アクションのサイクルまたは反復は同時に並列で実行されます。
この動作は、Power Automate の Apply to each ループとは異なっています。このループ内では、イテレーションは一度に 1 つずつ、つまり順番に実行されます。 ただし、For each の反復を順番に設定することもできます。 たとえば、For each アクション内の次の反復を遅延アクションを使用して一時停止するには、各反復が順番に実行されるように設定する必要があります。
この既定の動作の例外として、入れ子になった For each アクションの反復は、常に、並列ではなく順番に実行されます。 入れ子になったループ内の項目に対して並列で操作を実行するには、子ロジック アプリ ワークフローを作成して呼び出します。
各反復中の変数に対する操作の予測可能な結果を取得するには、これらの反復を順番に実行します。 たとえば、同時実行の反復が終了すると、増分変数、減分変数、変数に追加する操作で予測可能な結果が返されます。 ただし、同時実行ループでの各イテレーション中に、これらの操作で予期しない結果が返される可能性があります。
For each ループのアクションは、
item()
関数の式を使用して、配列内の各項目を参照して処理します。 配列にないデータを指定すると、ワークフローが失敗します。
次のワークフローの例では、Web サイト RSS フィードの日次サマリーを送信します。 ワークフローは For each アクションを使用して、新しい項目ごとにメールを送信します。
従量課金と Standard のどちらのワークフローを使用しているかに基づいて、対応する手順に従ってください。
Azure portal で、指定された順序で次の手順に従って、従量課金ロジック アプリ ワークフローの例を作成します。
"フィード項目が発行される場合" という名前の RSS トリガー
詳細については、こちらの一般的な手順に従ってトリガーを追加します。
"メールの送信" という名前の Outlook.com または Office 365 Outlook アクション
詳細については、こちらの一般的な手順に従ってアクションを追加します。
同じ一般的な手順に従って、RSS トリガーとワークフローのメールの送信アクションの間に For each アクションを追加します。
次に、ループをビルドします。
[以前の手順から出力を選択] ボックス内を選び、動的なコンテンツの一覧を表示します。
[動的なコンテンツの追加] 一覧の [フィード項目が発行される場合] セクションで、[フィード リンク] を選びます。これは RSS トリガーからの配列出力です。
Note
[フィード リンク] の出力が表示されない場合は、トリガー セクション ラベルの横にある [詳細情報] を選びます。 動的なコンテンツの一覧から、前の手順の出力のみを選択できます。
完了すると、選択した配列出力が次の例のように表示されます。
各配列項目で既存のアクションを実行するには、メールの送信アクションを For each ループにドラッグします。
これで、ワークフローは次の例のようになります。
完了したら、ワークフローを保存します。
ワークフローを手動でテストするには、デザイナーのツール バーの [トリガーの実行]>[実行] の順に選びます。
For each アクションの定義 (JSON)
コード ビューで操作している場合、次の例のように、ワークフローの JSON 定義で For_each
アクションを定義できます。
"actions": {
"For_each": {
"actions": {
"Send_an_email_(V2)": {
"type": "ApiConnection",
"inputs": {
"body": {
"Body": "@{item()}",
"Subject": "New CNN post @{triggerBody()?['publishDate']}",
"To": "me@contoso.com"
},
"host": {
"connection": {
"name": "@parameters('$connections')['office365']['connectionId']"
}
},
"method": "post",
"path": "/v2/Mail"
},
"runAfter": {}
}
},
"foreach": "@triggerBody()?['links']",
"runAfter": {},
"type": "Foreach"
}
},
For each: 順番に実行する
既定では、For each ループの反復は同時に並列で実行されます。 ただし、予測可能な結果が予想されるループ内に入れ子になったループまたは変数がある場合は、それらのループを一度に 1 つずつ、または順番に実行する必要があります。
For each アクションの右上隅にある省略記号 (...) >[設定] の順に選びます。
[同時実行制御] で、設定を [オフ] から [オン] に変更します。
[並列処理の次数] スライダーを [1] まで動かし、[完了] を選びます。
For each アクションの定義 (JSON): 順番に実行する
ワークフローの JSON 定義で For_each
アクションにコード ビューを使用している場合、operationOptions
パラメータを追加することにより Sequential
オプションを使用できます。たとえば次のようになります。
"actions": {
"For_each": {
"actions": {
"Send_an_email_(V2)": { }
},
"foreach": "@triggerBody()?['links']",
"runAfter": {},
"type": "Foreach",
"operationOptions": "Sequential"
}
}
Until
Until アクションは、必要な指定された条件が満たされるまで、1 つ以上のアクションを実行して繰り返します。 条件が満たされると、ループが停止します。 そうでない場合は、ループが繰り返されます。 ワークフローで処理できる Until アクションの回数の既定値と上限値については、コンカレンシー、ループ、および分割処理の制限に関する記事をご覧ください。
次の一覧には、Until アクションを使用できる一般的なシナリオがいくつか含まれています。
必要なレスポンスを受け取るまでエンドポイントを呼び出す。
データベース内にレコードを作成する。 そのレコード内の特定のフィールドが承認されるまで待機します。 処理し続けます。
次のワークフローの例では、毎日午前 8 時から、Until アクションが変数の値が 10 になるまで変数を増分させます。 その後、このワークフローは現在の値を確認する電子メールを送信します。
Note
この例では Office 365 Outlook を使用していますが、Azure Logic Apps がサポートする任意の電子メール プロバイダーを使用できます。 別の電子メール アカウントを使用する場合、おおよその手順は変わりませんが、UI の表示がやや異なることがあります。
Azure portal で、空のワークフローを使用して従量課金ロジック アプリ リソースを作成します。
デザイナーで、こちらの一般的な手順に従って、"スケジュール" という名前の組み込みの [繰り返し] トリガーをワークフローに追加します。
[繰り返し] トリガーで、トリガーを起動する間隔、頻度、時刻を指定します。
プロパティ 値 間隔 1 頻度 日付 設定時刻 (時間) 8 [設定時刻] パラメータを追加するには、[新しいパラメータの追加] 一覧を開き、[設定時刻] を選択します。これは、[頻度] を [日] に設定した後にのみ表示されます。
完了すると、[繰り返し] トリガーは次の例のようになります。
トリガーで、こちらの一般的な手順に従って "変数の初期化" という名前の変数組み込みアクションをワークフローに追加します。
[変数の初期化] アクションで、次の値を指定します。
プロパティ 値 内容 名前 制限 変数の名前 Type 整数 変数のデータ型 Value 0 変数の開始値 [変数の初期化] アクションで、こちらの一般的な手順に従って "Until" という名前の制御組み込みアクションをワークフローに追加します。
Until アクションで、ループの停止条件を設定するために次の値を指定します。
[値を選択] という名前の左端のボックス内を選択すると、動的なコンテンツの一覧が自動的に開きます。
一覧の [変数] で、[Limit] という名前の変数を選びます。
中央の演算子ボックスで、[次の値に等しい] 演算子を選びます。
[値を選択] という名前の右端のボックスに、比較値として「10」と入力します。
[Until] アクション内で、[アクションの追加] を選びます。
[操作の選択] 検索ボックスで、こちらの一般的な手順に従って、"増分変数" という名前の変数組み込みアクションを Until アクションに追加します。
増分変数アクションで、次の値を指定して Limit 変数の値を 1 ずつ増分させます。
プロパティ 値 名前 Limit 変数を選びます。 Value 1 [外部] と [Until] アクションで、こちらの一般的な手順に従って、メールを送信するアクションを追加します。
この例では、"メールの送信" という名前の Office 365 Outlook アクションを使用して続行します。
メール アクションで、次の値を指定します。
プロパティ 値 説明 To <email-address@domain> 受信者の電子メール アドレス。 テストのために、自分の電子メール アドレスを使用します。 情報カテゴリ "Limit" 変数の現在の値:Limit メールの件名。 この例では、現在の値が指定した条件を満たすようにするために、必ず Limit 変数を含めます。
1. [件名] ボックス内を選択して、動的なコンテンツの一覧を表示します。
2. 動的なコンテンツの一覧で、[変数] セクション ヘッダーの横にある [詳細情報] を選びます。
3. [Limit] を選びます。本文 <email-content> 送信するメール メッセージの内容。 この例では、任意のテキストを入力します。 完了すると、メール アクションは次の例のようになります。
ワークフローを保存します。
ワークフローのテスト
ロジック アプリ ワークフローを手動でテストするには、従量課金ロジック アプリ ワークフローと Standard ロジック アプリ ワークフローのどちらを使用しているかに応じて、手順に従います。
ワークフローの実行が開始された後に、指定した内容のメールを受け取ります。
無限ループを防ぐ
Until アクションは、次のプロパティに基づいて実行を停止します。このプロパティは、アクションで [制限の変更] を選んで表示できます。 これらのプロパティ値は、適宜設定してください。
プロパティ | 内容 |
---|---|
Count | ループが終了するまでに実行される反復の最大数。 ワークフローで処理できる Until アクションの回数の既定値と上限値については、コンカレンシー、ループ、および分割処理の制限に関する記事をご覧ください。 |
タイムアウト | Until アクション (すべての反復を含む) がループが終了する前に実行される最大時間。 この値は ISO 8601 形式で指定され、反復ごとに評価されます。 ループ内のアクションがタイムアウト制限より長くなる場合、現在の反復は停止しません。 ただし、タイムアウト制限の条件が満たされているため、次の反復は開始しません。 Timeout 値の既定値と上限については、「コンカレンシー、ループ、および分割処理の制限」を参照してください。 |
"Until" 定義 (JSON)
コード ビューで操作している場合、次の例のように、ワークフローの JSON 定義で Until
アクションを定義できます。
"actions": {
"Initialize_variable": {
// Definition for initialize variable action
},
"Send_an_email": {
// Definition for send email action
},
"Until": {
"type": "Until",
"actions": {
"Increment_variable": {
"type": "IncrementVariable",
"inputs": {
"name": "Limit",
"value": 1
},
"runAfter": {}
}
},
"expression": "@equals(variables('Limit'), 10)",
// To prevent endless loops, an "Until" loop
// includes these default limits that stop the loop.
"limit": {
"count": 60,
"timeout": "PT1H"
},
"runAfter": {
"Initialize_variable": [
"Succeeded"
]
}
}
}
この Until ループの例では、リソースを作成する HTTP エンドポイントを呼び出します。 HTTP 応答の本文で Completed
ステータスが返されると、ループは停止します。 無限ループを防ぐために、このループは次の条件のいずれかが発生する場合でも中止されます。
ループが 10 回実行された。これは
count
属性で指定されています。 既定値は 60 回です。ループが 2 時間実行した。これは
timeout
属性で ISO 8601 形式で指定されています。 既定値は 1 時間です。
"actions": {
"myUntilLoopName": {
"type": "Until",
"actions": {
"Create_new_resource": {
"type": "Http",
"inputs": {
"body": {
"resourceId": "@triggerBody()"
},
"url": "https://domain.com/provisionResource/create-resource",
"body": {
"resourceId": "@triggerBody()"
}
},
"runAfter": {},
"type": "ApiConnection"
}
},
"expression": "@equals(triggerBody(), 'Completed')",
"limit": {
"count": 10,
"timeout": "PT2H"
},
"runAfter": {}
}
}