【Power Automate】子フローの利用時に気をつけたい再試行ポリシー

`Power Automate`で`子フロー`を利用するシーンがあります。
[子フロー](https://learn.microsoft.com/ja-jp/power-automate/create-child-flows)は、`Power Automate`のアクションをひとまとめにして実行できる**非常に利便性の高いテクニック**です。

https://learn.microsoft.com/ja-jp/power-automate/create-child-flows

# [子フロー](https://learn.microsoft.com/ja-jp/power-automate/create-child-flows)のメリット

メリットを列挙すると

- 再利用しやすい - 一度作成した子フローを、複数のフローで再利用できる
- 保守しやすい - 子フローで実行している処理は、その子フローの更新だけで、その子フローを利用している全てのフローに変更が反映される
- 可読性 - 結果的に親フロー、子フローがシンプルになるため、フローが見やすい
- モジュール化 - フローを機能別に分割でき、開発・テストが用意

こういった点が挙げられます。
**自動化するための開発の効率化**という観点で、子フローの利用は欠かせません。

しかしながら、[子フロー](https://learn.microsoft.com/ja-jp/power-automate/create-child-flows)を使う上で気をつけたい部分があります。
それは[再試行ポリシー](https://learn.microsoft.com/ja-jp/power-automate/guidance/planning/reducing-risk#retry-policy)です。

# 再試行ポリシー
> Power Automate のこの機能を使用して、アクションが失敗した場合に自動的に再試行するポリシーを設定することができます。 既定では、4 回再試行するように設定されていますが、必要に応じて変更できます。
>> [再試行ポリシー Microsoft learn](https://learn.microsoft.com/ja-jp/power-automate/guidance/planning/reducing-risk#retry-policy)

- アクションの[設定]タブから`再試行ポリシー`は設定できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/fc473ff5-eb5c-c862-408b-37661545204c.png)

**Power Automateのアクションが失敗した際に、既定では4回処理を試みます。**
`HTTP 要求`や`カスタム コネクタ`の動作でも一回の処理で確実に成功するわけではありません。

この`再試行ポリシー`が適用されることにより、`成功`するまで、トライアンドエラーを実行してくれているという親切な設計ですね。

ですが、この親切な設計によって泥沼にハマることもあるのです・・・💦

# [失敗する子フロー](https://learn.microsoft.com/ja-jp/power-automate/create-child-flows)の例

今回は検証用に下記の子フローを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/9fc611f0-607c-4542-b75e-d9dc3a94161f.png)

1. 起動時に`メール アドレス`を受け取る
1. `Outlook`でメールを送信
1. `データ操作`で、結果をオブジェクトにする（本来的には不要）
1. `JSON の解析`（エラーを発生させるポイント）

上記のフローは、活用のシーンが想像できませんが・・・。

:::note info
実際に作成するときは、子フローを配置する[ソリューション](https://learn.microsoft.com/ja-jp/power-automate/create-child-flows#create-the-child-flow-in-a-solution)が必要になります。

ソリューションの解説は、[Microsoft learn](https://learn.microsoft.com/ja-jp/power-automate/create-child-flows#create-the-child-flow-in-a-solution)に譲ります。
:::

## 子フローの作成

`子フロー`を作成してみましょう。
`クラウドフロー`を選択して、`フロー`を追加します。

![スクリーンショット 2024-06-16 103913.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/0f02a8b6-055f-36fe-9034-59403b788681.png)

`子フローの作成`では、まず`フローを手動でトリガーする`を選択します。
ここで、Power Automateを書いていきましょう。

![スクリーンショット 2024-06-16 104112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/ecaea66c-d341-c315-dff8-20f07df94cb8.png)

1. `フローを手動でトリガーする`でメールアドレスを受け取ります
1. (1)で受け取ったアドレスに`メールの送信 (V2)`します
1. エラー用に`JSONを作成`します
1. `JSON の解析`でエラーを発生させます
1. 子フローを終了させます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/84ee481a-1f1b-8250-8706-06be0a2f4c81.png)

ここで(3)の部分で、オブジェクトを作成し、本来的にJSON の解析で`string`型と解釈される値を`integer`と書き換えることによって、エラーを仕込みます。

```json: Schema
{
    "type": "object",
    "properties": {
        "Datetime": {
            "type": "string"
        },
        "Address": {
            "type": "integer" // 本来はstring
        }
    }
}
```

## 接続の編集

`子フロー`を利用する際には、`実行のみのユーザー`の設定が必要です。
コチラで`編集`をクリックすると、各コネクタで使用する接続が選択できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/bc9fdca6-9a5e-8cfb-b376-bd3ae0d78c5e.png)

子フローとして利用する際、`実行専用のユーザーによって提供されました`の設定では、利用できません。
**ユーザー独自の接続の指定**が求められます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/04057ee8-23cc-23b1-2c2c-e0acc9a78896.png)

言ってしまえば、`コチラで指定される名義によって処理が実行される`ということですね。
今回のように、`メールの送信`のみを目的にしている場合、**他者名義の接続を指定すれば、接続元のメールアドレスからメールが送信されます。**

1. `新しい接続参照`で接続を変えると
![スクリーンショット 2024-06-16 110142.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/1b274156-e0a9-9272-85d6-120c14e293d3.png)
1. `接続参照`が`ソリューション`に追加され
![スクリーンショット 2024-06-16 110209.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/79fbc2dd-3679-2033-6a0d-cc5373761630.png)
![スクリーンショット 2024-06-16 110214.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/7c351ef0-0315-f453-e718-648a528ff919.png)
1. メールの送信元を、この接続から実行でき
![スクリーンショット 2024-06-16 110245.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/342016f0-b5e2-eac6-1953-d635838b1188.png)
1. 実行するユーザーに問わず、この接続からメールが送信される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/784a5279-8e84-bf6e-7088-153251968016.png)

**送信元のみ変えたいというときに使える一つのTipsです。**
さて、設定が完了したことから、`親フロー`の作成に移ります。

# 親フローの作成
さて、`親フロー`の作成に移ります。

1. `作成`で`メールアドレス`を指定（ここでは自分のアドレス）
1. `子フロー`に`メールアドレス`を渡して実行

といったシナリオで進めてみましょう。

1. `子フロー`の呼び出しは、`アクションの追加`でランタイム`組み込み`から`Flows`を追加
![スクリーンショット 2024-06-16 111014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/0a8c5193-304b-9c44-b7e5-a584e5fe305b.png)
1. `子フロー`の実行
![スクリーンショット 2024-06-16 111039.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/c931d69f-c5a1-d436-a8d5-bc7890448acf.png)
1. `子フロー`を選択し、必要なパラメーターを指定します
![スクリーンショット 2024-06-16 111050.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/c9c3ef48-66a0-1f3b-49f6-d2cf223528a7.png)

実行すると、大久保さんからメールが来ます。

![スクリーンショット 2024-06-16 111144.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/c9bc46d7-a1a5-7da8-a976-f890a477be8f.png)

## エラーが発生！
`子フロー`は単体でエラーを発生するものになっています。
そうすると、`親フロー`は中々完了せず、再度`子フロー`を試すことになります。

![スクリーンショット 2024-06-16 111327.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/bbe274f2-b560-c77e-4c37-0f450f078344.png)

ここで[再試行ポリシー](https://learn.microsoft.com/ja-jp/power-automate/guidance/planning/reducing-risk#retry-policy)が適用されているわけですね。

結果的に4回も大久保さんからメールが来てしまいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/ef3dcd59-cec7-51d6-af19-4b347879b014.png)

`再試行の履歴`から、子フローを複数回呼び出していることがわかります。

![スクリーンショット 2024-06-16 111653.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/52d225c0-c6aa-389e-101a-28faa3033bf3.png)

親フローの実行は10分以上かかることになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/a85afe25-5755-f594-14dd-5ea36fdacf38.png)

# 複数のフローが絡んでいると更に複雑に！
`子フロー`のメリットは**再利用性**です。
例えば同じ処理を、
- `SharePoint Listsに項目が作成されたとき`
- `毎日何時に定期的に`

複数のフローから呼び出した場合、さらにエラーの原因がわかりづらくなることにも・・・。
なかなか恐ろしいですね。

しかしながら、自動化のために、同じ自動化するフローを書いて疲弊する・・・は間違いなく本末転倒です。
`子フロー`活用はその打開策なので、ぜひ使ってみてくださいね。

# 失敗を未然に防ぐには！！！
持論ですが、**失敗を未然に防ぐ方法は、失敗例をあらかじめ蓄積して覚えることだと思います！**
**Qiitaで失敗談をShareすることによって、同じトラブルに見舞われることを防ぎたい！！と心から思っていますので、ShareまたはLGTMをぜひぜひお願いします🐟**