この記事の内容
- Power Automate / Logic Apps で時間のかかる処理を非同期実行に切り替える方法を紹介します
- 同期実行の問題点(長い待ち時間・タイムアウト)を実例で確認します
- わずか1クリックの設定変更で非同期レスポンスを実現できることを解説します
- 非同期実行時のレスポンス構造(HTTPステータス・Locationヘッダー)を説明します
- ポーリングによる実行状況の確認方法を紹介します
同期実行の問題点
Power Automate や Logic Apps で HTTP の要求を受信するトリガーを使ったフローを作成する場合、デフォルトでは同期実行となります。つまり、フローの処理がすべて完了してから呼び出し元にレスポンスが返されます。
今回の例では、GETリクエストを受け取ったら1分間待機し、その後「1分間待ってから最後まで実行されました」というメッセージを返すシンプルなフローを使います。
このフローを実際にブラウザや Postman(Web ブラウザ版)から呼び出すと、次のような問題が発生します。
- ブラウザ: リクエストを送信してから1分間、ぐるぐると応答待ちになります
- Postman(Web版): 30秒以上レスポンスが返ってこなかった場合、タイムアウトエラーになります
実際のユースケースでは、この「1分待ち」の部分が重たいバックエンド処理に相当します。ユーザーを長時間待たせるのは良いユーザー体験とは言えません。また、クライアント側のタイムアウト設定によっては、処理が正常に完了していても「失敗」として扱われてしまいます。
非同期実行への切り替え方
Power Automate / Logic Apps には、この問題を解決するための設定が用意されています。設定変更はわずか1ステップです。
手順:
- HTTP 要求受信トリガーの設定を開きます
- 「応答の設定」から 「非同期応答(Asynchronous Response)」 を有効にします
たったこれだけで、フローが非同期実行モードに切り替わります。コードの変更やフローの構造変更は一切不要です。
非同期実行時のレスポンス構造
非同期応答を有効にした状態で同じURLにGETリクエストを送ると、動作が大きく変わります。
即時レスポンス
リクエストを送信すると、処理の完了を待たずにすぐにレスポンスが返ってきます。このレスポンスの内容は以下のようなものです。
- ステータスコード:
202 Accepted(受け付けました、という意味) - ボディ:
{"status": "Running"}など、現在実行中であることを示す情報 - Locationヘッダー: 実行結果を確認するための URL
Locationヘッダーの役割
非同期レスポンスのポイントは Locationヘッダー にあります。このヘッダーには、実行結果を取得するための専用 URL が含まれています。
この URL は実行ごとに異なるものが発行されます。同じフローを複数回呼び出した場合、それぞれ異なる Location URL が返されます。
ポーリングによる状態確認
Locationヘッダーで取得した URL に対して GETリクエストを送ることで、処理の進行状況を確認できます。
実行中の場合
{
"status": "Running"
}
レスポンスには引き続き Location ヘッダーが含まれており、同じ URL を参照し続けることができます。
完了した場合
処理が完了すると、レスポンスボディに最終的な実行結果が返されます。例えば今回のフローでは「1分間待ってから最後まで実行されました」というメッセージが得られます。また、完了後のレスポンスには Location ヘッダーは含まれなくなります。
このように、一定間隔で Location URL にリクエストを送り続ける(ポーリング)ことで、処理の完了を検知できます。
非同期実行の全体フロー
整理すると、非同期実行の流れは次のようになります。
- クライアントがフローの URL に対してリクエストを送信する
- フローはすぐに
202 Acceptedを返す(Locationヘッダーつき) - フローはバックグラウンドで処理を継続する
- クライアントは Location URL に対して定期的にGETリクエストを送る(ポーリング)
- 処理が完了すると、Location URL から最終結果が取得できる
まとめ
Power Automate / Logic Apps では、HTTP 要求受信トリガーの設定から 「非同期応答」を有効にするだけ で、長時間かかる処理を非同期実行に切り替えることができます。
フローの構造を変える必要も、複雑なコードを書く必要もありません。この設定を有効にすることで、次のメリットが得られます。
- クライアントを長時間待たせることがなくなる
- クライアント側のタイムアウトエラーを回避できる
- 処理の状況を Locationヘッダーの URL でポーリングして確認できる
外部 API の呼び出しや重たいデータ処理など、実行時間が読めない処理を扱う場合に非常に有効な手法です。Power Automate / Logic Apps を使っている方はぜひ活用してみてください。