【Application Integration】初心者向け While Loopの扱い方を解説

# はじめに
Application Integration は2023年7月にGoogleCloudでリリースされた比較的新しいサービスです
新しいが故にドキュメントが充実しておらず、簡単なことでつまづいてしまいます
この記事ではWhile Loopの扱い方について解説します

:::note info
2024年5月25日時点の仕様・公式ドキュメントに基づいています
:::


# While Loop の使い方
ポイントはこの3つです
- **ループの中身は別の統合で作成した方がいい**
- **ループに設定するのは継続条件**
- **メイン統合とサブ統合で変数は共有できない（マッピングが必要）**


## 具体例
トリガーに引数として渡された数値が10を超えるまで、1ずつ足していくフローを作ります
2つの統合を作り、メインの統合からサブの統合を複数回実行します


### サブの統合を作る
先にサブの統合から作ります
まず数値を格納する変数`sub_number`を作成します
この変数の値をメインの統合に返したいので、Variable Typeは「Output from Integration」にします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217064/7e510bd6-7d31-67c7-a571-bc3399b4bb6f.png)

APIトリガーとデータマッピングタスクを配置し、sub_numberに1を足すようにします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217064/b1f2512d-09c5-f5e9-9a56-7a16b10652b1.png)

これでサブの統合は完成です
メインの統合から呼び出すため**忘れずにパブリッシュしましょう**

最後にAPIトリガーのIDを確認しておきます（この後で必要）

![Google Chrome 2024-05-25 20.55.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217064/b0baab88-2e2b-1174-842f-b267dde6d522.png)


### メインの統合を作る
先ほどとは別に新しく統合を作成してください。
ここでは2つ変数を用意します。1つ目は数値を格納する変数`main_number`を作成します
トリガーに引数として渡し、かつ最終出力させたいので Variable Typeは「Input and Output of Integration」にします

![Google Chrome 2024-05-25 20.46.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217064/c8d89955-721b-118a-97e2-9597eb25413e.png)

2つ目は数値の配列を格納する変数`each_sub_output_numbers`を作成します
こちらは最終出力だけさせたいので「Output from Integration」です

![Google Chrome 2024-05-25 21.40.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217064/75b43f74-56e1-9776-82d7-aff23dea00fc.png)

そしてAPIトリガーとWhile Loopタスクを配置したら、While Loopの中身をこのように設定します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217064/48dc0810-68a0-e144-6360-8f5409c6c94d.png)

1つずつ解説します


#### Sub-integration details
ループ実行したいサブ統合のAPIトリガーIDと、統合の名前を入力します


#### While loop condition
ループ条件を設定します

:::note warn
**ここに書くのはループの継続条件です。終了条件ではありません**
[公式ドキュメント](https://cloud.google.com/application-integration/docs/edge-and-edge-conditions?hl=ja#operators)の表現がややこしいので注意してください
> ループを終了する条件。サブ統合は、条件が満たされるまで実行されます。
:::

変数は`$`で囲んでください（使える演算子等は[こちら](https://cloud.google.com/application-integration/docs/edge-and-edge-conditions?hl=ja#operators)を参照）
今回は`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を渡してみましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217064/01b8e847-9e92-6fb6-b2d7-2933f10864e3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217064/c3c92685-3e4e-c3dc-64bb-d07774db034a.png)

`main_number`が11で返ってきました
`each_sub_output_numbers`には各ループの出力値が入るので、6〜11まで1ずつ足されていることがわかります

ログを見ても main_integration が1回に対して sub_integration が6回実行されていることがわかります

![Google Chrome 2024-05-25 22.00.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217064/d2ffeff7-d7ec-e235-d2ec-b0919ee53f48.png)


次に引数に20を渡してみましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217064/c2f3667b-0871-9608-c8dd-774b0728ff1d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217064/14f8a6d8-7ccd-6ede-dbba-4447361fb552.png)

`main_number`が20で返ってきました
ループに入っていないので`each_sub_output_numbers`には何も出力されていません
ログを見ても main_integration しかありません

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217064/643306fb-094d-825e-78b5-27dfc3d5ba41.png)


## QA: 同じ統合にメインとサブのトリガーを作ってもいいんじゃないの？
はい。その通りです。しかし動作確認が面倒になるのでお勧めしません
メインからサブを呼び出す際には、サブは必ずパブリッシュされていなければなりません
メインとサブを同じ統合に作ってしまうと、サブと同時にメインもパブリッシュしなければならず、メインをパブリッシュ前にテストをすることができなくなってしまいます

それでも同じ統合に作りたい、という場合はこのように設定しましょう
マッピングは必須です。同じ統合内であっても変数は共有されません

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217064/83828827-302a-fded-efaf-88184e39d8ae.png)


# おわりに
プロジェクトで実際に使用した際は、メイン統合でバッチ処理を起動、サブ統合で処理が終了したか確認するループ処理を作りました
当時はWhile loopの仕様が理解できず、ただのループ処理にエンジニアが3人がかりで頭を悩ませるという悲惨な状況でしたw
この記事が誰かの役に立てば幸いです