添付ファイルをBlob Storageに格納するLogic Appsを作成したが、以前作成した時とフローが違っており、同じ設定でも動作しなくなった

このエントリは2024/05/10現在の情報に基づいています。将来の機能追加や変更に伴い、記載内容からの乖離が発生する可能性があります。

問い合わせ

Logic Appsで自身の身の回りの環境を便利にしようとしている人から、以下のような問い合わせが届いた。この方もお初の人。

最近Outlookコネクターをトリガーとし、添付ファイルをBlob Storageに格納するようなフローを再作成したのだが、以前とフローが変わっていて混乱している。そしてこのフローのままテストすると期待した通りに動作しない。動作させるにはどうすればいいか?また、以前と同じ構成にするにはどうしたらいいか?

以前がどういうものだったのかを知りたかったので、もうちょっとつっこんで聞いてみた。以前は以下のような感じ。

ただ、現在は以下のように、二重ループが構成されている、とのこと。確かに手元の環境でもデザイナーを使うとそのように構成されていた。

で、この二重ループのまま実行すると、以下のようなエラーメッセージが出て、ワークフローが動作しない、ということのよう。

この二重ループの意図

Outlookコネクターは着信メールを1件ずつ取得するわけではなく、ポーリングのタイミングで着信したメールを取得している。そのため、コネクターは複数のメールを取得する場合がある。

複数のメールを1回のフローで操作できるよう、外側のループ(For_each_1)でメールの件数だけループしようとしており、この外側のループのパラメータとして、エラーメッセージ中のtriggerBody()['value']を設定している。これは1回の呼び出しで取得できたメールをそのまま外側のループに渡している、ということ。

この設定の場合、この外側のループが動作するためには着信メールをdebatching(1件ずつにばらすこと)してはいけないのだが、Outlookコネクターの設定を見ると、Split OnOnになっており、ループしようにもループできない、というのが、期待したとおりの動作をしない原因。

配列で複数の実行をトリガーする / Trigger multiple runs on an array
https://learn.microsoft.com/azure/logic-apps/logic-apps-workflow-actions-triggers#trigger-multiple-runs-on-an-array

解決策

解決策は非常に簡単で、このSplit OnOffにすれば、この二重ループで順繰りに(直列に)処理できるようになる。

旧来の動作に戻したい

上記の解決策では順繰りにメールを処理しているが、これでは大量のメールが届いたときに処理時間がかかってしまう。そこで、並列処理できるよう、メールを1件ごとにばらす、つまりSplit OnプロパティをOnにすればうまく行きそうに思えるが、単純にFor eachループをデザイナーで移動させた場合、Split OnプロパティをOnにしただけでは動作しない。それはループのパラメータが変わっているからである。

コードビューで確認すると、パラメータとして以下の値が設定されている。

"foreach": "@item()?['Attachments']",

これはメールの配列要素のAttachments配列を参照しようとしているのだが、並列処理できるようdebatching、つまりSplit OnプロパティをOnにした場合、もはやメールは配列ではない。そのため、

  "foreach": "@triggerBody()?['Attachments']",

と、トリガーで取得したAttachments配列を参照する必要がある。設定自体は簡単だが、デザイナーで見るとまったく同じなので、見分けが付きにくいという点に注意が必要。

あと、debatchingの結果生成された実行インスタンスを追跡するにあたり、Split-On Tracking IDなる値を設定してもよい。今回はメール1件ごとに処理しているので、メールのIDを使うことにした。以下の@triggerBody()?['id']がそれに相当する(追加しなくても動作する)。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください