ルドルフもわたるふもいろいろあってな

Microsoft 365、Power Platform、PowerShellについて調べたことや検証したことなどを投稿します。技術の話は面白い。

Power Automate のフローをオフからオンに変えたとたんに大量実行されてしまう事故を回避する

Power Automate の罠とも言える仕様です。知っているかたの一部はきっと過去にやらかしたことがあるかたでしょう。知らないかたは回避方法を知っておいて損は無いと思います。

該当の仕様はDocsに記載されている以下の仕様です。

定期的なアイテム トリガーなどのポーリング
フローが再度オンになったときに、未処理/保留中のイベントがすべて処理されます。 フローをオンに戻したときに保留中のアイテムを処理しない場合は、フローを削除してから再作成します。

トリガーでの一般的な問題のトラブルシューティング - Power Automate | Microsoft Docs

つまりどういうこと?事故ってなに?

事故のイメージをストーリー形式にしてみました。

テナント内のSharePointサイトを管理するためにSharePointリストで管理台帳を作った。サイト管理者の皆に公開して各々に更新してもらうよ。
(`・ω・´)シャキーン


台帳が更新されたら、私宛に通知されるフローを作ったよ。
(`・ω・´)シャキーン


フローの動作確認のために試し投稿をしたよ。
(`・ω・´)シャキーン


期待通りに通知がきたよ。OK
(`・ω・´)


テナント内のサイト一覧を台帳に初期登録するよ。
(`・ω・´)


その前に、初期登録でフローが実行されないようにフローをオフにするよ。
(`・ω・´)


初期登録したよ。
(`・ω・´)


初期登録でフローは動いていない。OK
(`・ω・´)


初期登録が終わったのでフローをオンにするよ。
(`・ω・´)


( ゚д゚)ポカーン


これはポーリングトリガーの仕様です。

ポーリングトリガーは、フローの実行条件が満たされたかどうかを監視するトリガーです。
このポーリングトリガーはフローがオフの状態のときであっても、実行条件が満たされたかどうかを監視します。フローがオフのときには実行されませんが、オンに戻したときに保留中のアイテムがまとめて実行されます。

定期的なアイテム トリガーなどのポーリング
フローが再度オンになったときに、未処理/保留中のイベントがすべて処理されます。 フローをオンに戻したときに保留中のアイテムを処理しない場合は、フローを削除してから再作成します。

トリガーでの一般的な問題のトラブルシューティング - Power Automate | Microsoft Docs

どうすれば回避できる?

回避策①:フローを再作成する

たなさんのブログでこの方法について紹介されています。
tana-techlog.net

オフにしているフローを、保留中の実処理を実行せずにオンに戻すことは基本的にできません。そのため、同じ構成のフローを再作成してもとに戻すのが回避方法のひとつです。

「名前を付けて保存」を使用することでフローをコピーすることができます。この方法でコピーしたフローには、コピー元が保留している処理は引き継がれません。そのため、フローをコピーしたうえで元のフローを消すことで、大量実行の事故を回避しつつフローをオンに戻せます。

ただし、この方法でコピーできるのはフローのトリガーやアクションなどのフローの各ステップの設定のみです。フローの所有者設定や共有設定、フロー固有のIDは変わります。そのため、これらに関わる設定は再度行う必要があります。

回避策②:フローをオンのまま、トリガーの直後に「終了」アクションを配置する

もうひとつの回避方法がこちらです。おそらくこちらのほうが現実的かと思います。

トリガーの直後に「終了」アクションを配置します。そのうえで、フローはオフにしません。

こうすることで、フローの実行自体は行われますが、本来の目的である「実行したくないアクションの実行」を回避することができます。また、もとのフローをそのまま使い続けられるので回避方法①のように所有者設定などのしなおしは不要です。

最後に

回避策②の方法はTwitterで案を頂きました。ありがとうございます。