はじめに
Application Integration は2023年7月にGoogleCloudでリリースされた比較的新しいサービスです
新しいが故にドキュメントが充実しておらず、簡単なことでつまづいてしまいます
この記事ではWhile Loopの扱い方について解説します
2024年5月25日時点の仕様・公式ドキュメントに基づいています
While Loop の使い方
ポイントはこの3つです
- ループの中身は別の統合で作成した方がいい
- ループに設定するのは継続条件
- メイン統合とサブ統合で変数は共有できない(マッピングが必要)
具体例
トリガーに引数として渡された数値が10を超えるまで、1ずつ足していくフローを作ります
2つの統合を作り、メインの統合からサブの統合を複数回実行します
サブの統合を作る
先にサブの統合から作ります
まず数値を格納する変数sub_number
を作成します
この変数の値をメインの統合に返したいので、Variable Typeは「Output from Integration」にします
APIトリガーとデータマッピングタスクを配置し、sub_numberに1を足すようにします
これでサブの統合は完成です
メインの統合から呼び出すため忘れずにパブリッシュしましょう
最後にAPIトリガーのIDを確認しておきます(この後で必要)
メインの統合を作る
先ほどとは別に新しく統合を作成してください。
ここでは2つ変数を用意します。1つ目は数値を格納する変数main_number
を作成します
トリガーに引数として渡し、かつ最終出力させたいので Variable Typeは「Input and Output of Integration」にします
2つ目は数値の配列を格納する変数each_sub_output_numbers
を作成します
こちらは最終出力だけさせたいので「Output from Integration」です
そしてAPIトリガーとWhile Loopタスクを配置したら、While Loopの中身をこのように設定します
1つずつ解説します
Sub-integration details
ループ実行したいサブ統合のAPIトリガーIDと、統合の名前を入力します
While loop condition
ループ条件を設定します
ここに書くのはループの継続条件です。終了条件ではありません
公式ドキュメントの表現がややこしいので注意してください
ループを終了する条件。サブ統合は、条件が満たされるまで実行されます。
変数は$
で囲んでください(使える演算子等はこちらを参照)
今回はmain_number
が10以下の時にループが継続するようにします
On each execution
メイン統合とサブ統合で変数は共有されません
ここで変数をマッピングします
- Map to sub-integration input(s)
- メイン統合の変数の値をサブに渡します
- 今回は
main_number
の値をsub_number
に渡します
- Collect values from sub-integration output(s)
- サブ統合から出力された変数の値をメインに渡します
- メイン側の変数は配列でなければなりません
- 各ループの出力値が全て格納されます
- 今回は各ループの
sub_number
の値をeach_sub_output_numbers
に格納します
- Override values from sub-integration output(s)
- サブ統合から出力された変数の値で、メインの変数を上書きます
- ループごとに毎回上書きされます
- 今回は
sub_number
でmain_number
を上書きます - これが無いと、いくらループを回しても
main_number
の値は増えません
実行確認
メインの統合を実行します
引数に5を渡してみましょう
main_number
が11で返ってきました
each_sub_output_numbers
には各ループの出力値が入るので、6〜11まで1ずつ足されていることがわかります
ログを見ても main_integration が1回に対して sub_integration が6回実行されていることがわかります
次に引数に20を渡してみましょう
main_number
が20で返ってきました
ループに入っていないのでeach_sub_output_numbers
には何も出力されていません
ログを見ても main_integration しかありません
QA: 同じ統合にメインとサブのトリガーを作ってもいいんじゃないの?
はい。その通りです。しかし動作確認が面倒になるのでお勧めしません
メインからサブを呼び出す際には、サブは必ずパブリッシュされていなければなりません
メインとサブを同じ統合に作ってしまうと、サブと同時にメインもパブリッシュしなければならず、メインをパブリッシュ前にテストをすることができなくなってしまいます
それでも同じ統合に作りたい、という場合はこのように設定しましょう
マッピングは必須です。同じ統合内であっても変数は共有されません
おわりに
プロジェクトで実際に使用した際は、メイン統合でバッチ処理を起動、サブ統合で処理が終了したか確認するループ処理を作りました
当時はWhile loopの仕様が理解できず、ただのループ処理にエンジニアが3人がかりで頭を悩ませるという悲惨な状況でしたw
この記事が誰かの役に立てば幸いです