tag:blogger.com,1999:blog-33573135017227465922024-03-13T14:34:42.938+09:00てすとぶろぐDataGridView や DataRepeater にこだわりつつ<br>
時代は Workflow Foundation などと言い続けていたら<br>
これからは LogicFlow だろ! と思い始めてきた<br>
色々浅く広くやっていく古い技術者の BlogAhfhttp://www.blogger.com/profile/01553064540426163049noreply@blogger.comBlogger804125tag:blogger.com,1999:blog-3357313501722746592.post-63365318545296839242023-12-06T00:00:00.104+09:002023-12-06T00:00:00.140+09:00お試しでは知ることのできない真の実力<p>このエントリは <a href="https://qiita.com/advent-calendar/2023/powerautomate" target="_blank">Power Automate Advent Calendar 2023</a> の 12/06 分エントリになります。</p><p> Office 365/Microsoft 365 では、Power Automate や Power Apps の利用権(シードプラン)が付属していることもあり、多くの人が Power Platform の恩恵を受けていることと思います。なんだかんだ言って、特に費用追加せずに利用できるというのは大きなメリットですので、勿体ないから自社で活用しようぜ!、と考えるところも多々あるでしょう。</p><p> Power Automate で作業を自動化できたらステキですし、Power Apps で独自アプリを作れたりしたらまたステキすぎて、鼻息荒くなってしまう人もいるでしょう。また、思い描いていることができるかどうかを試すためにも、所有している利用権の活用や試用版を登録してお試し利用して考えようとしている人も多いと思います。</p><h2 style="text-align: left;">お試しできないもの</h2><p> Power Automate の能力は付随する利用権や試用版では確かめることができない部分があります。代表的なのは処理能力です。Microsoft 公式ドキュメントとして以下のページが用意されていますので、ここを参照するのが役立ちます。</p><p>自動化フロー、スケジュールされたフロー、インスタント フローの制限事項<br /><a href="https://learn.microsoft.com/ja-jp/power-automate/limits-and-config#performance-profiles">https://learn.microsoft.com/ja-jp/power-automate/limits-and-config#performance-profiles</a></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgpm0btwNOvChxVi7SZb-KDCWXq0AQ5HSXrL-rTweh5bt6XRLG9eiNQWLhdxC28CSWWN1w9bIX70YCw_qpgoHwm3selkUOAnM4heqC7S3H44yEK_qklaaqMgQezvszA8F2njLlBm1-MrvjXtT8wmp1FGdVM46VKe8vVwzZErga7-12AxDlwq2UngFo2ixA" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="451" data-original-width="867" height="166" src="https://blogger.googleusercontent.com/img/a/AVvXsEgpm0btwNOvChxVi7SZb-KDCWXq0AQ5HSXrL-rTweh5bt6XRLG9eiNQWLhdxC28CSWWN1w9bIX70YCw_qpgoHwm3selkUOAnM4heqC7S3H44yEK_qklaaqMgQezvszA8F2njLlBm1-MrvjXtT8wmp1FGdVM46VKe8vVwzZErga7-12AxDlwq2UngFo2ixA" width="320" /></a></div><br /> パフォーマンスプロファイルとして、Power Automate の処理能力がまとめられています。ドキュメントには「安」と分類されたカテゴリに、<p></p><p>安<span style="white-space: pre;"> </span>無料/Microsoft 365 プラン/Power Apps プラン 1、アプリごとのプラン/Power Automate プラン 1/すべての試用版ライセンス/Dynamics 365 Team Member/開発者向け Microsoft Power Apps </p><p>と書かれており、このプロファイルで動作できる能力はドキュメントの最後の方に記されています。</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgnIo7Om5laXg8v1StkI4I3hcCkPO66IWwWMi7YuCOCvV93fwp9lxX_SE05tAT8MSLjVj_G_M56F25b2vfQrVo2kO97pCLqp7KElAf-PUrDaSfCOANXCrOAyoF5agI6kxEbaAsJIlhruJGkAJDZOJVtr91It8xlWj8KA0LNkfAXr31ABCZRklkgC4dTfQc" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="426" data-original-width="873" height="156" src="https://blogger.googleusercontent.com/img/a/AVvXsEgnIo7Om5laXg8v1StkI4I3hcCkPO66IWwWMi7YuCOCvV93fwp9lxX_SE05tAT8MSLjVj_G_M56F25b2vfQrVo2kO97pCLqp7KElAf-PUrDaSfCOANXCrOAyoF5agI6kxEbaAsJIlhruJGkAJDZOJVtr91It8xlWj8KA0LNkfAXr31ABCZRklkgC4dTfQc" width="320" /></a></div><br /> 24時間ごとの Power Platform 要求で行える数がありますが、ざっくり言い換えるとこの数字が最大となるアクション実行限界です。各コネクタのアクションで1度の処理で何回呼び出しが行われるかはまちまちですが、最低1回は呼び出しが行われるとした場合、1日に実行できるアクション数は24時間での要求数となります。つまるところ、1日に10,000アクション以上は実行ができないことになります。<p></p><p> 実際にこれを超える処理を行った場合どうなるか、これはフローが一時停止状態のような形になり、処理が途中で実行中のまま止まります。履歴では実行中なのに、フローのどこかのアクションで処理がストップしている状態です。</p><p> 1日に10,000アクションと言われると結構なことができそうに思えますが、先に書いた通り「1アクションでどれくらい呼び出しが発生するかは公開されていない」ので、実際にはそれよりも少ない数でしか動作することができません。</p><p> 試用版やシードプランによる利用権での処理能力と、有償ライセンスである Power Automate Premium を購入した際の処理能力は、最大実行数で10倍になります。ここでも「騙されんぞ、どうせ最大数だけだろ!」と思われがちですが、実際の実行速度も体感で2~3倍は早く動作しているように感じられるほどです。世の中に広く伝わる赤くなったら3倍速くなる、というわけではありませんが有償ライセンスによりプロファイルをミディアムに切り替えるだけで、思っている以上の処理能力を手にすることが可能です。場合によっては1時間かかった処理が10分かからなくなった、といったことも実際に起きたことがあります。</p><h2 style="text-align: left;">結局のところどうするのがよいか</h2><p> 少ない処理数をユーザー数でカバーさせるような処理の仕組みを作ることももちろん可能です。AというファイルだったらAさんに、BというファイルだったらBさんに、といった形で処理を振り分ける仕組みにすればよいので、そこだけ見れば実現も十分に可能ですが、そこまでのことをやろうとした場合、大体にしてライセンス購入して処理能力を向上させた方がスムーズに解決できてしまうことが多いです。1か月かけて処理を複数人に割り振りするような仕組みを作るか、2000円弱支払って数倍の処理能力を手にするか、どちらがよいかはその時々の事情もあるので一概には言い切れません。ただ、人ひとりが1か月考えて作り上げる時間にもコストが関わってくると考えると、最終的にどうすることがメリットあるのかは、一行の余地があると思われます。</p><p> せっかく利用権があるのでその枠内でどうこうしたい気持ちは理解できますが、実現したいことがその枠を超えるときには、有償プランを購入することもぜひ検討してみてください。</p>Ahfhttp://www.blogger.com/profile/01553064540426163049noreply@blogger.com0tag:blogger.com,1999:blog-3357313501722746592.post-35117005338009521792022-12-16T00:00:00.191+09:002022-12-16T00:00:00.208+09:00Power Automate Managementコネクタの実力とは気が付けば3年ほどブログを放置してしまいました。今回ご縁があって、<a href="https://qiita.com/advent-calendar/2022/powerautomate" target="_blank">Power Automate のアドベントカレンダー</a>に参加しまして、このエントリはその投稿となります。
色々な人がいろいろな観点で書いてくれているので、さて自分は何を書こうかなと考えてみたところ、結構昔からある割にほとんど日の目を見ないコネクタあったなーと思い、今回は Power Automate Management コネクタについて書いてみようと思います。 <p style="text-align: left;"><br /></p><h2 style="text-align: left;"> どんなコネクタなのか </h2><p style="text-align: left;"><br /></p><p style="text-align: left;"> Power Automate Managementコネクタは、その名前の通り Power Automate の管理機能を扱っているコネクタです。公式ドキュメント(<a href="https://learn.microsoft.com/ja-jp/connectors/flowmanagement/">https://learn.microsoft.com/ja-jp/connectors/flowmanagement/</a>)でもアクションの一覧などがまとめられていますが、それを読んでもなかなかイメージが付かない or 使いどころが思いつかないのではないでしょうか。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDM2E9Drbj3j11YtA5kGQjrHDw-UUuU0EHTpRuiIUtnoCvuj_dVyPW5jm8QSUOSHZNTyPkLpKB1hh65MxvnCuj7mbBVLjttl39QefxwQCNgWhnKFexyclXy-3MPlD7J7MVM8_mONYsNDDzsMIOq9JKN62-PIdj_N_oX9Wdpk3c5LLxjBqeWeeOQpm2/s1352/actions.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1352" data-original-width="559" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDM2E9Drbj3j11YtA5kGQjrHDw-UUuU0EHTpRuiIUtnoCvuj_dVyPW5jm8QSUOSHZNTyPkLpKB1hh65MxvnCuj7mbBVLjttl39QefxwQCNgWhnKFexyclXy-3MPlD7J7MVM8_mONYsNDDzsMIOq9JKN62-PIdj_N_oX9Wdpk3c5LLxjBqeWeeOQpm2/w83-h200/actions.png" width="83" /></a></div><p style="text-align: left;">アクション数もこのように非常に多いですが、ここで提供されているアクションについて、簡単な解説と使いどころを書いていきます。</p><p style="text-align: left;"><br /></p><div><h2 style="text-align: left;">フローの実行管理機能</h2><p style="text-align: left;"><br /></p><div><b>フローをオフにする:</b>環境内で指定されたフローを停止します。</div><div><b>フローをオンにする:</b>環境内で指定されたフローを開始します。</div><div><b>フローを再送信する:</b>環境内で指定されたフロー実行を再送信します。</div><div><b>フロー実行を取り消す:</b>フロー実行を取り消します。</div></div><div><table><tbody>
</tbody>
</table>
<br /></div><div>実行管理機能といえるのは上記の4アクションです。ここはイメージつきやすいところで、対象となるクラウドフローを指定して、オフ(無効化)・オン(有効化)を行ったり、実行エラーが発生したクラウドフローを再実行させたり、実行中のクラウドフローを中止させることが可能です。</div><div><br /></div><div>利用するシーンとしても、管理機能的なものを用意する場面で利用することが思いつくので比較的利用することも簡単です。雰囲気的には、再送信と実行取り消しが使いやすいのかもしれません。</div><p style="text-align: left;"><br /></p><h2 style="text-align: left;">所有者・ユーザー関係の機能</h2><div><p style="text-align: left;"><br /></p><div><b>フロー所有者を一覧表示する:</b>環境内で指定されたフローのすべての所有者を一覧表示します。</div><div><b>フローの所有者を変更する:</b>環境内で指定されたフローの所有者を変更します。</div><div><b>フロー所有者を管理者として変更する:</b>管理者アクセス権のある環境内で作成された特定のフローの所有者を変更します。</div><div><b>実行専用ユーザーを変更する:</b>環境内で指定されたフローの実行専用ユーザーを変更します。</div><div><b>管理者としてフローを一覧表示する:</b>管理者アクセス権のある指定された環境内ですべてのフローを一覧表示します。</div><div><b>フローの実行専用ユーザーを一覧表示する:</b>環境内で指定されたフローのすべての実行専用ユーザーを一覧表示します。</div></div><div><br /></div><div>クラウドフローの所有者を変更したり、関連するユーザーの一覧を取得したりする機能です。これも、管理機能的なものとして利用することが考えられますが、冷静になって考えると、これらの操作を行うときは大体 Power Automate のポータルから手動で作業する場面が多いと思います。また、それらの作業は比較的単発で終わることが多く、繰り返しこのあたりの作業を必要とする場面はあまりイメージできません。</div><div><br /></div><div>そう考えると、「Power Automateの完全な管理を行えるツールを自作したい」といったことでもなければ、そうそう利用することはないのではないか、と考えていますので、もし「こういうシーンで使えるじゃないか阿呆が!」というものがあれば、ぜひぜひ教えてください!</div><p style="text-align: left;"><br /></p><h2 style="text-align: left;">環境まわりの機能</h2><div><p style="text-align: left;"><br /></p><div><b>自分の環境を一覧表示する:</b>アクセス可能な環境を一覧表示します。</div><div><b>自分のフローを一覧表示する:</b>指定された境内で作成したすべてのフローを一覧表示します。</div><div><b>自分の接続を一覧表示する:</b>指定された環境内で使用可能なすべての接続を一覧表示します。</div><div><b>コネクタを一覧表示する:</b>指定された環境内で使用可能なすべてのコネクタを一覧表示します。 この一覧には、カスタム コネクタおよび組み込みコネクタが含まれます。</div><div><b>コネクタを取得する:</b>環境内で指定されたコネクタを取得します。</div><div><b>コールバック URL の一覧:</b>環境内で指定されたフローのコールバック URL の一覧です。</div></div><div><br /></div><div>利用している環境の情報取得や、環境にぶらさがるクラウドフローの一覧、コネクタの一覧、コネクタ情報の取得、接続情報の取得、外部から呼び出される先となるコールバックURLの取得が可能です。</div><div><br /></div><div>以前私が行っていた、新規コネクタの追加やアクション/トリガの新規追加を検知する仕組みでは、このアクションの機能を利用しています(Logic Apps側でやってることもありますが)。なお、現在はかかるコストが思っている以上に発生してしまっているので止めていますが、なんとか近いうちには復活させたいとも思っています……。</div><div><br /></div><div>コネクタは環境によってというか、環境が存在する地域(リージョン)によってどこまで提供されているかは異なります。自分が利用している環境でどこまでのコネクタや機能が提供されているかの確認には、このあたりのアクションを利用すると便利です。</div><p style="text-align: left;"><br /></p><h2 style="text-align: left;">接続情報の作成機能</h2><p style="text-align: left;"><br /></p><div><b>接続の作成:</b>環境内の特定のコネクタの接続を作成します。</div><div><br /></div><div>環境周りの機能の一つなんですが、ちょっと特殊なアクションなのでここは個別に記載します。接続の作成アクションは、その名前の通りコネクタから利用する接続情報を新規に作成するためのアクションです。それを聞くと、じゃあクラウドフローを展開するときに接続情報を自動で作成することができるんじゃないか、なんて思われるかもしれません。</div><div><br /></div><div>しかしここでも冷静に考えてみてもらいたいのですが、クラウドフローを展開するときはそのほとんどがパッケージなどの形でエクスポート・インポートで展開し、その際に接続情報を指定することが多いです。また接続情報を作成する際には当然相手先サービスに接続するためのアカウントやパスワードといったセキュアな情報が必要です。セキュアな情報自体はKeyVaultなどに保存すればよいのでしょうが、そのようなセキュアな情報をクラウドフローに扱わせる場面は、なかなか思いつかないのが実情です。</div><div><br /></div><div>そしてもう一つ、これはおま環(お前の環境の問題)の可能性が高いのですが、作成先の環境ですでに別の接続情報が存在している場合、デザイナー上でアカウント情報の設定が求められない状況になります、</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_UWMWhAebHiw-Ru3wg71lyH5iv0RRkbvznXBU4fO0x9ZKFDV4Im9W4tCHeVk3aEuf9bvYDH3g9EtveFZ4igBxHy0_eyR3FLdBzzvI2IF2tsBpZonOh2USSIIUisf1gv-hSELqYaxk1ih7SqkyecbajubaFTwLArXmKIdbP7qlTAts5F80Mai28aH-/s686/connectioncreate.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="505" data-original-width="686" height="236" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_UWMWhAebHiw-Ru3wg71lyH5iv0RRkbvznXBU4fO0x9ZKFDV4Im9W4tCHeVk3aEuf9bvYDH3g9EtveFZ4igBxHy0_eyR3FLdBzzvI2IF2tsBpZonOh2USSIIUisf1gv-hSELqYaxk1ih7SqkyecbajubaFTwLArXmKIdbP7qlTAts5F80Mai28aH-/s320/connectioncreate.png" width="320" /></a></div><br /><div>上記のキャプチャは、Twitterの接続情報作成とSharepointの接続情報作成時になります。Twitterは私もよく利用しているので、対象の環境にはすでに接続が存在しています。この場合はアカウント情報を入力できませんでした。対して接続情報を作成していなかったSharePointの場合はデザイナー上でアカウント情報を入力できました。この動きの違いが、予想しているようなすでに接続情報があるかどうかに由来しているかまでは確認ができていません。ですがこういう動きがあり得る以上、利用する場合は注意が必要です。</div><p style="text-align: left;"><br /></p><h2 style="text-align: left;">クラウドフローの管理機能</h2><p style="text-align: left;"><br /></p><div><div><b>フローを取得する:</b>環境内で指定されたフローを取得します。</div><div><b>フローを管理者として取得する:</b>管理者アクセス権のある環境から指定されたフローを取得します。</div><div><b>フローの作成:</b>フローの作成</div><div><b>フローを更新する:</b>環境内で指定されたフローを更新します。</div><div><b>フローを削除する:</b>環境内で指定されたフローを削除します</div><div><b>削除されたフローを管理者として復元する:</b>管理者のアクセス権を持つ環境で、論理的に削除された指定のフローを復元します。</div></div><div><br /></div><div>クラウドフローの取得や新規作成、更新削除といったことを行う機能です。クラウドフローをJSON形式で取得し、部分的に書き換えて新規に作成するといったことが可能です。削除しても復元が用意されているので一安心といったところだと思います。</div><div><br /></div><div>この機能もなかなか使いどころが思いつかないところですが、定期的に処理内容を調整する必要のある場合、クラウドフロー上でその処理をIFとか利用して定義しておくことも可能ですが、こちらの機能を用いてクラウドフローの定義自体を定期的に書き換える、という使い方はアリかもしれません。</div><div><br /></div><div>私が実際に利用していたのは、先の例にあったコネクタ一覧の作成においてです。コネクタは環境によって提供されるものが異なると書きましたが、付け加えると最新のコネクタはプレビュー環境(アメリカの環境の一つ)にまず提供が行われます。この環境は試用版として作成するのですが、試用版環境は30日が経過すると削除される仕様があります(一時的に延長することは可能です)。削除されるとなるとどうするかですが、既存の試用版環境を削除して新しく試用版環境を作成し、その環境からコネクタ一覧を取得するということをやっていました。</div><div><br /></div><div>環境を作る部分はやればできそうだったのですが手間が多そうだったので、コネクタ一覧を取得する際に「現在存在している環境一覧を取得し試用版環境を見つける」という処理を頭にかませていました。そうすることで、定期的にコネクタ一覧を取得するアクションを再設定する必要がなくなったのでちょっとは楽にできたものです。</div><div><br /></div><div>現実の場面でこのようなケースがあるかは何とも言えないところですが、似たように定期的にクラウドフローを変更しないといけない場面があるのであれば、このアクションの利用を検討してもよいと思います。</div><p style="text-align: left;"><br /></p><h2 style="text-align: left;">最後に</h2><p style="text-align: left;"><br /></p><div>提供されているアクションについて、いろいろと思うところを書いてみました。機能としては確かに管理を行う場面では必要に思えるでしょう。ですが冷静になって、「その管理機能はクラウドフローで実行するほどのものか」、と一度よく考えてみてそのうえで必要になったらこのコネクタを利用してみるのがよいと思います。</div><div><br /></div><div>個人的にはすべてを自動化することは必ずしもよいことだとは思っていません。どちらかといえば、そもそもその作業って必要なんだっけ、というラインから考えていくのがよいと思っていますので、深く考えずに自動化を進めることは対処療法を行っているようなもの、と頭の片隅にでも置いておくとよいのではないでしょうか。</div><div><br /></div><div><br /></div>Ahfhttp://www.blogger.com/profile/01553064540426163049noreply@blogger.com0tag:blogger.com,1999:blog-3357313501722746592.post-66789922262214329062019-11-07T12:17:00.001+09:002019-11-07T12:17:40.694+09:00Power Automate の UI Flow 現時点でのとりまとめ<p>Microsoft Ignite で発表された Microsoft Flow から Power Automate への変更。名称変更によるインパクトもありましたが、何といっても多くの人が気になっているのが RPA<br />
を可能にする新機能 UI Flow だと思います。ある程度触ってみて、わかったことをまとめておきます。</p><br />
<a name='more'></a><br />
<br />
<p>まず UI Flow ですが、利用するための条件が色々あります。<a href="https://docs.microsoft.com/en-us/flow/ui-flows/setup"
target="_blank">公式ドキュメント</a>はプレビューな内容ですが、参考になります。なお、私が試している環境は、Azure 上に構築した Windows 10 Insider な VM を利用しています。<br />
</p><h2>必ず必要なもの</h2><ul> <li>組織アカウント<br>(Azure Active Directory に登録してあるアカウント)</li>
<li>Chrome ブラウザか Chromium 版 Edge ブラウザ</li>
<li>CDS 利用可能な環境とライセンス<br>(CDS 必須なためプレビュー環境では利用できません)</li>
<li>UI Flow Apps<br>(UI Flow を作成しようとしたときに、ローカルへインストールを求められます)</li>
<li>Common Data Service ソリューション環境<br>(現時点ではソリューション上でないと UI Flow を呼び出せない)</li>
</ul><h2>Web用 Ui Flow 作成時で必要なもの</h2><ul> <li>Selenium IDE<br>(UI Flow を作成しようとしたときに、ブラウザ拡張としてインストールを求められます)</li>
</ul><p>デスクトップ用 UI Flow 作成時では、上記の UI Flow Apps がインストールされていれば大丈夫です。</p><h2>UI Flow 実行時で必要なもの</h2><ul> <li>オンプレミスデータゲートウェイ</li>
</ul><p>作成時では不要ですが、実行時にはオンプレミスデータゲートウェイが必要です。これは Power Automate<br />
環境とのやりとりが必要と考えると理解できます。セキュリティ設定的にも、オンプレミスデータゲートウェイを利用している場合は、受信ルールを変更する必要がないのもあり非常に楽です。</p><p>UI Flow は先にワークフローを作成する必要があります。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0G41smm1ykffgvPlILl8I5PWrqeNfL_g5Hgpy_2FkbmXiTMHyd_pqUvN7LNx50UHc7PRMw5AT8fWsmx2PMnOiiZoSyf3pbnXAuo2apFUPNTcN1iiNaf6cpsUHtclsPz32l-GrdtJ2rqs/s1600/CreateUIFlow1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0G41smm1ykffgvPlILl8I5PWrqeNfL_g5Hgpy_2FkbmXiTMHyd_pqUvN7LNx50UHc7PRMw5AT8fWsmx2PMnOiiZoSyf3pbnXAuo2apFUPNTcN1iiNaf6cpsUHtclsPz32l-GrdtJ2rqs/s320/CreateUIFlow1.png" width="320" height="132" data-original-width="993" data-original-height="409" /></a></div><p>作成するときは、マイフローのメニューから UI フローを選択します。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7c2W92rXs4NsPqQ80RkQ9Cz27__836QxuY948k3Ze4B3mobQWWdKsfLdh65W4FgYGfrtnMpPNrD6Z5sUbfAbkTn6iH9pvckHpbspjKkcAe814Hooe57W5zU9GOikqpUxZIrKusabOrLs/s1600/CreateUIFlow2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7c2W92rXs4NsPqQ80RkQ9Cz27__836QxuY948k3Ze4B3mobQWWdKsfLdh65W4FgYGfrtnMpPNrD6Z5sUbfAbkTn6iH9pvckHpbspjKkcAe814Hooe57W5zU9GOikqpUxZIrKusabOrLs/s320/CreateUIFlow2.png" width="320" height="151" data-original-width="1064" data-original-height="501" /></a></div><p>初期状態ではこのようになります。ここで UI フローの作成をクリックすると、Web 用 フローかデスクトップ用フローか、どちらを作成するのかを聞かれます。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3nApzZARsiLZVWOwiqo7uR-jOqWMrB7bdmIH0heYrlPrCxeJgkh3ah_4AGxi2b7lAN-ugom7qU_0fdHEVq9zLPlI8tybBlSMRGi_XBxwTwyVkddZx372BJbpOxPfZGTsOL_Kz6sESd2Q/s1600/CreateUIFlow3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3nApzZARsiLZVWOwiqo7uR-jOqWMrB7bdmIH0heYrlPrCxeJgkh3ah_4AGxi2b7lAN-ugom7qU_0fdHEVq9zLPlI8tybBlSMRGi_XBxwTwyVkddZx372BJbpOxPfZGTsOL_Kz6sESd2Q/s320/CreateUIFlow3.png" width="320" height="205" data-original-width="724" data-original-height="463" /></a></div><p>ここで選択したものにより、以降の操作などが変化します。</p><h2>デスクトップ用 UI Flow の作成</h2><p>デスクトップアプリを選択し、次へをクリックするとワークフローの名前を求められますので、適当に入力し、次へをクリックします。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVCfC9KopJQ6oZA53bCQZXdnaRFA-yWDyt_P3Nd7aCiey0DBkpUkOP2FPAfqlx16J6OglXfl72Gn7_SPZ_yJdFNWwx5m-CjaOH-dHE76wfg_ZMXY60HGS7UrNCurChgnhdIMHgaGUI-GM/s1600/CreateUIFlow4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVCfC9KopJQ6oZA53bCQZXdnaRFA-yWDyt_P3Nd7aCiey0DBkpUkOP2FPAfqlx16J6OglXfl72Gn7_SPZ_yJdFNWwx5m-CjaOH-dHE76wfg_ZMXY60HGS7UrNCurChgnhdIMHgaGUI-GM/s320/CreateUIFlow4.png" width="320" height="198" data-original-width="704" data-original-height="436" /></a></div><p>ワークフローの名前はこれまで通り、後で変更も可能です。次へをクリックすると、次は「入力フィールド」の設定です。入力フィールドとは、Power Automate の通常なワークフローから、UI Flow を呼び出す際に連携する値のことで、呼び出し元から渡した値で入力させるといった使い方になります。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHdZkOnSRid_9RP5fZvS1yaiAVSa7LAZmwV0suZQMhHxwnhaMbhh5ZDqualdWhqups0o3DlNQlFQZXelOPmyyxODuf_ibR0BTTaBEVmqpmi9djoZzLxUriMVBLuRPrwChjYzHkCqAr8LY/s1600/CreateUIFlow5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHdZkOnSRid_9RP5fZvS1yaiAVSa7LAZmwV0suZQMhHxwnhaMbhh5ZDqualdWhqups0o3DlNQlFQZXelOPmyyxODuf_ibR0BTTaBEVmqpmi9djoZzLxUriMVBLuRPrwChjYzHkCqAr8LY/s320/CreateUIFlow5.png" width="320" height="172" data-original-width="1470" data-original-height="789" /></a></div><p>新規追加をクリックすると、求めるフィールドの設定を求められます。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2OJLovlOwUk16hv1w-9KI_omwV4tMtUt5s8Bf2b978ggNnr-ZphYaF0OtK9pqa84agCBSy5h9SXZyCdOx0W22oDSzAQSImDt74V6S8QV1e7GRiXyQSF0T0UZuazQM07PwZ8k4dFIcAj8/s1600/CreateUIFlow6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2OJLovlOwUk16hv1w-9KI_omwV4tMtUt5s8Bf2b978ggNnr-ZphYaF0OtK9pqa84agCBSy5h9SXZyCdOx0W22oDSzAQSImDt74V6S8QV1e7GRiXyQSF0T0UZuazQM07PwZ8k4dFIcAj8/s320/CreateUIFlow6.png" width="320" height="77" data-original-width="1144" data-original-height="276" /></a></div><p>ここで入力するものは「入力ラベル」「サンプルデータ」「説明」の3点で、Power Automate で UI Flow を呼び出す際、デザイナー上に表示されるものとなります。値を渡す必要がなければ未設定で構いません。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmbexDz6XpXQT5dkrB4mHY03NS7PHKctc1sJhZZIcIabjFmwnXqDRdk7CpX5pjFA33siCn91t4h5m5siYbwLIHfZoUQHP6XVDseJyfVguLeQwo1ZVyiPMNgLxBG7T2KcvgHGDO4_HqCEU/s1600/CreateUIFlow7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmbexDz6XpXQT5dkrB4mHY03NS7PHKctc1sJhZZIcIabjFmwnXqDRdk7CpX5pjFA33siCn91t4h5m5siYbwLIHfZoUQHP6XVDseJyfVguLeQwo1ZVyiPMNgLxBG7T2KcvgHGDO4_HqCEU/s320/CreateUIFlow7.png" width="320" height="209" data-original-width="1140" data-original-height="746" /></a></div><p>フィールドの次は UI Flow<br />
のワークフロー設定です。初期状態では上記のようなワークフローとなっていて、トリガとアクションが一つずつ用意されています。アクションのところが、実際の操作を記録させ最終的にワークフローに変換したものとなります。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkIQn7O983jR_W4XIjIoZW_SSMrjKaL6aw37bUOjudT-O5bglYsEDcO8Rfau0dvs-q1OoqFodxWipbnIgUEtcsxHMlxjNG4IFPsL4t_X_JjfpbjYHH0uDMhrjmqVuyhMrUhbV5Z4norVc/s1600/CreateUIFlow8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkIQn7O983jR_W4XIjIoZW_SSMrjKaL6aw37bUOjudT-O5bglYsEDcO8Rfau0dvs-q1OoqFodxWipbnIgUEtcsxHMlxjNG4IFPsL4t_X_JjfpbjYHH0uDMhrjmqVuyhMrUhbV5Z4norVc/s320/CreateUIFlow8.png" width="320" height="210" data-original-width="1141" data-original-height="747" /></a></div><p>Recording となっているアクションを開くと、レコーダーの起動がありますので、それをクリックします。そうすることで操作を記録させるツールが起動します。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSMRMTOcjGfyHugEyvbB7WGh97mJZltaIg-UuucDRiOj_8-utEoiypfWZHEBdDB9Ywf7m19UjrCvfS-eEvNiVBbJ1GVuHhigMwNxU9g9n_HrS4tMFTHskfqdOBBbcV_qCEQ8oRq32Jn30/s1600/CreateUIFlow9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSMRMTOcjGfyHugEyvbB7WGh97mJZltaIg-UuucDRiOj_8-utEoiypfWZHEBdDB9Ywf7m19UjrCvfS-eEvNiVBbJ1GVuHhigMwNxU9g9n_HrS4tMFTHskfqdOBBbcV_qCEQ8oRq32Jn30/s320/CreateUIFlow9.png" width="320" height="182" data-original-width="1473" data-original-height="838" /></a></div><p>起動するとこのような感じになります。画面上部に捜査記録用のツールが起動しているのが見えるかと思います。ここで起動しない場合、UI Flow Apps が起動していないことが考えられますので、タスクトレイにアイコンが潜んでいるかをチェックしてみてください。またプレビュー状態ということもあり、他の理由も考えられますがそのうち情報が公開されたり、修正が行われるものと思っています。<br />
</p><p>ツール上の Record をクリックすると、そこからの操作が記録開始となります。一通り操作を行い、Done をクリックすると操作内容がワークフローに展開されます。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRgqO6XG14cQEhR5CF2LTA-S8SAbukihdAxBIwzQJmIG1BedCibQV_WNBc-ID2D7jCJuXdcAS6FdKWlvUyDlprjQofp4i1HmQDuK6BvdvlV3M9uoS7__s5grvbNojI8mEjKzE3h4ylmfE/s1600/CreateUIFlow10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRgqO6XG14cQEhR5CF2LTA-S8SAbukihdAxBIwzQJmIG1BedCibQV_WNBc-ID2D7jCJuXdcAS6FdKWlvUyDlprjQofp4i1HmQDuK6BvdvlV3M9uoS7__s5grvbNojI8mEjKzE3h4ylmfE/s320/CreateUIFlow10.png" width="249" height="320" data-original-width="695" data-original-height="892" /></a></div><p>例えば、Windows10 の検索で電卓を検索して起動、その後ポチポチとしていたような場合は、このようなワークフローに展開されます。恐らくは利用するアプリが切り替わる単位でスコープが区切られるのではないか、と思います。なおこのように展開されたワークフローは、直接編集が可能です。<br />
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha6PVVF5POzCqgco8sOUt2GwQv61cnCCw4DW5k5wmneMH6_TQaSXLfAX9tNZiq9KpTjljeezbVNEkjmS00KiDNUdm654Q8Kz8obZdeAXAjVI0eFXQWVY4D4zpQViEiFrlekR4q6nO4duQ/s1600/CreateUIFlow11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha6PVVF5POzCqgco8sOUt2GwQv61cnCCw4DW5k5wmneMH6_TQaSXLfAX9tNZiq9KpTjljeezbVNEkjmS00KiDNUdm654Q8Kz8obZdeAXAjVI0eFXQWVY4D4zpQViEiFrlekR4q6nO4duQ/s320/CreateUIFlow11.png" width="282" height="320" data-original-width="509" data-original-height="578" /></a></div><p>アプリの起動であれば、このような項目が設定可能です。また、マウスの操作では実際に操作している時のスクリーンキャプチャが表示され、何を行うのかが視認可能です。不要な操作を削除するのは、アクションの削除と同じで各アクションの右上メニューから削除が行えます。<br />
</p><p>操作の記録が終わり、ワークフローの調整が終わったら、下に表示されている次へをクリックします。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjib5cjY9zQTwWtVfUzfRkDWkON996vUiktGSRQGXba_pHVBAUo5be9K-Hx86yEDGxehVUhHx6PXIG1SP3YGlBdO6KUu5xf2YHQBhz4b3Yke-UAMXL71gCatHIu6ynoQU6Fle8D7Ix34HY/s1600/CreateUIFlow12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjib5cjY9zQTwWtVfUzfRkDWkON996vUiktGSRQGXba_pHVBAUo5be9K-Hx86yEDGxehVUhHx6PXIG1SP3YGlBdO6KUu5xf2YHQBhz4b3Yke-UAMXL71gCatHIu6ynoQU6Fle8D7Ix34HY/s320/CreateUIFlow12.png" width="320" height="209" data-original-width="1145" data-original-height="748" /></a></div><p>次に設定するのは出力フィールドです。これは入力フィールドの反対で、UI Flow からワークフローへ値を戻す際の設定です。この項目の設定は、操作の記録中に行う必要があります。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwQpG2j0c6j1afhF6GoT7qxdi0Zncls-kP2ce_AkzFUjP0BQKnwnj9Q44V4MIONtJeXA-y3JU_dOn83CQlZ4gdeLLVErV5IWvMQ4tc6jL5MLby2nUy88L3zxfecjNpuE8O6teZWruKZkA/s1600/CreateUIFlow13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwQpG2j0c6j1afhF6GoT7qxdi0Zncls-kP2ce_AkzFUjP0BQKnwnj9Q44V4MIONtJeXA-y3JU_dOn83CQlZ4gdeLLVErV5IWvMQ4tc6jL5MLby2nUy88L3zxfecjNpuE8O6teZWruKZkA/s320/CreateUIFlow13.png" width="320" height="212" data-original-width="1275" data-original-height="846" /></a></div><p>記録中に、Get Output をクリックすると、出力フィールドの設定が行えます。フィールドの名前を入力し、実際に返却したい値を画面の対象項目をクリックして選択します。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj51aXpAYrJjP35auNHzFxIu2qtOiaxYNapROYVBwJPxk9sP1LXYj0zWHMPyt84ICevM8YXmhgoXRzaxBSVKOYXD7Nx0daTwciG7UwJlxpwpi3oHovQ7m58RFTxphJXYqr86Bq22m9_kcM/s1600/CreateUIFlow14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj51aXpAYrJjP35auNHzFxIu2qtOiaxYNapROYVBwJPxk9sP1LXYj0zWHMPyt84ICevM8YXmhgoXRzaxBSVKOYXD7Nx0daTwciG7UwJlxpwpi3oHovQ7m58RFTxphJXYqr86Bq22m9_kcM/s320/CreateUIFlow14.png" width="320" height="233" data-original-width="1017" data-original-height="740" /></a></div><p>その後ワークフローへ戻ると、このように設定した出力フィールドの内容が反映されます。出力フィールドの設定が終わったら、次へをクリックして作成した UI Flow のテストを行います。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyttru-Cix_i3UZmUfe0DM6uAPiGAqtUoIlLuNoNkY26ld2B249sTmjWCaSTezQk-xkGfOeyNuwaQCuR8kW_ofebetI2mJJUIvmYVHwwGZzcD4m_hSrlwCd23nMU6UZ30q1SaHlgMo7uk/s1600/CreateUIFlow15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyttru-Cix_i3UZmUfe0DM6uAPiGAqtUoIlLuNoNkY26ld2B249sTmjWCaSTezQk-xkGfOeyNuwaQCuR8kW_ofebetI2mJJUIvmYVHwwGZzcD4m_hSrlwCd23nMU6UZ30q1SaHlgMo7uk/s320/CreateUIFlow15.png" width="320" height="244" data-original-width="966" data-original-height="737" /></a></div><p>入力フィールドを利用している場合は、値の入力を求められます。必要な入力を行ったら今すぐテストをクリックすると、作成した UI Flow のテスト実行が行えます。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOPMr20uiNzuPU7RAc0YOvKTrczLrnRyBK5v01Cl6GtQ9oJsx6oL2AcUDGJ4ezoYaSyLMaJgYvFNJBeAv2T1pEOrMec1Eep5SleW6MpjmLGZsmMoDjhha30ooDkHtIktebLif28a0a4do/s1600/CreateUIFlow16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOPMr20uiNzuPU7RAc0YOvKTrczLrnRyBK5v01Cl6GtQ9oJsx6oL2AcUDGJ4ezoYaSyLMaJgYvFNJBeAv2T1pEOrMec1Eep5SleW6MpjmLGZsmMoDjhha30ooDkHtIktebLif28a0a4do/s320/CreateUIFlow16.png" width="320" height="222" data-original-width="1069" data-original-height="743" /></a></div><p>テスト実行して問題があれば、各アクションの調整や再度操作記録を作成する必要があります。問題がなければ保存して終了します。</p><p>これでデスクトップアプリ用の UI Flow は作成完了です。通常のワークフローから呼び出すことで、操作を開始することができるようになります。</p><h2>Web 用 UI Flow の作成</h2><p>Web 用では Selenium IDE を利用して、RPA を行います。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIYx05camK_VWaL7pz1Wa-AVrR2O7fQyERh6CIDcIGxuZykYFZGbjQwrFFx0WdFWnLrd_XE-frTvFAuI3o91Pu45TGLqH_NF1QNVx7y5ew0lOfM11AUmTOslqaHEgS7x3TvSFTzd3HrfA/s1600/CreateUIFlow20.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIYx05camK_VWaL7pz1Wa-AVrR2O7fQyERh6CIDcIGxuZykYFZGbjQwrFFx0WdFWnLrd_XE-frTvFAuI3o91Pu45TGLqH_NF1QNVx7y5ew0lOfM11AUmTOslqaHEgS7x3TvSFTzd3HrfA/s320/CreateUIFlow20.png" width="320" height="197" data-original-width="706" data-original-height="435" /></a></div><p>Web 用の場合は、ワークフローの名前と開始時に開く Web サイトの URL が必要です。入力してレコーダーの起動をクリックします。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtPVHRGMcecjwXVg0HZWyQLIVl3_TA6AW9JSFHyFUKu1Kwd-eOm8_1fEjrxGtlrDocAz2pYsOli5n7sOVC1nckX9MFDetIYYg6iWTUo4J4MU5qk0AGzV_49JVEXHzFhFfaJXBOSOCLaSQ/s1600/CreateUIFlow21.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtPVHRGMcecjwXVg0HZWyQLIVl3_TA6AW9JSFHyFUKu1Kwd-eOm8_1fEjrxGtlrDocAz2pYsOli5n7sOVC1nckX9MFDetIYYg6iWTUo4J4MU5qk0AGzV_49JVEXHzFhFfaJXBOSOCLaSQ/s320/CreateUIFlow21.png" width="320" height="180" data-original-width="1473" data-original-height="827" /></a></div><p>レコーダーの起動をクリックすると、Selenium IDE が起動します。ここから先は、Web 開発を行っている方であれば利用されてる方も多いであろう、Selenium そのものです。</p><p>Selenium IDE 右上部にある REC をクリックすると、操作の記録が開始され、先に入力したベースの URL がブラウザで開かれます。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwNQnq2BHRbGGGJti8BCU_2T39OGR1AlhxnYbSOSccJLNphKOdGNiL5gtSQYJlmmWjhlEo9IMoRUJ_p8ekY12RVi7sXH4iV0WX0Iysf5Q77P4ty3DsE8x5W4k8XSD4V1540iiX1aQdAFQ/s1600/CreateUIFlow22.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwNQnq2BHRbGGGJti8BCU_2T39OGR1AlhxnYbSOSccJLNphKOdGNiL5gtSQYJlmmWjhlEo9IMoRUJ_p8ekY12RVi7sXH4iV0WX0Iysf5Q77P4ty3DsE8x5W4k8XSD4V1540iiX1aQdAFQ/s320/CreateUIFlow22.png" width="320" height="198" data-original-width="881" data-original-height="544" /></a></div><p>ブラウザ上で各種操作を行った後で、再度右上部の STOP REC をクリックします。そうすると Selenium IDE 上にここまでの操作が展開されます。</p><p>デスクトップ版 UI Flow であった、入力/出力フィールドですが、Selenium IDE 上で直接設定を行う櫃よぐあります。例えば Store 系のコマンドを利用したものが入力/出力フィールドに対応していますので、IDE 上で直接記載を行います。このあたりは<a href="https://docs.microsoft.com/en-us/flow/ui-flows/inputs-outputs-web" target="_blank">公式ドキュメント</a>でも触れられていますので参考にしてください。</p><p>Selenium IDE 上での入力が終わったら、右上の保存ボタンをクリックします。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMxtxJiwawbtVMWuR9aL4qo_kvDTMGOBz4tnznc7OvPrPkMEHhSAByffeLeeCpVh9W-1QwGWEaaElDCebrL4kkzozpqu3rqVYec5pqDuJHCZc1C6BIXragddn4wfhcGRkyTSHuZbprIW8/s1600/CreateUIFlow23.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMxtxJiwawbtVMWuR9aL4qo_kvDTMGOBz4tnznc7OvPrPkMEHhSAByffeLeeCpVh9W-1QwGWEaaElDCebrL4kkzozpqu3rqVYec5pqDuJHCZc1C6BIXragddn4wfhcGRkyTSHuZbprIW8/s320/CreateUIFlow23.png" width="320" height="129" data-original-width="983" data-original-height="396" /></a></div><p>デスクトップ用 UI Flow と違い、Web 用 UI Flow では、Selenium IDE 上での設定がすべてで、Power Automate 側で調整などは行えません。フローの詳細画面もありませんので、直接 Selenium IDE でやりくりすることになります。</p><h2>作成した UI Flow の実行</h2><p>作成した Ui Flow を実行するには、ソリューション環境上で Power Automate のワークフローを作成します。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSrrvjOscB1p7nIe03_Z_5OWc06gRGMJ8cRd-py3ndHXkiSI1Qj0VALvySkmXiJRbbN9PuW3ek1Hwnhe-OpqmKp6rybOigR8A653v1I9p1DEVs034CUrJKiiXYS4xnpt9KEQoMurLTrkQ/s1600/CreateUIFlow31.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSrrvjOscB1p7nIe03_Z_5OWc06gRGMJ8cRd-py3ndHXkiSI1Qj0VALvySkmXiJRbbN9PuW3ek1Hwnhe-OpqmKp6rybOigR8A653v1I9p1DEVs034CUrJKiiXYS4xnpt9KEQoMurLTrkQ/s320/CreateUIFlow31.png" width="320" height="122" data-original-width="1088" data-original-height="416" /></a></div><p>ソリューション一覧から、Common Data Service Default Solution をクリックします。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6ftNmsbVVfnqjZKy1QDQOGZIjo7U_ihhlMZYKqoP5sJH_C73CvB_IAztqNIykRu9T-458vZBjUqmG8g75tVjCwsv9cOZJKBOQPOZm8BABEYQgTBkospScr0-4ygYaXrtaYLXTnXUY3rM/s1600/CreateUIFlow32.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6ftNmsbVVfnqjZKy1QDQOGZIjo7U_ihhlMZYKqoP5sJH_C73CvB_IAztqNIykRu9T-458vZBjUqmG8g75tVjCwsv9cOZJKBOQPOZm8BABEYQgTBkospScr0-4ygYaXrtaYLXTnXUY3rM/s320/CreateUIFlow32.png" width="320" height="123" data-original-width="1052" data-original-height="403" /></a></div><p>何も作成していなかった場合はこのような表示です。とりあえず新しいワークフローを作成します。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWYBi8PI9hRFyQt9ggZKmST2uI8q-MPz8F2aeUK-8VeKDMYXAFhK9u5guORicrDOXd1lSURv7f-vwvjVMH1lp1UB9XOh8pIH7EaYnvCnnTw-rNjjJiSXQQVVruu07ne8xXtiE4YCWLfxQ/s1600/CreateUIFlow33.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWYBi8PI9hRFyQt9ggZKmST2uI8q-MPz8F2aeUK-8VeKDMYXAFhK9u5guORicrDOXd1lSURv7f-vwvjVMH1lp1UB9XOh8pIH7EaYnvCnnTw-rNjjJiSXQQVVruu07ne8xXtiE4YCWLfxQ/s320/CreateUIFlow33.png" width="320" height="129" data-original-width="1129" data-original-height="454" /></a></div><p>ソリューション上のワークフローでは、UI Flow を呼び出すためのコネクタが用意されていて、デスクトップ用/Web用 UI Flow の呼び出しを行うアクションが用意されています。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB0DZDaS2dN6xgf4VKVPpvcUr6g9bgL4RLsBUC6atw-pBu5j98c9Fkyn5gnLOh16sn3b1uWCRpKO0waFNxSiOflBPEgf2ngloCrgDSwnSLGBeS8KWhljG-h-gRzcWfXjKNC0DHHw304Fc/s1600/CreateUIFlow34.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB0DZDaS2dN6xgf4VKVPpvcUr6g9bgL4RLsBUC6atw-pBu5j98c9Fkyn5gnLOh16sn3b1uWCRpKO0waFNxSiOflBPEgf2ngloCrgDSwnSLGBeS8KWhljG-h-gRzcWfXjKNC0DHHw304Fc/s320/CreateUIFlow34.png" width="320" height="193" data-original-width="487" data-original-height="293" /></a></div><p>デスクトップ用 Web 用 どちらの UI Flow でも、呼び出す際にはオンプレミスデータゲートウェイ経由での接続が必要です。データゲートウェイの接続設定を求められますので、必要事項を入力します。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlkhzEpr5YGPuoGSsDXjW3-X2dn9Kv4KywZ9PDZff5UZlo_wXlcgy9itAJNl1CI4jQW1Aavw11OCvTl7T-EVEHbl7LnxmLGYkHHhk-0Ic5xs67KWqMt4UW5Thcg_4c8dXxKt08fMe8XZY/s1600/CreateUIFlow35.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlkhzEpr5YGPuoGSsDXjW3-X2dn9Kv4KywZ9PDZff5UZlo_wXlcgy9itAJNl1CI4jQW1Aavw11OCvTl7T-EVEHbl7LnxmLGYkHHhk-0Ic5xs67KWqMt4UW5Thcg_4c8dXxKt08fMe8XZY/s320/CreateUIFlow35.png" width="320" height="98" data-original-width="488" data-original-height="149" /></a></div><p>Web 用 UI Flow 呼び出しでは、呼び出す UI Flow 名と実行するブラウザの種類を選択します。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio2e31WYhx72-Zgpoy_lDGZhQ6t9R8A0mNN2od6oJExLWBrzxgCTRqzTOYBsHBrFv4Q9UG5IeVMfJsDFOVix0lwOsrznnpTMfhKLD4CHObmSpnIDLa8nEGmfWC0povx9hV75lPT6oogr4/s1600/CreateUIFlow36.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio2e31WYhx72-Zgpoy_lDGZhQ6t9R8A0mNN2od6oJExLWBrzxgCTRqzTOYBsHBrFv4Q9UG5IeVMfJsDFOVix0lwOsrznnpTMfhKLD4CHObmSpnIDLa8nEGmfWC0povx9hV75lPT6oogr4/s320/CreateUIFlow36.png" width="320" height="81" data-original-width="483" data-original-height="123" /></a></div><p>デスクトップ用 UI Flow 呼び出しでは、呼び出す Ui Flow 名を選択します。</p><p>また、デスクトップ/Web 双方で入力フィールドを設定している場合は、上記のようにデザイナー上で値の設定欄が追加表示されます。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYdF7Otkjs0Olodq60CAOkGJol406E1yTUEOEopUER7jfT2EEZDL0UyWsQtx5vANkF9YK0D2PzRQXqnQo_K9v5tD5JAbVsgMrZPpyPiTdFVz4WPR4gOZwHAfdaJ33r71olwueJHJLeyH4/s1600/CreateUIFlow37.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYdF7Otkjs0Olodq60CAOkGJol406E1yTUEOEopUER7jfT2EEZDL0UyWsQtx5vANkF9YK0D2PzRQXqnQo_K9v5tD5JAbVsgMrZPpyPiTdFVz4WPR4gOZwHAfdaJ33r71olwueJHJLeyH4/s320/CreateUIFlow37.png" width="320" height="193" data-original-width="818" data-original-height="494" /></a></div><p>出力フィールド設定を行っている場合は、後続の処理でダイアログに表示されますので、いつも通りの方法で結果の利用が可能です。</p><p>このような形で UI Flow は利用が可能です。デスクトップ用と Web 用で、設定する方法が全然違うので慣れが必要ですが、何かしらの自動操作を行うイメージはついたのではないでしょうか。実際の場面では、入出力フィールドを絡めて操作する内容を調整することも行えますので、汎用的な対応が可能です。是非色々触ってみてください。<br />
</p>Ahfhttp://www.blogger.com/profile/01553064540426163049noreply@blogger.com0tag:blogger.com,1999:blog-3357313501722746592.post-87512547395434113722019-10-11T16:37:00.000+09:002019-10-11T16:37:21.249+09:00Logic Apps でワークフローのアクション名を列挙する<p>Logic Apps や Flow を利用していると、時々 JSON 値のキー名がわからない場面に遭遇します。例えば Flow のテンプレート情報や、Logic Apps / Flow のワークフロー定義を参照してあれこれやろうとすると遭遇する問題です。今回、ワークフロー定義をもとにアクション名の列挙を行おうとして、JSON 値のキー名を列挙してみたのでそのやり方をメモしておきます。<br />
</p><a name='more'></a><br />
<p> Logic Apps や Flow のワークフロー定義は、CodeView や Flow Management コネクタ、または REST API による取得が可能です。その際の取得結果は、大体月のような構造になります。<br />
</p><p> <script src="https://gist.github.com/ahf0124/9051cd322b9152b700cee19925e6f2ed.js"></script><br />
</p><p> ワークフロー上のアクションは、definition\actions の値として配列な形で記載されます。この時のキー名はデザイナー上で命名したものが利用されますので、どのようなキー名となるかは固定できません。そのためワークフロー上でこの JSON 値を利用しようとすると、非常に厄介です。今回はこのアクション情報を、1次元の配列に鳴らした形に変換します。<br />
</P><p>作成した変換用ワークフローの全体図は次のようなものです。<br />
</p><p> <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhV51KLrww80-V-Rou2m1WKaW_ycEHOvdbsOj_-5ULdQIp0bw9yH-yRLTEbSZrGSp29DNJwhIHFG2mwJnGfxvUqQY7thwXphYH_6HkxL4UoMgCZY2HVmMxIpMtG6qBbpnBXIR3lYaO6Emk/s1600/EnumWorkflowActionsAll.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhV51KLrww80-V-Rou2m1WKaW_ycEHOvdbsOj_-5ULdQIp0bw9yH-yRLTEbSZrGSp29DNJwhIHFG2mwJnGfxvUqQY7thwXphYH_6HkxL4UoMgCZY2HVmMxIpMtG6qBbpnBXIR3lYaO6Emk/s320/EnumWorkflowActionsAll.png" width="320" height="295" data-original-width="1600" data-original-height="1475" /></a></div></p><p> JSON 値のキー名を単純に列挙するのは、Logic Apps の場合 InlineCode コネクタで JavaScript による処理を行うのが、最も楽です。次のコードだけで対応できます。<br />
</p><p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9qbG2qjJHf9VVrrIdZNc2v_l0iGjy2nu5l2BL4GP0YSQVDBbQGa3anSJYVg96qoUbbRhlSe96lrE1-CfE24eO66ooXzz4sbXKAqXR5ThvYSXbVXLT6yVYcmi_2JPF61gJSaame5iH3X4/s1600/InlineCode.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9qbG2qjJHf9VVrrIdZNc2v_l0iGjy2nu5l2BL4GP0YSQVDBbQGa3anSJYVg96qoUbbRhlSe96lrE1-CfE24eO66ooXzz4sbXKAqXR5ThvYSXbVXLT6yVYcmi_2JPF61gJSaame5iH3X4/s320/InlineCode.png" width="320" height="159" data-original-width="630" data-original-height="313" /></a></div> <pre>Object.keys(workflowContext.trigger.outputs.body.actions)</pre></p><p> このように Object クラスの Keys メソッドを利用すると、キー名の列挙が行えます。ただし、子要素については列挙されませんので、その部分をどうするかが一番の問題となります。そこで今回は、列挙できたキー名に対してそれぞれ actions という子要素があるかどうかチェック、ある場合は子要素の解析を行うという処理方法を採用しています。<br />
</p><p> <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPNENhYF6_kB16rO63kQD10wTsoLmkYKtJf2JVJl0s5TyVHpSfK2HldW98tWgW7we3KhRblt1EpgSW16v4IOp7kEp-i6YHwKSm5lG2Hruje88xySii4rkJUF8VmtCvvgeBg0cKmA-sNVI/s1600/EachKeyNames.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPNENhYF6_kB16rO63kQD10wTsoLmkYKtJf2JVJl0s5TyVHpSfK2HldW98tWgW7we3KhRblt1EpgSW16v4IOp7kEp-i6YHwKSm5lG2Hruje88xySii4rkJUF8VmtCvvgeBg0cKmA-sNVI/s320/EachKeyNames.png" width="320" height="150" data-original-width="1284" data-original-height="603" /></a></div></p><p> 列挙したキー情報を指定して、For Each にてループを作成します。これで各要素に子要素があるかを判断させるようにします。ただし、InlineCode コネクタの処理結果は文字列として連携されてきますので、結果に対して Array 関数で明示的に配列へと変換したうえでループを行う必要があります。<br />
</p><p> 子要素の存在チェックですが、次のような聞き方をしています。<br />
</p><p> <pre>empty(triggerBody()?['actions']?[item()]?['actions'])</pre></p><p> 最初の HTTP Request トリガに渡されてきた値にある actions、その中に列挙できたキー名でアクセスしてさらに actions という子要素があるかどうか、という聞き方です。真ん中ほどの item() の部分が列挙されたキー名、その後に ? 演算子を付けた形で actions 子要素を参照しに行かせています。? 演算子を利用することで、実際には要素が存在していない場合でも実行時エラーになることを防いでおり、参照できた場合はその値、できなかった場合は空文字列が返却されてきます。そのため empty 関数で「値があるかないか」を判別させ、値がある=子要素がある、値がない=子要素がない、という形で判定を行います。<br />
</p><p> 子要素が存在した場合は、その子要素のキー名を列挙させる必要があります。サンプルのワークフロー定義でいうと、「ダミースコープ」というアクションの中には actions 要素があり、その中で実際に配置された子アクション「エラーとなる計算」が記載されているのがわかると思います。ここは簡単に処理する場合、IF アクションの中でさらに IF アクションで判定させる、とするのですが、Logic Apps や Flow の仕様上だと 8 階層まで深く作ることができてしまいます。そうすると IF を 8 階層組み上げることになるのですが、流石にそれはワークフローとして見づらいものとなります。<br />
</p><p> このような場合、プログラム開発を行ったことがある人であればお気づきでしょうが、再帰的処理、という方法を採用します。これは自分自身を呼び出す方法で、階層が深い場合には適した手法です。<br />
</p><p> <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2rq6tLd8keqbDhqBTpJKPcS-CvThRdNoLCyemcGr9lZ6IWQjnt6dXN1qPEGPIb-d3-2iP3kWHL84tVHpQMajt97jkb2BJIhViMoG2xJkcrOmEy2E9ldCecfTVuekSIlzfu0qnwg-h0WM/s1600/RecursiveCall.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2rq6tLd8keqbDhqBTpJKPcS-CvThRdNoLCyemcGr9lZ6IWQjnt6dXN1qPEGPIb-d3-2iP3kWHL84tVHpQMajt97jkb2BJIhViMoG2xJkcrOmEy2E9ldCecfTVuekSIlzfu0qnwg-h0WM/s320/RecursiveCall.png" width="257" height="320" data-original-width="690" data-original-height="858" /></a></div></p><p> IF が満たされた場合の処理、すなわち子要素が存在していた場合の処理として、自分自身を呼び出すように HTTP アクションを利用します。こうすることで、別インスタンスとして同じ処理を起動させ、子要素のものからキー名を列挙させることができます。<br />
</p><p> ここでの戻り値をどう処理するかですが、このワークフローでは最終的に配列な値をそのまま返却するように HTTP Response アクションを設定しています。<br />
</p><p> <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB1eX-BNWP_ssQ7ijtBYea6r_RXNu2BRcOw_TpR8artfE4ln13NDCr6KChyXv-Jbjhin6RQqxae7GKOIeR4eURcQB6ARxGNlWYKgS6NYLPUnT1E8aX4_yexblbUs0rOl79CbreDa3UEQM/s1600/HTTPResponse.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB1eX-BNWP_ssQ7ijtBYea6r_RXNu2BRcOw_TpR8artfE4ln13NDCr6KChyXv-Jbjhin6RQqxae7GKOIeR4eURcQB6ARxGNlWYKgS6NYLPUnT1E8aX4_yexblbUs0rOl79CbreDa3UEQM/s320/HTTPResponse.png" width="320" height="109" data-original-width="647" data-original-height="221" /></a></div></p><p> そのため再帰的に呼び出した時の結果はそのまま配列変数に追加したいのですが、まとめての追加は Union 関数を利用する必要があるのと、変数の設定アクションでは自分自身を指定することができない(変数 A の設定アクションでは、A の値を利用できない)ため、素直に For Each で処理結果をループさせて追加しています。<br />
</p><p> <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikSE9vbvGDgHgMzE1ZTLpE7iJlCEEjc77PvBq4GXRwKXljmRfMWbxcnmQ4B_nTGq3bZe5uJOd_JIhv2WD4ipkfiX8U0y9XKbHllqkcU1OPcSiNWzWGVnT54mq6KJpO6tcXCLUoGWtD23w/s1600/AddArrayForEach.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikSE9vbvGDgHgMzE1ZTLpE7iJlCEEjc77PvBq4GXRwKXljmRfMWbxcnmQ4B_nTGq3bZe5uJOd_JIhv2WD4ipkfiX8U0y9XKbHllqkcU1OPcSiNWzWGVnT54mq6KJpO6tcXCLUoGWtD23w/s320/AddArrayForEach.png" width="320" height="120" data-original-width="639" data-original-height="240" /></a></div></p><p>試しに Postman でワークフローを呼び出し、結果を確認してみると、ワークフロー定義の情報からアクションを列挙できているのがわかるかと思います。<br />
</p><p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwy5045D4RoRkVht0nlx8KhmxMr8FcKNnqZrynuRi3QDnx4Yzea9zaIewhjN7bC3PdOU_5p2KfoZ078Uoqj80TQ8gH3CbqK-MUT22sKWQBsedWyie8Khc2gPuyYwtY9qnwim3riHkoLnY/s1600/testcall.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwy5045D4RoRkVht0nlx8KhmxMr8FcKNnqZrynuRi3QDnx4Yzea9zaIewhjN7bC3PdOU_5p2KfoZ078Uoqj80TQ8gH3CbqK-MUT22sKWQBsedWyie8Khc2gPuyYwtY9qnwim3riHkoLnY/s320/testcall.png" width="320" height="215" data-original-width="949" data-original-height="638" /></a></div></p><p> このようなワークフローをくみ上げると、ワークフロー定義の JSON 情報を渡すことで、アクション情報を列挙することが可能です。これは特定の値だけを抽出して1次元配列に変換する、というパターンですので、色々と応用が利く場面があると思います。<br />
</p>Ahfhttp://www.blogger.com/profile/01553064540426163049noreply@blogger.com0tag:blogger.com,1999:blog-3357313501722746592.post-88656552369537526112019-08-29T12:41:00.001+09:002019-08-29T12:42:27.217+09:00LogicApps/Flow でコレクション間の差分を抽出する<p>Logic Apps や Flow では、配列やコレクションを扱う機会が非常に多く何かしらの操作をすることが多々あります。その中でもうまいやり方が見つかっていなかったコレクション間の差分(A と B の間で B のみに存在するデータ)を取得する方法で、フィルタ処理を利用したシンプルな方法が作成できましたので、メモ書きとして残します。<br />
</p><a name='more'></a><br />
<p>対象が配列の場合は、フィルタ処理のアクションを利用して簡単に指定できるのですが、コレクションの場合はそのままではフィルタ処理が行えません。そのため素直に処理を作成すると、ForEach を利用したループで 1 件ごとに存在するかチェックし、存在していなかったら変数に追加していく方法をとることも多いと思います。この形で要件は満たせるのですが、対象となるデータ件数が増えると飛躍的にアクション数と実行時間が増えてしまうのがネックです。特に Logic Apps の場合では、アクション数が増える=課金が増える ことに直結していますのでできる限りアクション数は押さえたい所です。<br />
</p><p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivoMY4pfz2FipihGr6v-o5iqUerWH0iKsDpbR03QHKraXassvCtOQP8O3iLaJmwzpIDS51qNsIrIL6N3GBA-0zB0gFMsiRYKmhXhrjY5V9508rgqmAATBbXoCXseLlWmcI-vW8-zbvBBg/s1600/arraydiff_before.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivoMY4pfz2FipihGr6v-o5iqUerWH0iKsDpbR03QHKraXassvCtOQP8O3iLaJmwzpIDS51qNsIrIL6N3GBA-0zB0gFMsiRYKmhXhrjY5V9508rgqmAATBbXoCXseLlWmcI-vW8-zbvBBg/s320/arraydiff_before.png" width="320" height="165" data-original-width="1189" data-original-height="613" /></a></div></p><p>今回の全体的な処理の流れは次のようになります。<br />
</p><p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-cfNYnOgm7xXfY7U221kFEVtW9EWixGkjWUuZWIPGMWzQ0WiKownblkt7V6jXlKWNOYZdfm3USo-UvbSdsR0BIGLJKXgExrODrAYKwwgSNSE9bMGadDfRSVSDxrH-Lt4IvkRCQ-KXVhA/s1600/arraydiff_flow.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-cfNYnOgm7xXfY7U221kFEVtW9EWixGkjWUuZWIPGMWzQ0WiKownblkt7V6jXlKWNOYZdfm3USo-UvbSdsR0BIGLJKXgExrODrAYKwwgSNSE9bMGadDfRSVSDxrH-Lt4IvkRCQ-KXVhA/s320/arraydiff_flow.png" width="299" height="320" data-original-width="631" data-original-height="676" /></a></div></p><p>今回のサンプルデータとして、JSON 値を持つ配列を次のように作成しています。<br />
</p><p><script src="https://gist.github.com/ahf0124/a242ed8256608235d93063082104a8ed.js"></script><br />
</p><p>A のコレクションには name という値に A, B, C, D, E と設定し、B のコレクションには A, B, C, E, F と設定し、差分が発生するように作成しています。A と B を比較して、A のみに存在する name = D となるものだけを取得してみます。 <br />
</p><p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgW-F3cNElkwaGwd5J0O6DrnFxntcqeVWXXWnZJPhCQ2bt-sg5F3vjtD0Dp0BnTIuMir6wyTWUbFSDv3QIkvBvObgl69kMRWz77TByPxuTL9fIVOgjv8YuSBbfjWkePQhb-DGYyjszAXqQ/s1600/arraydiff_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgW-F3cNElkwaGwd5J0O6DrnFxntcqeVWXXWnZJPhCQ2bt-sg5F3vjtD0Dp0BnTIuMir6wyTWUbFSDv3QIkvBvObgl69kMRWz77TByPxuTL9fIVOgjv8YuSBbfjWkePQhb-DGYyjszAXqQ/s320/arraydiff_1.png" width="320" height="110" data-original-width="620" data-original-height="214" /></a></div></p><p>そのためにはフィルタ処理を利用するのが最善のため、比較対象となる項目だけを抽出して配列を作成します。一度ヘッダ情報のない CSV 作成を行うことで、配列に変換できるデータが作成できます。<br />
</p><p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiP-XjNajuTVHSOrLS-5vPRGP6s95d1VHJedx9ZeTsRRnC-WHq2BnaxqZtVDi71fCh8c7v7k5ZBnUfL_Pdbn4N2i1R3iDqzPls8DtAlctulHUdNrncltBBC2V_c8-yH2jAq1ni6_R005vo/s1600/arraydiff_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiP-XjNajuTVHSOrLS-5vPRGP6s95d1VHJedx9ZeTsRRnC-WHq2BnaxqZtVDi71fCh8c7v7k5ZBnUfL_Pdbn4N2i1R3iDqzPls8DtAlctulHUdNrncltBBC2V_c8-yH2jAq1ni6_R005vo/s320/arraydiff_2.png" width="320" height="313" data-original-width="628" data-original-height="615" /></a></div></p><p>このような形で比較項目だけに限定して抽出できたので、これを配列に変換します。<br />
</p><p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc3hGS4LwwYh6vVBDH-SvqOM-oXK14nLoA2JBuuo_o1mZyMZsNmqnW3vvuipTB1U8xmektjjlV8GY4oSziSTxSsvsQfaQH_ODRCQOzPQBn4BB0MjvfW62ujYC5sAa8F6RzlCd9iOh9N58/s1600/arraydiff_3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc3hGS4LwwYh6vVBDH-SvqOM-oXK14nLoA2JBuuo_o1mZyMZsNmqnW3vvuipTB1U8xmektjjlV8GY4oSziSTxSsvsQfaQH_ODRCQOzPQBn4BB0MjvfW62ujYC5sAa8F6RzlCd9iOh9N58/s320/arraydiff_3.png" width="320" height="45" data-original-width="1023" data-original-height="145" /></a></div></p><p>split 関数を利用して配列へ変換するのですが、その時は Logic Apps や Flow での悩みの種である改行コードが付いて回るので、uriComponent 関数を利用して変換した結果から、改行ごとに分割して配列を作成するように記述します。<br />
</p><p><pre><b>split(uricomponent(body('AコレクションからCSVテーブルの作成')),'%0D%0A')</b></pre></p><p>配列が作成できたので、ようやくフィルタ処理が行えます。対象となるのはコレクション B を指定し、フィルタ条件としては次のように設定します。<br />
</p><p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2j9Pw7gBGd7XmIQgGs1mIHzqfdFCjQAi7LCctYsc-f9kQHTsCn8lM6hGsd3r3u5WV0FZnpU1YYoc4Dgac10R6A8OGA5oasUuduSxT1lZpP6926wNW-AoooP-f-ivz7HKcc95wfOzCY_s/s1600/arraydiff_4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2j9Pw7gBGd7XmIQgGs1mIHzqfdFCjQAi7LCctYsc-f9kQHTsCn8lM6hGsd3r3u5WV0FZnpU1YYoc4Dgac10R6A8OGA5oasUuduSxT1lZpP6926wNW-AoooP-f-ivz7HKcc95wfOzCY_s/s320/arraydiff_4.png" width="320" height="97" data-original-width="621" data-original-height="188" /></a></div></p><p><pre><b>contains(outputs('Aコレクションから比較要素のみで配列化'), item().name)</b></pre></p><p>上記の関数式の結果が False になれば、A コレクションには存在しない B コレクションだけのものと判断できます。このような形で処理を行うことで、コレクション間の差分をレコード数に関係なく 3 アクションで取得が可能です。contains 関数は対象が配列であれば、含む・含まないの判断が容易に行えますので、比較対象の値だけに絞った配列を作成することを活用してみてください。<br />
</p>Ahfhttp://www.blogger.com/profile/01553064540426163049noreply@blogger.com0tag:blogger.com,1999:blog-3357313501722746592.post-999835728588765112019-05-14T12:51:00.000+09:002019-05-14T12:53:36.926+09:00Logic Apps の InlineCode コネクタで JavaScript を利用する<p>今年の Build でアナウンスがありましたが、Logic Apps の新規コネクタとして Inline Code が発表されました。これは Logic Apps 環境上でちょっとした処理を動かすことのできるコネクタで、処理の記述には JavaScript が現在利用できます(将来的に C# と PowerShell が利用できるとの発表もありました)。そこで、実際に利用してみて感じた点をまとめてみました。<br />
</p><a name='more'></a><br />
<p>今回検証してみたのは、このような形の LogicFlow です。Inline Code コネクタでは、JavaScript による値のソートを行わせています。<br />
</p><p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN02Kc8QaIcXvm1DBeCUkC5Knf6XvvlujZBKq7BjCq44eNM0SwWKRxjk-LiutU21FLSia-k_p8PRwUOb3gbz8lI2wQ_N7Og-LNip-27cDNTgtbFo7Yv-hG8QpaxsM5Ewyf_u0eoSqqPIQ/s1600/icflow1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN02Kc8QaIcXvm1DBeCUkC5Knf6XvvlujZBKq7BjCq44eNM0SwWKRxjk-LiutU21FLSia-k_p8PRwUOb3gbz8lI2wQ_N7Og-LNip-27cDNTgtbFo7Yv-hG8QpaxsM5Ewyf_u0eoSqqPIQ/s320/icflow1.png" width="320" height="210" data-original-width="1020" data-original-height="668" /></a></div></p><p>Inline Code コネクタへ渡す値は、次のような JSON の配列値を用意しました。<br />
</p><p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGpgtrjC9xeBPhUS5gf9ml-GzthyphenhypheneyAq5ioZe4u5dWCGlE8qoBW0ZAheskbXUiJxQf1XBpvlQML8Muc5xQxpJXTn78RmmMkWW0PVt6sIJLeRDawfwp9VdiNtIfCGPjoDYkZ7rzhP4JjM8/s1600/icflow2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGpgtrjC9xeBPhUS5gf9ml-GzthyphenhypheneyAq5ioZe4u5dWCGlE8qoBW0ZAheskbXUiJxQf1XBpvlQML8Muc5xQxpJXTn78RmmMkWW0PVt6sIJLeRDawfwp9VdiNtIfCGPjoDYkZ7rzhP4JjM8/s320/icflow2.png" width="247" height="320" data-original-width="298" data-original-height="386" /></a></div></p><p>value という名前で、名前と年齢をもった JSON 値の配列が設定してあります。今回はこの配列を、年齢の降順でソートしてみました。その際の JavaScript を以下の様に記述します。<br />
</p><p><script src="https://gist.github.com/ahf0124/f1a61ba75258ef8a89c9d79936c89099.js"></script><br />
</p><p>LogicFlow から受け取る値は、<a href="https://docs.microsoft.com/ja-jp/azure/logic-apps/logic-apps-add-run-inline-code">workflowContext オブジェクト</a>として渡されてきます。このオブジェクトでは、実行している LogicFlow 名やそのトリガ情報、アクション情報が設定されており、ここを参照するだけでここまで処理されたデータなどを利用することが可能です。その際、ダイアログに表示されている値を選択して利用することも可能で、実際に選択するとサンプルコードのように workflowContext.actions.作成.outputs といった JavaSciprt での記述が自動で挿入できます。また、コードを記載するエディタ上ではインテリセンスが動きますので、VSCode や Visual Studio でコードを記載するのと同じように、入力補完が行われるのは非常に便利なところです。<br />
</p><p>例えば、今回は作成アクションを利用して value という名前の値に配列を設定しているので workflowContext.actions.作成.outputs.value という書き方をすることで、作成した JSON 値を参照することができます。<br />
</p><p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglHCdkskX52Sl99k4vbOxjx7sNGTbx_iChK04Dp1kvyNnvKTlpMa5SIH00Y9KnVgu6JDdqHq-F15s8cCdX4LhmmOcFQSbWTz-m8mdeMAgcVSPxexTgqLrxsqNhfIo_7BqRA5AuuIP8q2o/s1600/icflow4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglHCdkskX52Sl99k4vbOxjx7sNGTbx_iChK04Dp1kvyNnvKTlpMa5SIH00Y9KnVgu6JDdqHq-F15s8cCdX4LhmmOcFQSbWTz-m8mdeMAgcVSPxexTgqLrxsqNhfIo_7BqRA5AuuIP8q2o/s320/icflow4.png" width="320" height="215" data-original-width="620" data-original-height="417" /></a></div></p><p>実際の実行結果は上記のようになります。JavaSciprt 側で処理した結果が、予定した通りソートされているのが確認できます。このような感じで、これまで Logic Apps だけでは対応が難しかった場面で、JavaScript での処理を利用することができます。Azure Functions を作成することなく対応ができるようになりますので、さらに気楽に活用できるのではないでしょうか。<br />
</p><p>なお、現時点の仕様として外部モジュールの読み込みは提供していません。例えばハッシュ値の算出や暗号化を行う際に利用する crypto モジュールなどは、現時点では利用することができません。ある程度設定できるようになるとありがたいのですが・・・。<br />
</p><p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3Pg5nLz2B139h5iuPnVdhQW7jlYFvvCBotmXchM5EZ8fZt6NXL7tAdzKm6b2pEz8y2LjZnyDm91jU5kGtfe328xedrzKIXdsIvjqBLmCbbY7vaWqpZHN32czP4XgJPGcBT490XLbyjDc/s1600/icflow5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3Pg5nLz2B139h5iuPnVdhQW7jlYFvvCBotmXchM5EZ8fZt6NXL7tAdzKm6b2pEz8y2LjZnyDm91jU5kGtfe328xedrzKIXdsIvjqBLmCbbY7vaWqpZHN32czP4XgJPGcBT490XLbyjDc/s320/icflow5.png" width="320" height="172" data-original-width="628" data-original-height="337" /></a></div></p><p>このあたりはセキュリティを考慮すると、致し方ないと理解できるのですが少々残念なところです。今後 C# や PowerShell でのコード記述が対応された場合には、恐らくさらにできることが増えていると思いますので、対応待ちというのも一つかと思います。<br />
</p>Ahfhttp://www.blogger.com/profile/01553064540426163049noreply@blogger.com0tag:blogger.com,1999:blog-3357313501722746592.post-64897648247462215602019-03-23T08:59:00.001+09:002019-03-23T09:02:11.994+09:00Logic Apps Live Mar 21 2019<p>今回も3か月ぶりとなった <a href="https://www.youtube.com/watch?v=Lh1WZR_cDUE&feature=youtu.be" target="_blank">Logic Apps Live</a>、タイミング的にはちょうど MVP Global Summit の時に放送がされました。</p><p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgk-aHHd9Qk7XOJna7b2BDYLEOU5XZ_OmXFSE1hAt084FkDw3RwT8j99kbe8d1PnG1VnPnozPXqs1F1OWHBlhq-obm1MsKQz4U-swJ4PIgKVGmc47JJL7GeTDkXZD4spaI60pIMylqza3Q/s1600/lal_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgk-aHHd9Qk7XOJna7b2BDYLEOU5XZ_OmXFSE1hAt084FkDw3RwT8j99kbe8d1PnG1VnPnozPXqs1F1OWHBlhq-obm1MsKQz4U-swJ4PIgKVGmc47JJL7GeTDkXZD4spaI60pIMylqza3Q/s320/lal_1.png" width="320" height="179" data-original-width="790" data-original-height="442" /></a></div></p><br />
<a name='more'></a><br />
<p>いつもの Kevin さんと John さんです。<br />
</p><p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx_vNVwftnDN0Jb75Ai3pBz_jgQPatQYwyuMBHruKE3fvRI3qFxAeyzSWgfTZJO3IGKGwlCNADGgZ0qR7fCEru-KUFUuFaCSsVPW7nv0uNnGUEDGda1R3wiPx-CdpiCD7v_yE-Qkzahws/s1600/lal_title.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx_vNVwftnDN0Jb75Ai3pBz_jgQPatQYwyuMBHruKE3fvRI3qFxAeyzSWgfTZJO3IGKGwlCNADGgZ0qR7fCEru-KUFUuFaCSsVPW7nv0uNnGUEDGda1R3wiPx-CdpiCD7v_yE-Qkzahws/s320/lal_title.png" width="320" height="179" data-original-width="788" data-original-height="440" /></a></div></p><p>今回のお題目は次のようになっていました。</p><p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyOnOi1f5T6yPDmVg4kYh9TxSTaTCDEg4dMaFkkYoV5HweH_gWOpyw_PB_JdneDLgH5cX5ntGA4H2QsPR4HN344lRYAGLZHCmB_Zx1NS5-pW02wZozqS9aGTx4AoJJkldGUzVwh-R7syU/s1600/lal_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyOnOi1f5T6yPDmVg4kYh9TxSTaTCDEg4dMaFkkYoV5HweH_gWOpyw_PB_JdneDLgH5cX5ntGA4H2QsPR4HN344lRYAGLZHCmB_Zx1NS5-pW02wZozqS9aGTx4AoJJkldGUzVwh-R7syU/s320/lal_2.png" width="320" height="183" data-original-width="770" data-original-height="440" /></a></div></p><p>ここまでのアップデートの中で一番大きいものは、やはりなんといっても ISE(Integration Service Environment)のパブリックプレビュー開始です。利用者が占有できる Logic Apps 実行環境を作成することで、他ユーザーが大量の処理を実施している際の影響を受けにくくするもので、VNet を利用してオンプレミス環境と接続することも可能です。まだ価格プランが発表されていませんが、ビジネスの場面で大量にデータを扱うのであればメリットがあると言われています。</p><p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAu4gUKBjudfQcTMOv8K71KQnTxXic7z54B9SAmbJFET4QSvFZ6aoFocGz2-7lDlfvArnHfv8txnQ58hpgY_FJDuDvPKj3zIEyLRqFsZKj6bWDOX7cegaVvE6qA9rw1zAllTgbO7w2r8k/s1600/lal_3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAu4gUKBjudfQcTMOv8K71KQnTxXic7z54B9SAmbJFET4QSvFZ6aoFocGz2-7lDlfvArnHfv8txnQ58hpgY_FJDuDvPKj3zIEyLRqFsZKj6bWDOX7cegaVvE6qA9rw1zAllTgbO7w2r8k/s320/lal_3.png" width="320" height="174" data-original-width="813" data-original-height="441" /></a></div></p><p>ISE の開発は非常に苦労していたのがうかがえますw</p><p>Static Result は最近プレビューで利用できるようになった、テスト支援機能です。コネクタを実際に実行させずに、モックとして実行し特定の値を返却できるようにする機能で、これを利用することで今までは難しかった「エラー発生時の処理テスト」が簡単に行えるようになります。</p><p>Delete Run API は Logic Apps の実行中止 API です。実行履歴のブレード上から、利用可能になっているものかと思います。</p><p>Handling many parameter は、実行結果の表示で多くのパラメータを利用している場合、縦にすごく長い表示になっていたのですが、その表示方法を変更しある程度必要なものに絞った形で表示するようにしたものです。</p><p>Tracking for batch trigger は、今まで対応していなかった Batch トリガでの追跡プロパティ対応です。言われるまで対応していなかったことに気づいていませんでした・・・w</p><p>あとは Azure Gov Cloud Arizona ということで、政府用環境を新しく展開したとのことです。</p><p>新規コネクタは、流石に三か月だとスゴイ量になっています。その中でも非常に衝撃的だったのは IBM3270 コネクタで、これはメインフレームとの接続を可能にしジョブの実行を指示できるものです。さすがにこれは個人では試せないですねw</p><p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghUAKYcCZ_4zAQGEybOFsAB2IOE0vZ3CLCGl_c9OUEJA9PBQ8e6dtIetHzyZSn-FTLNZlpIMhh74Z2cPNNJFy54KCACK4ige19ZP1TUEHaEZUWvn5wjAtP95oVXzVvMy9voR_Xoh0GY9c/s1600/lal_4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghUAKYcCZ_4zAQGEybOFsAB2IOE0vZ3CLCGl_c9OUEJA9PBQ8e6dtIetHzyZSn-FTLNZlpIMhh74Z2cPNNJFy54KCACK4ige19ZP1TUEHaEZUWvn5wjAtP95oVXzVvMy9voR_Xoh0GY9c/s320/lal_4.png" width="320" height="179" data-original-width="790" data-original-height="442" /></a></div></p><p>デモは先ほどの Static Result です。デザイナー上で、テスト用に返却する値を設定することで、続くエラー時の処理が行われるかが、非常に簡単に確認できています。</p><p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_zqmMjyefr581pGU3kbSATghkXz3jmR0RV3Y6l6HgabHz1_MeYTeBjNpEzh-nL7neQqy7-KpLHmsk8xcu3XThRBLN9lBxMj4cRST8X0SMjSMckEXUf-rnpsjj_FbaC5cz5JBaOPu1n_A/s1600/lal_6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_zqmMjyefr581pGU3kbSATghkXz3jmR0RV3Y6l6HgabHz1_MeYTeBjNpEzh-nL7neQqy7-KpLHmsk8xcu3XThRBLN9lBxMj4cRST8X0SMjSMckEXUf-rnpsjj_FbaC5cz5JBaOPu1n_A/s320/lal_6.png" width="320" height="179" data-original-width="790" data-original-height="441" /></a></div></p><p>現在対応中のものです。ISE は GA に向けて色々作業中で、ISE 用コネクタとして SAP と FileSystem を開発中とのことです。</p><p>VSCode で Logic Apps を対象にした新しいプロジェクトを開発中です。話を聞いていると、現在 Visual Studio で行えているものにとどまらず、もっと色々と管理や開発を行えるようなものとのことです。</p><p>RosettaNet は B2B な環境で利用されているプロトコルで、これも対応を進めているようです。日本ではどれほど浸透しているか、私は EDI などの世界から離れて久しいのもあり把握していませんが、こういった統一可能なプロトコルには是非のっかってほしいですね。</p><p><p>開発中コネクタでは、Key Vault が近々リリースが行われるとの話が出ました。おそらく2~3週間以内とのことで、これは非常に楽しみですね!<br />
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFf7wMtxxNBggolRcp8rF4TZPF3epbVk1zqcVBC5-qfRqZMVi6ippm-UZWsQi9lRRESLEERLXBF31JWr5cMeBSy4GcRH2SItJix31Jz9RyEypsB6kEN3jO24R3hzTWZj4BcJ-qabzx118/s1600/lal_5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFf7wMtxxNBggolRcp8rF4TZPF3epbVk1zqcVBC5-qfRqZMVi6ippm-UZWsQi9lRRESLEERLXBF31JWr5cMeBSy4GcRH2SItJix31Jz9RyEypsB6kEN3jO24R3hzTWZj4BcJ-qabzx118/s320/lal_5.png" width="320" height="177" data-original-width="796" data-original-height="440" /></a></div></p><p>そして Azure Scheduler の終了に伴うアナウンス、これはこれまでも同様に行っていますが、2019/09/30 なので、あと半年くらいの時間があります。できるだけ早くに Logic Apps へ移行することをお勧めしています。</p><p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjITXVJi7SeW4fMVvvuywjZT0ukVt54m-xwkv3J7ydeoBUfbSF6lANbJN5BrrXwWVhMnt5aFZDu0tUQ1Ucq2TIO7RyRx-b8QJRolCs2iTnZ36iU-r-YNfoWlUlGgb4_eSE2qvxayS291iA/s1600/lal_7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjITXVJi7SeW4fMVvvuywjZT0ukVt54m-xwkv3J7ydeoBUfbSF6lANbJN5BrrXwWVhMnt5aFZDu0tUQ1Ucq2TIO7RyRx-b8QJRolCs2iTnZ36iU-r-YNfoWlUlGgb4_eSE2qvxayS291iA/s320/lal_7.png" width="320" height="181" data-original-width="796" data-original-height="449" /></a></div></p><p>今月末に行われる Global Integration Bootcamp のイベント紹介に・・・</p><p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTosoa0ZlDdPfZWjKbq6Gf_lvKrfF6xmSbaalpf5HRaSHGkrayCk7fpwpMIiCh21nToRa2Mhzmb3eC35cp37BkKneHeAzGBwWey2AYcRll54SRubsPgHCZNtsHOeUI-PkmNvyfuelfdy8/s1600/lal_8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTosoa0ZlDdPfZWjKbq6Gf_lvKrfF6xmSbaalpf5HRaSHGkrayCk7fpwpMIiCh21nToRa2Mhzmb3eC35cp37BkKneHeAzGBwWey2AYcRll54SRubsPgHCZNtsHOeUI-PkmNvyfuelfdy8/s320/lal_8.png" width="320" height="186" data-original-width="788" data-original-height="459" /></a></div><p>Microsoft Ignite の紹介、</p><p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIWPj1BNNrjIcdC9L1DRCWryAIKCKpPIwXMUao3-34BAns38CzTuENhzUK7Bl5Xy9e7I-lwBZC6ufojJjNGIlw6pJ-G3mRbueIDxIMRc9pKrEB2bEuPiFFS2anOfZcRZviypaYl2IT6No/s1600/lal_9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIWPj1BNNrjIcdC9L1DRCWryAIKCKpPIwXMUao3-34BAns38CzTuENhzUK7Bl5Xy9e7I-lwBZC6ufojJjNGIlw6pJ-G3mRbueIDxIMRc9pKrEB2bEuPiFFS2anOfZcRZviypaYl2IT6No/s320/lal_9.png" width="320" height="176" data-original-width="800" data-original-height="441" /></a></div></p><p>Integrate2019 のイベント紹介を行い、今回の Logic Apps Live は終了しました。</p><p>やはり海外では Integration 系のイベントは強いのがあって、非常にうらやましいですね。日本でも同様のイベントを行ってみたいと思いますが、人集まらないだろうしなぁ。</p>Ahfhttp://www.blogger.com/profile/01553064540426163049noreply@blogger.com0tag:blogger.com,1999:blog-3357313501722746592.post-87701925663900759462019-02-20T11:31:00.000+09:002019-02-20T11:31:37.112+09:00特定の Web サイトが更新されたかを Logic Apps/Flow でチェックする<p>Logic Apps や Flow を使って、特定の Web サイトが更新されたかを検知したいことがあります。RSS が提供されていれば、それをもとに判断できるのですが、Web サイトしか情報がない場合には簡単に行えません。思いつく方法の一つとしては、どこか別のストレージに保存しておき、それと比較する方法がありますが、今回はストレージを利用せずに比較する方法を作成してみました。<br />
</p><a name='more'></a><br />
<p>Logic Apps と Flow は、通常のアプリケーションや API とは異なる性質があります。それは、長期間実行中の状態になることもよしとする、というものです。通常であれば、処理はできるだけ短時間で終了させるのが正しいとされていますが、Logic Apps や Flow ではその限りではありません。Logic Apps であれば最大 90 日、Flow の場合でも 30 日の間、実行中となってよい仕組みになっています。これは Flow でよく利用される承認機能(Approvalコネクタ)が良い例で、承認を依頼してから終了するまで数日かかることは普通の事です。この考え方を持っていると、今回のように処理がシンプルに行えることもあります。<br />
</p><p>全体の LogicFlow は以下の様に作成しました。<br />
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjljBdcT7hldQ5OLvVQioTGc5xj5sGOOqTboe-qP9JAnGFIdcN7q6xjEqIptTgAdq-f7pOayu_IaAcILufttkF3AxV4V8DUTZyZy9Os4TrRI3csmcTxyJyW_yT6iT_VQ9vCwlJ0HGqsck8/s1600/01_allflow.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjljBdcT7hldQ5OLvVQioTGc5xj5sGOOqTboe-qP9JAnGFIdcN7q6xjEqIptTgAdq-f7pOayu_IaAcILufttkF3AxV4V8DUTZyZy9Os4TrRI3csmcTxyJyW_yT6iT_VQ9vCwlJ0HGqsck8/s320/01_allflow.png" width="286" height="320" data-original-width="1429" data-original-height="1600" /></a></div><p>トリガには、要求(HTTP Request)トリガを利用します。そしてまずは対象となるサイトを HTTP コネクタで取得します。今回、検知しようとしたサイトは Microsoft Flow の Release Note サイト( <a href="https://docs.microsoft.com/ja-jp/business-applications-release-notes/powerplatform/released-versions/flow">https://docs.microsoft.com/ja-jp/business-applications-release-notes/powerplatform/released-versions/flow</a> )です。前日に取得した内容と、当日取得した内容を比較して、違いがあれば更新された、という判定を行っています。<br />
</p><p>ただし、今回のこのサイトは、内部に動的に生成された URL を持つ隠し項目が埋められており、アクセスするタイミングによっては毎回 URL が異なるものが存在していました。そのため、更新日を表していた meta タグの値に限定させて判定を行わせています。このようなものが埋め込まれていないのであれば、HTTP コネクタで取得した値をそのまま比較しても問題はありません。<br />
</p><p>meta タグに限定させている箇所は、次のように処理を行っています。<br />
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYX2Rwx-VWPvZIiUYBlJv-fwtgvTUx9VwyWQ4cy_HiBKQqiVOPG2IaQNFEsRhIP8HeIJajp8I-J4EqiItJR53_mLyxrGWJIZv2qoOaoyJG9zCcPLNcBjtf536XWZNH8Q6Plp8HEEWmgwQ/s1600/02_splithtml.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYX2Rwx-VWPvZIiUYBlJv-fwtgvTUx9VwyWQ4cy_HiBKQqiVOPG2IaQNFEsRhIP8HeIJajp8I-J4EqiItJR53_mLyxrGWJIZv2qoOaoyJG9zCcPLNcBjtf536XWZNH8Q6Plp8HEEWmgwQ/s320/02_splithtml.png" width="263" height="320" data-original-width="661" data-original-height="804" /></a></div><p>先に、HTTP コネクタで取得した HTML の内容を、uriComponent 関数を利用してエンコードを行っています。これは、内部で改行コードなど、Logic Apps や Flow でそのままでは扱えない文字があるためです。例えば \r\n は改行を表しますが、uriComponent 関数を利用すると %0D%0A という文字列になります。その変換結果に対し、行単位に配列へ分割します。この場合 split 関数に指定するのは、先ほど例に挙げた改行コードとなります。<br />
</p><p><strong><br />
split(uriComponent(body('FlowReleaseNoteを取得')),'%0D%0A')<br />
</strong></p><p>変換した配列から、meta タグとなっている箇所を抽出します。<br />
</p><p><strong><br />
equals(startsWith(item(), uriComponent('<meta name=\"updated_at\"')), true)<br />
</strong></p><p>startsWith 関数は「~で始まるか」を判定する関数です。これを利用して、meta タグを記載しているもののみに、配列を限定させます。今回は、更新日を表す meta データが、updated_at という名前で設定されているのが解析できましたので、その要素のみに限定を行い、フィルタリングした結果をそのまま配列な変数へと設定します。<br />
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5PbpEQVCbJ-CT_M485sQpzBqFJHvHLPedh7bST5o8JkyVVvxhWIaPY4X3uor77CiibXv12V9c5Kd0gkIkIDmtP3vjMEpTll2xl_Zju_Q4dAkHrCX4sUPcL3GYqi29wl-J3cYl7QKBwSo/s1600/03_previousdatacheck.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5PbpEQVCbJ-CT_M485sQpzBqFJHvHLPedh7bST5o8JkyVVvxhWIaPY4X3uor77CiibXv12V9c5Kd0gkIkIDmtP3vjMEpTll2xl_Zju_Q4dAkHrCX4sUPcL3GYqi29wl-J3cYl7QKBwSo/s320/03_previousdatacheck.png" width="320" height="116" data-original-width="623" data-original-height="226" /></a></div><p>初回起動時は、比較対象となる前回の結果がありませんので、IF コネクタで判定を行います。前回データは HTTP Request トリガに渡してもらう形になりますので、トリガに何もデータがわたってきていない=前回データがない、という判定です。<br />
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiU8oFn8YPxzibLejPHPJK9nbylUZPBXk1PO9jTOWuPl4z581yNAQxLzgGdLf92DQMTBfG7_lA2dsIJp4QW9KjUMi_uoHQUpmrQAjM2Q1z_J-HCD-aXqkg6varVL48uJS8dOrGN4_K9UE/s1600/04_diffcheck.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiU8oFn8YPxzibLejPHPJK9nbylUZPBXk1PO9jTOWuPl4z581yNAQxLzgGdLf92DQMTBfG7_lA2dsIJp4QW9KjUMi_uoHQUpmrQAjM2Q1z_J-HCD-aXqkg6varVL48uJS8dOrGN4_K9UE/s320/04_diffcheck.png" width="320" height="235" data-original-width="1143" data-original-height="841" /></a></div><p>前回データが存在した場合、今回取得したデータと比較するために、同じ形となるよう配列変数に設定します。そして配列変数をそれぞれ比較し、違いがあれば更新があった、なければ同一として判定しています。<br />
</p><p>そして最後に、1日処理を待機させ、その後に今回取得したデータを添付し自分自身を呼び出しています。こうすることで、今回取得したデータを次回処理に引き継ぐことが可能です。特に外部ストレージを経由しなくても、必要情報を受け渡すことができますので、色々とアレンジして利用してみるとよさそうです。<br />
</p>Ahfhttp://www.blogger.com/profile/01553064540426163049noreply@blogger.com0tag:blogger.com,1999:blog-3357313501722746592.post-52901828435916788422019-02-16T12:47:00.002+09:002019-02-16T12:48:15.464+09:00Logic Apps での API 接続情報エラーをチェックしてメール通知する<p>以前に、<a href="http://blogahf.blogspot.com/2018/11/microsoft-flow.html" target="_blank">Microsoft Flow での接続状態チェック</a>を行う LogicFlow を作成したことがあります。この際、Logic Apps では提供されていない管理コネクタを利用しての処理であったため、Logic Apps でのエラーチェックはできていませんでした。今回 ARM コネクタを利用してのチェックが行えたので、その方法をまとめておきます。<br />
</p><a name='more'></a><br />
<div id="extendedEntryBreak" name="extendedEntryBreak"></div><p>まず全体図としては次のようになります。<br />
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmz-DFVb3HgxIZ9SLCASq2XU__9yOC6vA3LexbN4dkx3AoTk8sQ4JB2D8heqOBG2QN5JUv9wotFSvRDVB-77VN8S5950O1fS_IwGbWfpoKE3BY5ebxrYVXiGrBomoaG8Zi60gKvgFvkCw/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="960" data-original-width="976" height="313" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmz-DFVb3HgxIZ9SLCASq2XU__9yOC6vA3LexbN4dkx3AoTk8sQ4JB2D8heqOBG2QN5JUv9wotFSvRDVB-77VN8S5950O1fS_IwGbWfpoKE3BY5ebxrYVXiGrBomoaG8Zi60gKvgFvkCw/s320/image.png" width="320" /></a></div><span id="goog_165065741"></span><span id="goog_165065742"></span><br />
<p>最初に行うことは、ARM コネクタを利用して「接続情報一覧を取得」することと、「プロバイダ情報を取得」することです。<br />
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZebRpar4qea3OSgyXzy6DExBpCE-Vz-nempawAXz-BY9STGXBLSwgaJX5rx-Stvb8F1l09vt9_ZvKCkgD6h8T5KM65Z_sXeeSRoMxWzm2YmyT29M9hGu7WcXivuFmGuvI2rk9QfiYGI0/s1600/image4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="222" data-original-width="621" height="113" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZebRpar4qea3OSgyXzy6DExBpCE-Vz-nempawAXz-BY9STGXBLSwgaJX5rx-Stvb8F1l09vt9_ZvKCkgD6h8T5KM65Z_sXeeSRoMxWzm2YmyT29M9hGu7WcXivuFmGuvI2rk9QfiYGI0/s320/image4.png" width="320" /></a></div><p>接続一覧の取得は、このような形でサブスクリプションと取得条件を指定しています、Logic Apps では、API 接続情報を Microsoft.Web プロバイダによって管理されていますので、それを指定しています。<br />
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinjh7Ejd_xizw07GmJIKbEA3id8H0FJpiKwIIN-iJH94E5Zb4KBFCajsvk4p_fkPJNgi11IDXeznQiw19dMjIyFU2e6xsVZf9pVIGtSuZOIhHdct1oqq2LUK2h2TMxZjtVh-ngdUGb9pw/s1600/image8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="204" data-original-width="615" height="106" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinjh7Ejd_xizw07GmJIKbEA3id8H0FJpiKwIIN-iJH94E5Zb4KBFCajsvk4p_fkPJNgi11IDXeznQiw19dMjIyFU2e6xsVZf9pVIGtSuZOIhHdct1oqq2LUK2h2TMxZjtVh-ngdUGb9pw/s320/image8.png" width="320" /></a></div><p>もう一つのプロバイダ情報取得ですが、後々行っている接続情報の取得の際に、利用する API のバージョン情報を指定する必要があり、そのために Microsoft.Web プロバイダの情報を取得しようとしています。Expand に条件が指定されていますが、ここは Filter とは違うようで条件指定はうまいこと動作しませんでした・・・。<br />
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb0WKXU7QfHH_2WFePLkUfwbAoSI8Ehc7zq39GCX8AkzYxBhXOgaNkExRWOggNXEHnsheWP3tL_o-0nq2cpR4QY64JAs-2oa-aTsf0dkxGNT3wxQ4uLJwJwDrMze0-VRK7D3cDc5la-nU/s1600/image12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="162" data-original-width="615" height="84" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb0WKXU7QfHH_2WFePLkUfwbAoSI8Ehc7zq39GCX8AkzYxBhXOgaNkExRWOggNXEHnsheWP3tL_o-0nq2cpR4QY64JAs-2oa-aTsf0dkxGNT3wxQ4uLJwJwDrMze0-VRK7D3cDc5la-nU/s320/image12.png" width="320" /></a></div><p>そのため、取得できたプロバイダ情報に対してフィルタリングを行います。ぱっと見た目、同じ項目を指定しているようですが、微妙に異なるので CodePeek での表示も確認します。<br />
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXMtKP1UhLKnnT9v_yYB46NnRu2Z3WWjUM8YYvOfaL53QEMxfVzMy9Fob0F00HaiLrpOSoHP5qjFYmnjFyDtJ0F_QtxjZyhee4QA-PErRff8vugf7k8NR-PDLtf2DnLj7DYuDg3jQJcm4/s1600/image16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="260" data-original-width="618" height="134" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXMtKP1UhLKnnT9v_yYB46NnRu2Z3WWjUM8YYvOfaL53QEMxfVzMy9Fob0F00HaiLrpOSoHP5qjFYmnjFyDtJ0F_QtxjZyhee4QA-PErRff8vugf7k8NR-PDLtf2DnLj7DYuDg3jQJcm4/s320/image16.png" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"></div><p>実際の指定はこのような形です。From として処理対象となる配列を指定しますが、ここでは先ほど取得したプロバイダ情報の ResourceType<strong><span style="color: red;">s</span></strong> を指定します。フィルタリング条件側では、From で指定した配列が持つ値 ResourceType を指定し、種類が connections となっているもの、これが API 接続情報を表していますのでそれに限定させます。<br />
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKTzIKuxaOhDaf_fkQR9BUgy0fIag49UtTrJiRtXP3y0x8FpDCwhSQ-3IhPQuco-NS9QvUbJxxW8EI0JkJ_iulkBFMRt91k3mL7WYjXDhjv70T5yyb1wzRjkxnBGczxvdwzG7SYoNk5j8/s1600/image20.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="569" data-original-width="610" height="298" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKTzIKuxaOhDaf_fkQR9BUgy0fIag49UtTrJiRtXP3y0x8FpDCwhSQ-3IhPQuco-NS9QvUbJxxW8EI0JkJ_iulkBFMRt91k3mL7WYjXDhjv70T5yyb1wzRjkxnBGczxvdwzG7SYoNk5j8/s320/image20.png" width="320" /></a></div><p>実際の実行結果はこのような形です。フィルタリングが動作しているのがわかります。フィルタリングされた結果から、最新の API バージョンを取得します。<br />
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDcbHf3iTQUDR_6-UHK23CFbumIHowsYciUrlPxaaeDNwI4NbqtNHlEko0mZ96Luqarv8FDPZcPOaAHMowr0J2LYyku-tB_nk_vCLLEGK4dC2fVhDE8R_oxqyopRCcTla4WZKZSM53-PY/s1600/image24.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="199" data-original-width="619" height="102" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDcbHf3iTQUDR_6-UHK23CFbumIHowsYciUrlPxaaeDNwI4NbqtNHlEko0mZ96Luqarv8FDPZcPOaAHMowr0J2LYyku-tB_nk_vCLLEGK4dC2fVhDE8R_oxqyopRCcTla4WZKZSM53-PY/s320/image24.png" width="320" /></a></div><p>ダイアログ上で入力するのは、次の関数です。<br />
<div class="separator" style="clear: both; text-align: center;"></div><strong>first(first(body('配列のフィルター処理'))?['apiVersions'])</strong><br />
フィルタリングされた結果も配列なので、first 関数を利用して最初の結果に絞り込みます。その結果には、apiVersions という配列が設定されていますので、その最初の要素を取得させています。先ほどの実行結果を見るとわかるのですが、プロバイダの API バージョン情報は、最新のものから降順に設定されているようですので、first 関数をさらに指定しての取得となります。<br />
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYlDZj-eCMa5OzHq7esLWumKEGkHW2EzaMH5Mi7aZUhHMSS7ZYqSOPCyTGTPNpd1QTlU3-P3er8hxDYzTqHMCqRCG9CtBq52sDc2o9T15CVrhRcxjp5_cX-glLwcFoU3BKcrjqXen-XRM/s1600/image28.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="164" data-original-width="613" height="85" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYlDZj-eCMa5OzHq7esLWumKEGkHW2EzaMH5Mi7aZUhHMSS7ZYqSOPCyTGTPNpd1QTlU3-P3er8hxDYzTqHMCqRCG9CtBq52sDc2o9T15CVrhRcxjp5_cX-glLwcFoU3BKcrjqXen-XRM/s320/image28.png" width="320" /></a></div><p>エラーチェックの結果を設定する、配列変数を新しく作成します。この変数に、エラーとなったものの情報を追加していく使い方です。<br />
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiO2Cw-v13CQQCcVhSjwesshUKAkyrcKvht-mUiCcbjszMDdt_g_tuYaGIPCGTP4MydUS9oRf8sAiTJWAC6WHk6b7uZiBvprnKhYamUJ0Z7nkXQsBl2riuwEbgHHWT4EibRIBQlEZALRk4/s1600/image32.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="783" data-original-width="656" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiO2Cw-v13CQQCcVhSjwesshUKAkyrcKvht-mUiCcbjszMDdt_g_tuYaGIPCGTP4MydUS9oRf8sAiTJWAC6WHk6b7uZiBvprnKhYamUJ0Z7nkXQsBl2riuwEbgHHWT4EibRIBQlEZALRk4/s320/image32.png" width="268" /></a></div><p>ここからがメイン処理となる部分です。接続情報の一覧に対して ForEach で全件チェックを行います。<br />
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhg_7-Hx9OCzGm6W71TxzzFBnE3zDsc5E5DZLVgZp5T5aLFEea-65KtZU_mRJDdIuw6_lbOb_OGLNdIU37FE28k45FZV7_5JaUMOjcghk0QwKfhs6HoV1BmM-6HQvIkNzNNsvyZ4VIocVc/s1600/image36.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="281" data-original-width="618" height="145" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhg_7-Hx9OCzGm6W71TxzzFBnE3zDsc5E5DZLVgZp5T5aLFEea-65KtZU_mRJDdIuw6_lbOb_OGLNdIU37FE28k45FZV7_5JaUMOjcghk0QwKfhs6HoV1BmM-6HQvIkNzNNsvyZ4VIocVc/s320/image36.png" width="320" /></a></div><p>その際に、ARM コネクタの Read a Resource アクションにて、接続情報の詳細を取得させるのですが、この際に以下の情報が必要になります。<br />
<ul><li>サブスクリプション</li>
<li>リソースグループ</li>
<li>リソースプロバイダー</li>
<li>ショートリソースID</li>
<li>API バージョン</li>
</ul>これらの値を指定する必要があります。サブスクリプションとリソースプロバイダーは、変化することもないので固定で指定しています。APIバージョンは、先に取得した値を設定します。<br />
問題となるのが、リソースグループ、ショートリソースID ですが、これらの値は一覧として取得された接続情報から取得が可能です。<br />
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifykOv2efgWQFJEBSXAxMOfMOz4UhcNZMDcNQbUPj-S4Ei7mAZEnvPCdxkfOYJbYgW0AKv5SAixMlvDg0zQS3kcZ7Rp9-8rCmRgn5JvRYpkb5FDkYLg7nyAad7XJq1DQMXNglx4DCLb0k/s1600/image40.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="475" data-original-width="603" height="251" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifykOv2efgWQFJEBSXAxMOfMOz4UhcNZMDcNQbUPj-S4Ei7mAZEnvPCdxkfOYJbYgW0AKv5SAixMlvDg0zQS3kcZ7Rp9-8rCmRgn5JvRYpkb5FDkYLg7nyAad7XJq1DQMXNglx4DCLb0k/s320/image40.png" width="320" /></a></div><p>これが実際に取得した接続情報になるのですが、id の値に設定されているものから、リソースグループとショートリソースIDが抽出可能です。<br />
</p><blockquote>{<br />
"id": "/subscriptions/{subscription ID}/resourceGroups/{Resource Groupe}/providers/Microsoft.Web/connections/{Connection Name}",<br />
"name": "azureeventgrid",<br />
"type": "Microsoft.Web/connections",<br />
"location": "westus2"<br />
},</blockquote><p>id は上記のような形となっています。URL 形式で、resourceGroups の後に対象となるリソースグループ名が、末尾に対象となるコネクション名が設定されているのがわかると思います。ここから必要な情報を取得するため、id の値を / で配列に分割し、特定の要素を利用します。<br />
Split 関数で分割すると、先頭の要素は空になりますので、リソースグループ名は 5 番目、接続名は Last 関数で末尾を取得します。<br />
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijIXuuEtNCzTg3-I97W8AGYsVNe5tuavZCZRTirPc2cVqttFIPps75zhk_9Gt3sHwqSr5ljXRlPSdVXIECiq8YCvkawlU8ZxE7CCH8pPntVLowlAQJEuaz2gVsipmFvxP8ap0PkG7omBo/s1600/image44.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="357" data-original-width="615" height="185" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijIXuuEtNCzTg3-I97W8AGYsVNe5tuavZCZRTirPc2cVqttFIPps75zhk_9Gt3sHwqSr5ljXRlPSdVXIECiq8YCvkawlU8ZxE7CCH8pPntVLowlAQJEuaz2gVsipmFvxP8ap0PkG7omBo/s320/image44.png" width="320" /></a></div><p>Logic Flow 上では、このような形で処理を行っています。<br />
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGIHxteKe-5mqEKp8nRuaaj_mS27fO07vk6Naw-zOZs5tjA7aiFNdYEXlIwCOifNYeT2TocWZv69GP8LsQlhymdueOoTRAVC39ahyphenhyphen7L-0s_JtRbFcqpFHi2xzE__TzBciINjRbnSV6FT8/s1600/image48.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="655" data-original-width="613" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGIHxteKe-5mqEKp8nRuaaj_mS27fO07vk6Naw-zOZs5tjA7aiFNdYEXlIwCOifNYeT2TocWZv69GP8LsQlhymdueOoTRAVC39ahyphenhyphen7L-0s_JtRbFcqpFHi2xzE__TzBciINjRbnSV6FT8/s320/image48.png" width="299" /></a></div><br />
それぞれで指定した関数は、このようにしています。リソースグループ名のところで、[4] と記載していますが、これが<strong>配列の 5 番目を直接指定</strong>する書き方です。配列は 0 から開始するので、5番目は 4 を指定する必要があります。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDcosysr3eVt-KlOGX26Y_iF-tL7eAaXSoHthMR9RWKxTTm9HE0b5_MbRua3_pF55yJHbLTeh3W60eTY2cgyyV1dLfWJVoOG4RUPR73CZ-0Yv61c7buIoqmy4qMoxI3_ZtAI86nC2_gUY/s1600/image53.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="340" data-original-width="616" height="176" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDcosysr3eVt-KlOGX26Y_iF-tL7eAaXSoHthMR9RWKxTTm9HE0b5_MbRua3_pF55yJHbLTeh3W60eTY2cgyyV1dLfWJVoOG4RUPR73CZ-0Yv61c7buIoqmy4qMoxI3_ZtAI86nC2_gUY/s320/image53.png" width="320" /></a></div><p>ARM コネクタで取得した、接続情報の詳細を JSON 解析し、後続の処理で利用しやすくします。この際のスキーマは、一度実行し、その結果を指定することで作成が可能です。<br />
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd7fizJ0Ia-8qd8jKNzbQhCxcsQhHZpbYAKZFpvNn1p8RKFbbJ7_t10KAG46jhkLnp_BGf2C9gtKAomr9ZWaXeSdXHda2TrG3vaCb2ukNvqsv8Mu_8-sJkH9SE2jPCFSrNzY48N5GB4Lo/s1600/image57.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="602" data-original-width="1266" height="152" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd7fizJ0Ia-8qd8jKNzbQhCxcsQhHZpbYAKZFpvNn1p8RKFbbJ7_t10KAG46jhkLnp_BGf2C9gtKAomr9ZWaXeSdXHda2TrG3vaCb2ukNvqsv8Mu_8-sJkH9SE2jPCFSrNzY48N5GB4Lo/s320/image57.png" width="320" /></a></div><p>詳細情報の中には、接続が有効かどうかを表す status という値があり、そこが Connected であれば、正常な状態を表します。反対に、それ以外の値が設定されているのであれば、それは接続でエラーが発生していることとなります。<br />
実際の判定式は次のようになります(CodePeek が利用できないので CodeView で)<br />
</p><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimDE1Ur5aXOVm9eJAcTZLP0SWgs6u-Mta2Luguicmpv_JmvWcmnlCC0bwMAuH5kQgO5ZQVMQPPKFHvwtYO6MhPLzdi_F9yNDFRLrjGl6slB_Ky_ek-2FcLfdI-qFHYcHbO4g_iE5YWJuM/s1600/image61.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="231" data-original-width="707" height="104" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimDE1Ur5aXOVm9eJAcTZLP0SWgs6u-Mta2Luguicmpv_JmvWcmnlCC0bwMAuH5kQgO5ZQVMQPPKFHvwtYO6MhPLzdi_F9yNDFRLrjGl6slB_Ky_ek-2FcLfdI-qFHYcHbO4g_iE5YWJuM/s320/image61.png" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"></div><p>Connected 出ない場合、接続エラーとして作成してある変数に追加を行います。この際、後で見やすい形に成形するために、JSON な値となるようにしています。配列変数の場合、追加する要素は Object となりますので、利用する際には関数による何らかの変換が必要となります。<br />
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFdaznZaK_D3AC96rTpRRMyn9W8hABtqpwo9ud5nfVb6vSb9N7u2NbteGuGwtp2omUMDzIndulBVgRacYjiwqh1aMxhoGidTlX2rQVPTCsLbWtS5wLPWIS-xe2c-h2fCEa43Ne-a7Hozk/s1600/image65.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="407" data-original-width="662" height="196" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFdaznZaK_D3AC96rTpRRMyn9W8hABtqpwo9ud5nfVb6vSb9N7u2NbteGuGwtp2omUMDzIndulBVgRacYjiwqh1aMxhoGidTlX2rQVPTCsLbWtS5wLPWIS-xe2c-h2fCEa43Ne-a7Hozk/s320/image65.png" width="320" /></a></div><p>直接記載していますが、エラーメッセージについては配列となっていますので、<br />
<strong>body('接続状況の解析')?['properties']?['statuses'][0]?['error']?['message']</strong><br />
とダイアログ上で設定し、直接要素を参照させています。<br />
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1Y6ml260zNO_urWm009bb3_cFA0M40Pqb9i00a9O64o_ndh9b2GxA0i8MU6DUqN-4SyW1I6UyA55iqDa1CTtwKK1I_r8SHIhWOVlNLAzsiSHCVHHQ3Eafvim7anEXead6jubEkRHFNIE/s1600/image69.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="836" data-original-width="1270" height="210" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1Y6ml260zNO_urWm009bb3_cFA0M40Pqb9i00a9O64o_ndh9b2GxA0i8MU6DUqN-4SyW1I6UyA55iqDa1CTtwKK1I_r8SHIhWOVlNLAzsiSHCVHHQ3Eafvim7anEXead6jubEkRHFNIE/s320/image69.png" width="320" /></a></div><p>全てのチェックを行い、エラーがあった場合に限定してメール通知を行います。作成した変数に、何かしらの値が設定されていれば、エラーがあったと判定させています。<br />
このような形で処理を組むことで、エラーが発生している接続についてメールで通知が行われます。<br />
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnsn_rhqpmmFQt_UWYjzzu6Vev_LCxqoDwnx9itmf1Z4Ppsmzeh1wIvxZ2E-tFnr2Hp_vP3UCn3L5Eh1JsymTBYyAUODjsWOKwqALR9cs65BoRYN_WqOt3v8-SxUkinIMmJUtS75Teltw/s1600/image76.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="546" data-original-width="779" height="224" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnsn_rhqpmmFQt_UWYjzzu6Vev_LCxqoDwnx9itmf1Z4Ppsmzeh1wIvxZ2E-tFnr2Hp_vP3UCn3L5Eh1JsymTBYyAUODjsWOKwqALR9cs65BoRYN_WqOt3v8-SxUkinIMmJUtS75Teltw/s320/image76.png" width="320" /></a></div><p>Logic Apps でも、コネクタの更新や接続情報の期限切れなどで、気が付いたらエラーとなることがあります。この Logic Flow で検知、通知することで実運用でも助けとなるのではないでしょうか。</p><br />
<br />
<br />
<br />
Ahfhttp://www.blogger.com/profile/01553064540426163049noreply@blogger.com0tag:blogger.com,1999:blog-3357313501722746592.post-62800958118758394932018-12-16T17:29:00.001+09:002018-12-16T17:34:12.119+09:00Logic Apps Live Dec 13 2018<p>前回が 9 月だったので、<a href="https://www.youtube.com/watch?v=lf7JXIeolkE" target="_blank">およそ 3 か月ぶりとなる Logic Apps Live</a> が行われました。今回は恒例のクリスマス仕様で行われ、Logic Apps Live 初となる「スライド無しで喋りっぱなし」な回となりました・・・が、後ほど<a href="https://www.youtube.com/watch?v=4XGEiKkDcHo" target="_blank">スライド部分が別動画</a>としてアップされていましたので、なんとかなりましたw</p><p><a href="https://lh3.googleusercontent.com/-wzFmQgRwzRM/XBYMqybBxFI/AAAAAAAAE2g/f916NB_sfmwkKjnXfGslIy848FEQffJawCHMYCw/s1600-h/image%255B3%255D"><img width="240" height="135" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-CjPwwr0UbnY/XBYMrri9w0I/AAAAAAAAE2k/ZhBIC6ZpTHAWsG1k9rAj9FZ09oqw-3eXgCHMYCw/image_thumb%255B1%255D?imgmax=800" border="0"></a></p><p>二つの動画を見てのまとめとなります。</p><a name='more'></a> <p><a href="https://lh3.googleusercontent.com/-mq32JLa26q4/XBYMsL9qyBI/AAAAAAAAE2o/uFJ-5G6hjDswlDxQ3KA5SQQ3x80EJrmUwCHMYCw/s1600-h/image%255B9%255D"><img width="244" height="138" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-eKbNfrRY_Ac/XBYMsko59_I/AAAAAAAAE2s/Gd0Zx1_uc2shpi5XKKqnnnGY-mbsiTYkQCHMYCw/image_thumb%255B3%255D?imgmax=800" border="0"></a></p><p>今回告知するアップデート内容です。コネクタは日々チェックしているので、大体わかっていましたが、それ以外に Logic Apps 本体のアップデートが結構行われていました。</p><p><a href="https://lh3.googleusercontent.com/-GmU84Bl9VJo/XBYMtUbK0ZI/AAAAAAAAE2w/UbvYHjoQL-ENkPCu36FyzAe6yFRtQwwMQCHMYCw/s1600-h/image%255B12%255D"><img width="244" height="140" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-uHgtf2xW1o8/XBYMtzZAo0I/AAAAAAAAE20/YgfYzQ6kYqoNLm6i9q-A_wlVy8zbkkc8wCHMYCw/image_thumb%255B4%255D?imgmax=800" border="0"></a></p><p>プライベートプレビューな ISE(Integration Service Environment)、スマートデザイナー(Smart Selector とも言われている)、メール本文にて利用できるHTML テキストコントロール、XML 出力における XSLT サポート、再送信のトラッキング対応、EIP マップでのコンテンツリンク対応、X12/EDIFACT でのエンコード操作対応、Visual Studio Code 用拡張機能でのデザイナー表示追加、スケジューラ廃止に伴うテンプレート追加、といったものがアップデートされていました。</p><p><a href="https://lh3.googleusercontent.com/-RM7LBKMZowg/XBYMuZQkIOI/AAAAAAAAE24/4flTIojq22IXINX9HfDEI2qmwdw1U3QrgCHMYCw/s1600-h/image%255B60%255D"><img width="244" height="131" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-8apakzFop1A/XBYMu74_gZI/AAAAAAAAE28/85ZpASuBS64Dxq58Mdnle4OxIzpJU-CLgCHMYCw/image_thumb%255B20%255D?imgmax=800" border="0"></a></p><p>XSLT サポート、利用しようとするとプレビュー版だというのが表示されていました。</p><p><a href="https://lh3.googleusercontent.com/-PzDCB1iH-YU/XBYMvh0mddI/AAAAAAAAE3A/tqQhitbnyZoDL0Lj0fVu-vnsTBqMaDUyQCHMYCw/s1600-h/image%255B57%255D"><img width="244" height="138" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-zLdM2j07Wi0/XBYMv64k98I/AAAAAAAAE3E/-l0aZLSz2g8QaAttmzYIdFowBoIXeL7wQCHMYCw/image_thumb%255B19%255D?imgmax=800" border="0"></a></p><p>Logic Apps から Ethreum が利用できるようになったのとあわせて提供開始されている、<a href="https://github.com/Azure-Samples/blockchain/tree/master/blockchain-development-kit" target="_blank">Azure BLockchain Development Kit</a> もご存知の方は多くなったと思います。</p><p><a href="https://lh3.googleusercontent.com/-k6cQ-13NQJU/XBYMwg-R7AI/AAAAAAAAE3I/X3JaToeZJmoydbMO9gGcjAqvUzceWEojwCHMYCw/s1600-h/image%255B30%255D"><img width="244" height="139" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-HW_KxrZJiLI/XBYMxMlnEJI/AAAAAAAAE3M/YjaivKAtQwkUYZh9XXUgG-m9MrQmfWbUQCHMYCw/image_thumb%255B10%255D?imgmax=800" border="0"></a></p><p>来年に実施される Azure Scheduler の廃止に伴うアナウンスです。基本は Logic Apps のスケジュール機能を利用する形に移行しましょう、というものです。Logic Apps ではスケジュール用のテンプレート提供も行っているので、それを利用して移行するのがよさそうです。</p><p><a href="https://lh3.googleusercontent.com/-BpnoIPWIrgU/XBYMx_oac-I/AAAAAAAAE3Q/P5bPml7uai0JJGZLUmvOHpBy_Z-PT3zQgCHMYCw/s1600-h/image%255B33%255D"><img width="244" height="139" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-Bay3ZzzLMbo/XBYMycCWbpI/AAAAAAAAE3U/WfE9w5D-Kr81xbds5cEferB4vb80ZRqegCHMYCw/image_thumb%255B11%255D?imgmax=800" border="0"></a></p><p>デモとして、まずは Smart Selector です。Logic Apps では、コネクタを選択する際に、これまでの利用状況を踏まえた上で、よく利用しているコネクタとアクションやトリガを先に表示するようになっています。</p><p><a href="https://lh3.googleusercontent.com/-4s51jS7CbqM/XBYMyxyHy7I/AAAAAAAAE3Y/1du5nQT1jFIQzJ9o8GNRzUupwMxmIKSIACHMYCw/s1600-h/image%255B36%255D"><img width="212" height="244" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-smiGbhlRDq4/XBYMzTxxrmI/AAAAAAAAE3c/yZxmqpcDauMyAv2QxAlrtryfOpKf3JbEwCHMYCw/image_thumb%255B12%255D?imgmax=800" border="0"></a></p><p>日本語環境だとこんな感じですね。私の場合だと、HTTP や各種制御コネクタをよく使っているので、これがお薦めされてきていました。</p><p><a href="https://lh3.googleusercontent.com/-T3C5zVgTNFQ/XBYM0Szm3OI/AAAAAAAAE3g/PgSOXz2Sl4osxepiha1xX3SVT6wg2pnfACHMYCw/s1600-h/image%255B39%255D"><img width="244" height="140" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-ZRb3OWMUQMg/XBYM0xnZISI/AAAAAAAAE3k/9WveQuOU_PArbRS9jh2r48ovjKFIk1hlQCHMYCw/image_thumb%255B13%255D?imgmax=800" border="0"></a></p><p>Outlook コネクタなどで適用された新しいHTMLエディタの紹介です。Bold などができるのは分かっていたのですが、絵文字まで使えるとは知りませんでした。</p><p><a href="https://lh3.googleusercontent.com/-ooJhACBLpc0/XBYM1sCyi2I/AAAAAAAAE3o/BojlodGUPV89OBSrdXZB6w81qshkn-EmQCHMYCw/s1600-h/image%255B42%255D"><img width="244" height="138" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-MyYkSwaAfAQ/XBYM2SvTd0I/AAAAAAAAE3s/U-2jnCom89UudjmZ1JgsHYFGYCC8ZOtDQCHMYCw/image_thumb%255B14%255D?imgmax=800" border="0"></a></p><p>実行履歴上でも、絵文字がちゃんと表示されています。</p><p><a href="https://lh3.googleusercontent.com/-rH8WKLKwDt0/XBYM26tvjsI/AAAAAAAAE3w/6RN-7OdBhi0xVCiSIhQxv5zw6TJeV5LAgCHMYCw/s1600-h/image%255B45%255D"><img width="244" height="139" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-lu7C7Qkgem8/XBYM3z4qISI/AAAAAAAAE30/D07zhI_QqGwDVR7JCFrhDNePXE74v_JrgCHMYCw/image_thumb%255B15%255D?imgmax=800" border="0"></a></p><p>ポータル上での概要表示では ISE(Integration Service Environment) 利用時にはリンクが表示され、環境の状況を確認できるようになりました。</p><p><a href="https://lh3.googleusercontent.com/--yAaRWwlRkI/XBYM4gMDACI/AAAAAAAAE34/iVWTFXbANbABnGXjRn0Dm18DfBFyNyHoACHMYCw/s1600-h/image%255B48%255D"><img width="244" height="139" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-cT-oowHIREI/XBYM5P2m0lI/AAAAAAAAE38/2N60GSSwFtUN1uHYsbwrX2XuWf2Q02kjgCHMYCw/image_thumb%255B16%255D?imgmax=800" border="0"></a></p><p>このような形で、ISE 環境の状況を確認できるようになります。</p><p><a href="https://lh3.googleusercontent.com/-Y8LYHF5aYFI/XBYM5z4RmMI/AAAAAAAAE4A/jkMhxwLUm18tvKwDX9IW8-zChmbZ0LZUACHMYCw/s1600-h/image%255B51%255D"><img width="244" height="138" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-3c6IRcMBnXI/XBYM6qlltpI/AAAAAAAAE4E/tX4tGfmDvcY1iklFH2UsaLyoDnVznZ91ACHMYCw/image_thumb%255B17%255D?imgmax=800" border="0"></a></p><p>そして VS Code 用に Logic Apps の拡張機能が提供されているのは周知の話題ですが、いつのまにか VS Code 上でもグラフィカルな LogicFlow 表示を行えるようになりました。</p><p><a href="https://lh3.googleusercontent.com/-5PYbCg1pyYA/XBYM7ep8sQI/AAAAAAAAE4I/GF9yPHnWmaQ8-8iZBdWM5W3ljwpCPwN5gCHMYCw/s1600-h/image%255B54%255D"><img width="244" height="188" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-jR2QI_RO1_U/XBYM7wmxnwI/AAAAAAAAE4M/JYdpCfSCrn8F-fCRIsHc7nasPb1ByEJWACHMYCw/image_thumb%255B18%255D?imgmax=800" border="0"></a></p><p>自分の環境で試してみました。表示のみの対応とはいえ、JSON 直接眺めているだけではどのような LogicFlow かをイメージするのはかなりのプロの所業であったので、このようにデザイナー表示してくれるようになったのは非常にありがたい機能です。また、実行履歴も同様にデザイナー表示(モニタリングビュー)が可能になっているので、VSCode 上から Logic Apps にまつわる各種作業も、これでさらに実施しやすくなったかと思います。</p><p><a href="https://lh3.googleusercontent.com/-gCZX79ZUrZM/XBYM8tN9VlI/AAAAAAAAE4Q/tm893DoOpCUuoS3_7shxQuMtH7o7Pa6-gCHMYCw/s1600-h/image%255B15%255D"><img width="244" height="138" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-0_x3yT7s8ms/XBYM9ShP-_I/AAAAAAAAE4U/3gWO9hZNz68ULzSyVkS3uawOLamVobwsgCHMYCw/image_thumb%255B5%255D?imgmax=800" border="0"></a></p><p>作業中なものの一覧です。Azure IoT Hub や KeyVault などもありますが、今回の中で一番目を引くのはやはり Amazon SQS/S3/SNS ではないでしょうか。ストレージの Amazon S3 で起きたイベントを、キューサービスである Amazon SQS に連携し、メッセージサービスの Amazon SNS で各所へ配信する、といったことが Logic Apps から操作できるのではないか、と思うと隔世の感があります。Logic Apps は MS だけのものではなく、広く一般のサービスを相手に結合する、まさしく iPaas なサービスであることを表す素晴らしい話です。</p><p>個人的には Azure Consumption Mangament が気になっています。</p><p><a href="https://lh3.googleusercontent.com/-3OkkOP2SrA4/XBYM-IaeNFI/AAAAAAAAE4Y/9j0v4BIcGuQzlu-D-uyVVc9LGHSSxWIWACHMYCw/s1600-h/image%255B18%255D"><img width="244" height="138" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-rN0iuLhDFsM/XBYM-iM9kQI/AAAAAAAAE4g/qjTX2gTbitwigYWFUbA8whUmVurbakxAACHMYCw/image_thumb%255B6%255D?imgmax=800" border="0"></a></p><p>Global Integration Bootcamp の紹介……</p><p><a href="https://lh3.googleusercontent.com/-AhfowoFmbj8/XBYM_TQbw-I/AAAAAAAAE4k/ED6Zb5zFibYhyU4jY_k0ZPZNhqFH5MUiwCHMYCw/s1600-h/image%255B21%255D"><img width="244" height="138" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-LH8CF4UvJUU/XBYM_yY2pxI/AAAAAAAAE4o/saiUJLN_6aUO0xM_DO9eWZj7ng-5t0EMgCHMYCw/image_thumb%255B7%255D?imgmax=800" border="0"></a></p><p>Integrate 360 の紹介……</p><p><a href="https://lh3.googleusercontent.com/-c7VHPQ2nXzI/XBYNA6ZrKrI/AAAAAAAAE4s/lZmcr4rG5JEE5VJLEs2b2qUe7vBjiF7hQCHMYCw/s1600-h/image%255B27%255D"><img width="244" height="137" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-xp1e95GVtW0/XBYNBTl8eTI/AAAAAAAAE4w/U2epPtsWJWgo7l9Pkm_0tvQeMpM8x_s6QCHMYCw/image_thumb%255B9%255D?imgmax=800" border="0"></a></p><p>最後はいつものリンク集でした。</p>Ahfhttp://www.blogger.com/profile/01553064540426163049noreply@blogger.com0tag:blogger.com,1999:blog-3357313501722746592.post-65983809874823886202018-12-08T23:39:00.001+09:002018-12-08T23:41:06.294+09:00Logic Apps 実行履歴へのダイレクトリンク<p>先日、#IntegrationAMA として、いろいろな質問に答えるよ的な Twitter 上でのオンラインイベントが行われていました。その中で面白い話題があったので、試してみました。</p><p><a href="https://twitter.com/ToonVanhoutte" target="_blank">@ToonVanHoutte</a> さんが<a href="https://toonvanhoutte.wordpress.com/2018/12/08/navigate-directly-to-the-logic-apps-run-details/" target="_blank">まとめられていた内容</a>をもとにしています。ありがとうございます!</p><a name='more'></a> <p>Logic Apps の実行履歴は、ポータルからだと「実行の履歴」→確認したい実行をクリック、にて詳細がこのように表示されます。</p><p><a href="https://lh3.googleusercontent.com/-2ygg8BdAZYA/XAvXiPySp1I/AAAAAAAAE2A/rmY52tvVwYIfuu0Qe5vBkT1AM7uquBpUACHMYCw/s1600-h/image%255B3%255D"><img width="240" height="128" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-_8DT-1AD4NU/XAvXivXA3QI/AAAAAAAAE2E/vm7198qEhO4dtpdx_2U-25Vy8e36N5kBgCHMYCw/image_thumb%255B1%255D?imgmax=800" border="0"></a></p><p>ここで、確認したい実行を選択する手間があるわけなのですが、今回直接的にこの実行履歴を表示するリンクが Logic Apps チームとしてもおなじみの <a href="https://twitter.com/kevinlam_msft" target="_blank">Kevin</a> さんにより話されていました。</p><p><blockquote class="twitter-tweet" data-partner="tweetdeck" data-cards="hidden" data-conversation="none"><p lang="en" dir="ltr">You can construct the deep link to the Logic Apps run instance monitoring view using the following pattern:<a href="https://t.co/ibNoEdWPAl">https://t.co/ibNoEdWPAl</a><URL Encoded Run Resource Id><br />
(include the initial slash before encoding, for example, /subscriptions/{sub}/.../runs/{runid})</p>— Kevin Lam (@kevinlam_msft) <a href="https://twitter.com/kevinlam_msft/status/1071110468666707968?ref_src=twsrc%5Etfw">December 7, 2018</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> <p>これによると、以下の形式でアクセスすることにより、直接履歴表示が行えるとのことです。</p><p>https://portal.azure.com/#blade/Microsoft_Azure_EMA/LogicAppsMonitorBlade/runid%2Fsubscriptions%<strong>{subscription}</strong>%2Fresourcegroups%2F<strong>{resourcegroup}</strong>%2Fproviders%2FMicrosoft.Logic%2Fworkflows%2F<strong>{LogicFlowName}</strong>%2Fruns%2F<strong>{runId}</strong></p><p>subscription は自身のサブスクリプションID、resourcegroup は対象の LogicFlow が属するリソースグループ名、LogicFlowName は対象の LogicFlow 名、runId は実行ごとに割り振られるIDです。上記スクリーンショットで一部赤く塗りつぶしたものがそうです。</p><p><a href="https://lh3.googleusercontent.com/-WQu4G1Ie8Tg/XAvXjYrbFXI/AAAAAAAAE2I/onnZwc0ED4AInYIhZYQESC3L4Pab3Q1YgCHMYCw/s1600-h/image%255B10%255D"><img width="240" height="194" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-dmW2Eo43ILg/XAvXjzEUzsI/AAAAAAAAE2M/685fZV7G5DMKkr3va5yZYUpRQDnLg8ggACHMYCw/image_thumb%255B4%255D?imgmax=800" border="0"></a></p><p>そうして組み立てた URL でアクセスすると、このように直接実行履歴が参照できます。</p><p>この使いどころですが、Logic Apps を監視していてエラーとなった場合に、すぐに履歴を参照するための URL をメールなどに添付することで、確認の手間を省くことができることが考えられます。実環境で利用している場合は、これを使ってみると少し便利になるのではないでしょうか。</p>Ahfhttp://www.blogger.com/profile/01553064540426163049noreply@blogger.com0tag:blogger.com,1999:blog-3357313501722746592.post-78636716224402630502018-12-07T21:07:00.001+09:002018-12-07T21:07:26.762+09:00PowerApps が iOS/Android/Web のどれで動作しているかを確認する<p>PowerApps でアプリを作成している時、試験的な機能を利用しようとすると一部プラットフォームでしか利用できない事があります。<a href="https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/common-issues-and-resolutions" target="_blank">更新履歴</a>を見ていると、どの機能がプラットフォーム限定な制限があるのかも併せて記載されていますが、時と場合によってはその制限を知ったうえで、全プラットフォームで動作するアプリを作成することもあります。</p><p>そのような場合に、どのようにしてプラットフォームを判断するのかを試してみました。</p>
<a name='more'></a>
<p><a href="https://lh3.googleusercontent.com/-b_dGn7yHVkw/XApiUFIbS8I/AAAAAAAAE0M/mKXHf5wMLtAdxt4F_2QiogTIdnMSBFSiwCHMYCw/s1600-h/image3"><img width="240" height="132" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-qj8uletWqjU/XApiUue4IxI/AAAAAAAAE0Q/m31RfKHY6ksoVxD2KH6ivfPw8LJ3mC2yACHMYCw/image_thumb1?imgmax=800" border="0"></a></p><p>アプリの構成としては、メインメニューからボタンを押すと、それぞれのプラットフォーム専用画面へと遷移するだけの簡単なものにしています。アプリケーションが起動されたタイミングで、まずプラットフォームを判断するのですが、ここで Flow を利用します。</p><p><a href="https://lh3.googleusercontent.com/-FbEiVK7MOvY/XApiVAeHgII/AAAAAAAAE0U/L2PEOvDCr0gpPZZBLJSJls9qIEXJjsTCQCHMYCw/s1600-h/image12"><img width="360" height="240" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-LDmZ373Fjn0/XApiV6urX7I/AAAAAAAAE0Y/MIXV4t9Ew0A1bH-ZkdpwDCnWEiYfnn5vACHMYCw/image_thumb6?imgmax=800" border="0"></a></p><p>作成した LogicFlow は上記のようなものです。PowerApps トリガでアプリからの呼び出しを受け、条件判断を行って実行プラットフォームを判定させています。</p><p>ここで判定に利用しているのが、PowerApps トリガを呼び出した際に渡している各種 HTTP ヘッダーの値です。</p><p><a href="https://lh3.googleusercontent.com/-NFWbPNS2Yb0/XApiWZfPw_I/AAAAAAAAE0c/KbqlruDF-wkxu0aJZlLFO0miJJ-fVvXKwCHMYCw/s1600-h/image16"><img width="240" height="226" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-rGQQ9cFyYfo/XApiW14pYcI/AAAAAAAAE0g/3vAWs6R9N-0HwTWke6mAaVRSxoWRpKatwCHMYCw/image_thumb8?imgmax=800" border="0"></a></p><p>例えばこちらが Web ブラウザ上で実行した場合のヘッダーです。実際にはもっと多くの情報が渡されているます。</p><p><a href="https://lh3.googleusercontent.com/-1zU1LIoDlE0/XApiXcn1ssI/AAAAAAAAE0k/AYJ3LRHetSEFhN1-ArPTp5u5DJ7Wcln5QCHMYCw/s1600-h/image20"><img width="240" height="231" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-0zRC4JjL39E/XApiXxoMZmI/AAAAAAAAE0o/hFHMpI_iTgUKK3PMPK9tA1rhfixMbe0uQCHMYCw/image_thumb10?imgmax=800" border="0"></a></p><p>次にこちらが Android 端末からアプリを実行して呼び出した場合です。先ほどのものと比較すると、x-ms-user-agent というヘッダ値に Web とか android といった固有の文字列が設定されているのが見えます。ここの値を見て、実行プラットフォームを切り分けています。</p><p>自分の手元には iOS 端末がないので、</p><p><a href="https://lh3.googleusercontent.com/-5mYd83b4VPM/XApiYQwTAFI/AAAAAAAAE0s/f7HaV_xAK9EJ0dPQkg9TrwMgCyHqaVjyACHMYCw/s1600-h/image27"><img width="240" height="58" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-LuuklpElUTY/XApiY9VNpmI/AAAAAAAAE0w/oez6zdM12Bkr_FJ5gpmr2sz8ekb7v7-hgCHMYCw/image_thumb13?imgmax=800" border="0"></a></p><p>x-ms-user-agent に android という文字が含まれている→Android 環境</p><p><a href="https://lh3.googleusercontent.com/-yMf5hWCuUZs/XApiZiduuQI/AAAAAAAAE00/oA29svO8dAYX6vpYZKBZePaLRdsKrOc6QCHMYCw/s1600-h/image28"><img width="240" height="58" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-Xi_h3v1xk2M/XApiZyRnZmI/AAAAAAAAE04/whQUbXQXKEsiYs8DsiYyVlZtkMQbHj4FgCHMYCw/image_thumb14?imgmax=800" border="0"></a></p><p>x-ms-user-agent に Web という文字が含まれている→ブラウザ環境</p><p>それ以外→iOS環境</p><p>という形で判定を行わせています。判定した結果を、PowerApps コネクタの応答でアプリに戻しています。</p><p><a href="https://lh3.googleusercontent.com/-l69e910gpSk/XApiavIC8BI/AAAAAAAAE08/aypGfSXP5qEjQnmsGWdq13QosxdSn6DdQCHMYCw/s1600-h/image32"><img width="240" height="80" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-j5gyS0xn0rA/XApibF3pHGI/AAAAAAAAE1A/FCPVHvvang8eomQgmP-CFV3YYVOVnHKBgCHMYCw/image_thumb16?imgmax=800" border="0"></a></p><p>ここで指定した名称(x-ms-useragent)は、Flow を一度保存することでPowerApps 側でも認識されています。</p><p><a href="https://lh3.googleusercontent.com/-cwpWViPU1qo/XApibgnijmI/AAAAAAAAE1E/Rw1U-KzzWhUKqxakghO32EWFZZAUZHflACHMYCw/s1600-h/image36"><img width="240" height="22" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-OsBpqJJ2ZEE/XApicQgwyMI/AAAAAAAAE1I/QV5hnQLH3s4q1MrLLy9aKWwVKyjP5EHfgCHMYCw/image_thumb18?imgmax=800" border="0"></a></p><p>メニュー画面の OnVisible に <br><strong><font size="4">ClearCollect(ossetting, 起動時のOS判定.Run().'x-ms-useragent')</font></strong><br>と記載して、作成した Flow を実行し、その結果を ossetting という変数に記録させます。PowerApps の変数(コレクション)は、特にどこかで宣言が必要というものではなく、どこかで記載したタイミングでどこからでも利用できるようになります。また ClearCollect 関数は、指定した変数に何かしらの値を設定する関数です。このあたりも PowerApps のエディタ環境ではインテリセンスが働き、数文字入力すれば選択可能となります。</p><p><a href="https://lh3.googleusercontent.com/-FjjvlLh2i1s/XApic6E8aOI/AAAAAAAAE1M/5vUxRhaOSSEzUXk_DixRqggpt7YLtzWCQCHMYCw/s1600-h/image40"><img width="240" height="59" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-mZPJ0WWJ9XM/XApidTxNksI/AAAAAAAAE1Q/nVAvO4JzraUrdV3dVdJlo9G4DSGkZyOdgCHMYCw/image_thumb20?imgmax=800" border="0"></a></p><p>そしてメニューのボタンでは OnSelect に<br><strong><font size="4">If(Text(First(ossetting).Value)="Web"<br> ,Navigate('01_web',ScreenTransition.Cover)<br> ,Navigate('02_android',ScreenTransition.Cover)<br>
)<br></font></strong>と設定します。</p><p>これは条件判断を行う If 関数で、先程 Flow の結果を設定した変数 osseting の値が Web だったら、01_Web と名付けた画面へ遷移、Web でなければ 02_android と名付けた画面へ遷移させています。PowerApps の変数は、コレクションとして複数の値を保持できますので、たとえ一つしか値を設定していなくても、First 関数で「一つ目の値」を指定する必要があります。</p><p><a href="https://lh3.googleusercontent.com/-uz-0rrXYtFI/XApidxE5I6I/AAAAAAAAE1U/xh6GgVQKpwEhpjhfYmDABK4VS5ovLS-SQCHMYCw/s1600-h/image44"><img width="240" height="172" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-pD1ZvoT-FcI/XApieCP6XuI/AAAAAAAAE1Y/OlEtqq2S0KUsoEYN1-MKcKuD7Hc2XUuzQCHMYCw/image_thumb22?imgmax=800" border="0"></a></p><p>試しにブラウザ上で実行すると、このように Web 用の画面が表示されます。</p><p><a href="https://lh3.googleusercontent.com/-q377eR-bVxI/XApie6JmfII/AAAAAAAAE1c/0_073nUAogIkyevnKIHyhn0rHEKc153fgCHMYCw/s1600-h/image48"><img width="240" height="140" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-In6bEYLJi3g/XApifbfuI3I/AAAAAAAAE1g/-6ftGwpwSzYw5wGUPPxoBVknue7qTSuJACHMYCw/image_thumb24?imgmax=800" border="0"></a></p><p>Android 端末上で実行すると、このように Android 用の画面が表示されます。</p><p>このようにして、PowerApps がどのプラットフォームで実行しているかを判断することができます。最終的にはほとんどの機能は全てのプラットフォームで利用可能になるはずですので、あくまでも一時的な対処となりますが、こうすることで事前提供機能であっても、アプリケーションに組み込むことが可能です。</p>Ahfhttp://www.blogger.com/profile/01553064540426163049noreply@blogger.com0tag:blogger.com,1999:blog-3357313501722746592.post-72522855888626055282018-11-22T14:31:00.001+09:002018-11-22T14:31:36.067+09:00Microsoft Flow のコネクタで接続エラーとなっているものをチェックする<p>Microsoft Flow を利用していて多くの人が感じるものに、作成したコネクタの接続情報が定期的に接続エラーになってしまう、というものがあります。接続時に利用しているアクセストークンの期限切れなどが理由で、気が付くとエラーになっていたりするのですが、毎回ポータルから確認するというのも手間でした。</p><p>今回、このチェックを Flow にて自動化してみました。</p><p>エントリとして結構長いので、先に確認したい方は <a href="https://github.com/ahf0124/LogicFlow-ja/blob/master/CheckFlowErrorConnections/Flow%E6%8E%A5%E7%B6%9A%E6%83%85%E5%A0%B1%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%A8%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%82%82%E3%81%AE%E3%82%92%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%9A%E7%9F%A5%E3%81%99%E3%82%8B_20181122052634.zip" target="_blank">github</a> にエクスポートしたパッケージを用意してありますので、こちらもご利用ください。</p>
<a name='more'></a>
<p>まず前段階として、Flow でどのように接続情報が管理されているかについてです。</p><h2>1.Flow 上での接続情報と取得</h2><p>Logic Apps では API 接続として管理されている内容ですが、Flow では接続メニューか確認が行えます。その際、接続エラーとなっているものがあった場合、一覧上でエラーと表示され始めて問題が起きていることに気づける仕組みです。そのため、ある日突然 Flow が動かなくなってしまった、という状況に陥りやすい形となっています。</p><p><a href="https://lh3.googleusercontent.com/-7keqdjOXeNE/W_Y_BF3uyCI/AAAAAAAAEvM/mARdmZRWGQcRY3pLBqHt7Rsw0FQ-U7jjgCHMYCw/s1600-h/image%255B3%255D"><img width="240" height="120" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-Ku4Y0ygXHYc/W_Y_Bhb3m2I/AAAAAAAAEvQ/JHhmUJPhIKoavhMeObfuPBPu5Zj1qAWigCHMYCw/image_thumb%255B1%255D?imgmax=800" border="0"></a></p><p>Flow では環境ごとに接続情報が管理されていて、その情報は Flow Management コネクタにて取得が可能です。</p><p><a href="https://lh3.googleusercontent.com/-VMkUCNGvQ8A/W_Y_BwD2pSI/AAAAAAAAEvU/IjN_5AnD2q4gSGexHkRbSCzU6JTT_1SJQCHMYCw/s1600-h/image%255B10%255D"><img width="240" height="46" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-6y_Zo1_5fH4/W_Y_CW7pW-I/AAAAAAAAEvY/d0OID6NMPDcd18JfCrdXyBBPtQgjawvoACHMYCw/image_thumb%255B4%255D?imgmax=800" border="0"></a></p><p>List My Connections(ListConnections) アクションはこのような形で、取得対象となる環境を指定して利用します。</p><p><a href="https://lh3.googleusercontent.com/-Zy1f_n_qE04/W_Y_Cryc2KI/AAAAAAAAEvc/xvrlfTyTHfUbjv1PH5TbOjgNFOUPIuikwCHMYCw/s1600-h/image%255B11%255D"><img width="240" height="195" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-3zfBTE2Aum8/W_Y_DFEQ0oI/AAAAAAAAEvg/nW6j8nApUqsNl02Eij2xwAWSCIRp7R87gCHMYCw/image_thumb%255B5%255D?imgmax=800" border="0"></a></p><p>実行すると環境に保持されている接続情報が取得でき、その中の情報として</p><p>{<br> "name": "shared-approvals-zzzzzzz-xxxx-4883-bef8-1167d33409c9",<br> "id": "/providers/Microsoft.PowerApps/apis/shared_approvals/connections/shared-approvals-zzzzzzz-xxxx-4883-bef8-1167d33409c9",<br> "type": "Microsoft.PowerApps/apis/connections",<br> "properties": {<br> "apiId": "/providers/Microsoft.PowerApps/apis/shared_approvals",<br> "displayName": "Approvals",<br> "iconUri": "<a href="https://psux.azureedge.net/Content/Images/Connectors/Approvals3.svg"">https://psux.azureedge.net/Content/Images/Connectors/Approvals3.svg"</a>,<br> "statuses": [<br> {<br> "status": "Connected"<br> }<br> ],<br> "connectionParameters": {<br> "sku": "Enterprise"<br> },<br> "keywordsRemaining": 38,<br> "createdBy": {<br> "id": "zzzzzzz-xxxx-4447-b638-0b3aabfcae18",<br> "displayName": "クマー",<br> "email": "ahf@hogehoge.onmicrosoft.com",<br> "type": "User",<br> "tenantId": "zzzzzzz-6ace-4629-b910-6dc08bc4b453",<br> "userPrincipalName": "ahf@hogehoge.onmicrosoft.com"<br> },<br> "createdTime": "2018-04-10T03:59:34.5393925Z",<br> "lastModifiedTime": "2018-04-10T03:59:34.5393925Z",<br> "environment": {<br> "id": "/providers/Microsoft.PowerApps/environments/zzzzzzz-xxxx-4ef6-a237-0a357b9910de",<br> "name": "zzzzzzz-xxxx-4ef6-a237-0a357b9910de"<br> }<br> }<br>
}<br>
</p><p>このような形で、接続情報を取得できます。その際、statuses の配列の中に、status というキー名で接続状況が記載されており、ここが Connected でないものは接続エラーとなっているものとなります。ここをチェックすることで、対応が必要な接続をピックアップする、というのが今回のメインです。</p><h2>2.作成した LogicFlow</h2><p><a href="https://lh3.googleusercontent.com/-jTnEqEWmWW0/W_Y_DsOqATI/AAAAAAAAEvk/xuk-kJ3_qG4AkWhzg2OOADqGawzQEGJYQCHMYCw/s1600-h/image%255B16%255D"><img width="360" height="580" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-ZF02TNPZ78M/W_Y_D9126II/AAAAAAAAEvo/VFjFwvkQKncRQaevskkRcYCZp76Q_M0NACHMYCw/image_thumb%255B8%255D?imgmax=800" border="0"></a></p><p>今回作成した LogicFlow は上記のようになりました。単純なチェックだけであれば、この半分以下で済むのですが、それを通知しようとした際に色々問題がみつかったため、このような大き目の LogicFlow となっています。全体の流れとしては以下の通りです。</p><ol><li>環境にある接続情報を取得</li><li>環境にある Flow の一覧を取得</li><li>接続情報から Connected でないものにフィルタリング</li><li>Connected でない接続が現在でも利用されているかを Flow 一覧から確認</li><li>現在も利用されている接続だった場合、コネクタ名を記録</li><li>記録された結果から重複を取り除き、メールで通知</li></ol><h2>3.接続情報を利用しやすい形に調整する</h2><p>Flow Management コネクタで取得した接続情報は、値として大きく複雑な構造であるので、後続で利用しやすい形に調整します。選択アクションを利用して、必要項目に絞った配列へと再作成しています。</p><p><a href="https://lh3.googleusercontent.com/-boZTi-Tzj8M/W_Y_EcPuuSI/AAAAAAAAEvs/1i24rnd8YOIE0A1G8jmZFPkRHnSlkTqgACHMYCw/s1600-h/image%255B20%255D"><img width="240" height="91" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-6DhfnqPXoSk/W_Y_E9cyy2I/AAAAAAAAEvw/WymJqiekXMkxUSmbp9-5CJMUIGKsWs1nwCHMYCw/image_thumb%255B10%255D?imgmax=800" border="0"></a></p><p>今回の処理で必要なのは「名称」と「接続状態」です。名称については、取得できた値をそのまま利用していますが、この値は Flow 内部で命名された名称で、利用者側にはオープンにされていないものです。</p><p>もう一つの接続状態は、以下の関数を指定して利用しやすくしています。</p><p><strong>first(item()['properties']['statuses'])['status']</strong><p>一番最初にサンプルの接続情報を記載しているので、そこと合わせてみてください。ポイントは、接続状態が記録される status という値は、properties.statuses に<strong><font color="#ff0000">配列</font></strong>で設定されている点です。そのため first 関数を利用して、statuses 配列の最初の値を利用しています。定義として配列なので、他の値が来るのかと思っていたのですが、今時点では複数の接続状態が設定されているケースは確認できていません。<h2>4.利用している接続情報のみチェックを行う</h2><p><a href="https://lh3.googleusercontent.com/-wZE5I22I380/W_Y_FIGjytI/AAAAAAAAEv0/A8q6QPvtjQg8K4zZmrnfwncPoxdWfHeAgCHMYCw/s1600-h/image%255B24%255D"><img width="240" height="45" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-o4OxfozbONM/W_Y_FjUB1mI/AAAAAAAAEv4/wEl2Ke2XqkM2GNGp4xkIrHFRA0Hx3onbACHMYCw/image_thumb%255B12%255D?imgmax=800" border="0"></a><p>全体図を見てもらうと、接続情報を取得するのと同時に、作成した Flow の一覧を取得しているのに気づかれると思います。これは理由があって、Flow の接続情報には現在利用していないものも残っており、チェックが不要なものも含まれているためです。また、Flow のポータル上に表示されていないゴミ情報も残っていることがあり、余分な処理を省く必要があります。<p>そのため、現在存在している Flow の一覧を取得し、そのどれかで利用されているかどうかという判断を行っています。<p>"value": [<br> {<br> "name": "zzzzzzzz-xxxx-478b-b279-f16ef9ab1e80",<br> "id": "/providers/Microsoft.Flow/environments/zzzzzzzz-df04-4ef6-a237-0a357b9910de/flows/zzzzzzzz-xxxx-478b-b279-f16ef9ab1e80",<br> "type": "Microsoft.Flow/environments/flows",<br> "properties": {<br> "apiId": "/providers/Microsoft.PowerApps/apis/shared_logicflows",<br> "displayName": "Get an email report of approvals waiting for my response",<br> "userType": "Owner",<br> "state": "Stopped",<br> "connectionReferences": {<br> "shared_commondataservice": {<br> "connectionName": "shared-commondataser-zzzzzzzz-d7b6-4703-ae28-91074b9e1f96",<br> "source": "Embedded",<br> "id": "/providers/Microsoft.PowerApps/apis/shared_commondataservice",<br> "displayName": "Common Data Service",<br> "iconUri": "<a href="https://connectoricons-prod.azureedge.net/commondataservice/icon_1.0.1002.1175.png"">https://connectoricons-prod.azureedge.net/commondataservice/icon_1.0.1002.1175.png"</a>,<br> "brandColor": "#742775",<br> "tier": "NotSpecified"<br> },<br> "shared_flowpush": {<br> "connectionName": "shared-flowpush-zzzzzzzz-cacb-432b-b285-6157e8d10791",<br> "source": "Embedded",<br> "id": "/providers/Microsoft.PowerApps/apis/shared_flowpush",<br> "displayName": "Notifications",<br> "iconUri": "<a href="https://psux.azureedge.net/Content/Images/Connectors/FlowNotification.svg"">https://psux.azureedge.net/Content/Images/Connectors/FlowNotification.svg"</a>,<br> "brandColor": "#FF3B30",<br> "tier": "NotSpecified"<br> }<br> },<br> "createdTime": "2018-04-10T04:25:58.2803477Z",<br> "lastModifiedTime": "2018-04-11T02:05:13.2155405Z",<br> "templateName": "33d7ad77f610418d8cf3d61fe39fd507",<br> "environment": {<br> "name": "zzzzzzzz-df04-4ef6-a237-0a357b9910de",<br> "type": "Microsoft.Flow/environments",<br> "id": "/providers/Microsoft.Flow/environments/zzzzzzzz-df04-4ef6-a237-0a357b9910de"<br> },<br> "definitionSummary": {<br> "triggers": [ ...以下省略</p><p>Flow の情報は上記のように取得できます。Logic Apps では CodeView からも参照できる、LogicFlow の定義そのものです。この中に、利用している接続の情報も含まれています。</p><p>properties.connectionReferences の中にその接続情報が記載されているのですが、ここが今回の作業における一番のネックでした。connectionReference の中は、接続名をキーとして、その詳細情報が記録されています。つまり、この中にどのような名称(shared_commondataservice や shared_flowpush )で値が記録されているか、というのが不定だということです。LogicFlow の現在の機能では、キー名を取得することができませんので、この部分をどうするかというのが一番の問題でした。</p><p>この点に対しては、次のようなやり方にて対応しています。</p><p><a href="https://lh3.googleusercontent.com/-Pgj8Iu5DFzQ/W_Y_GFRVavI/AAAAAAAAEv8/s0-3rzPKxh8A5HoylVlSDEocqlFce5ZYgCHMYCw/s1600-h/image%255B28%255D"><img width="240" height="54" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-8gQ9dT22uVo/W_Y_GcO9VSI/AAAAAAAAEwA/jpbe7PufN5IamEqJOyjrhrnToHEJW3PCACHMYCw/image_thumb%255B14%255D?imgmax=800" border="0"></a></p><p>Flow に記録されている接続情報は、 キー名:[決まったレイアウト]、というフォーマットです。connectionReferences 配下だけに限定できればその後の処理も行いやすくなります。</p><p>split(replace(string(items('Flowごとの接続情報をチェックする')['properties']['connectionReferences']),'},','}},'),'},')<p>見ての通り、非常に力業となります。connectReference の値が、”connectReference “: { ~ } という形式で保持されているので、、”connectReference “: な部分を除去し、{ ~ } と値だけの状況にします。例えば、複数の値が設定されていた場合は、{ ~ }, { ~ }・・・、という形式に調整を行い、値だけの配列を作成します(なお、上記の関数にあるように、ここでは除去を行ってはいませんが、後続の処理にて行っています)</p><p>そうすることで、後続の処理では ForEach ループを用いてこの作成した配列をもとに、判定を行うことが可能になります。</p><p><a href="https://lh3.googleusercontent.com/-ycOFiEk2IMs/W_Y_GypFUFI/AAAAAAAAEwE/SZZT2Zc_qdgHrMZvH3JfMx1KyhnNdZRZwCHMYCw/s1600-h/image%255B32%255D"><img width="240" height="74" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-RFiChCpWIdQ/W_Y_HWQENwI/AAAAAAAAEwI/lP-ITL-lS4AzTeTvINk4PgHZ4jcJj--tACHMYCw/image_thumb%255B16%255D?imgmax=800" border="0"></a></p><p>ループの中では、利用しやすいように、先ほど {~} な形に変換した値を json 関数にて JSON値 にしています。その際に先ほどあった connectReference の部分を除去しています。</p><p>json(substring(item(), add(indexOf(item(), ':'), 1), sub(length(item()), add(indexOf(item(), ':'), 1))))<p>キー名と値を区切る : の位置を indexOf 関数で取得し、その次の文字から末尾までを抽出させ、結果を JSON 関数で JSON 値に変換しています。<p>「検索条件の設定」は特に行う必要はありません。テストしている際に確認をしやすくするためのものです。<p><a href="https://lh3.googleusercontent.com/-ixmpTft35I0/W_Y_Hpvx6fI/AAAAAAAAEwM/0FlsLVof2PMgTtMjFxi6XwKReIVOW54IwCHMYCw/s1600-h/image%255B39%255D"><img width="240" height="69" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-X1T9LyCvejk/W_Y_IPoq9JI/AAAAAAAAEwQ/iGeTnQFuCkQbdIFixUF6Vcueqt9fPd6dgCHMYCw/image_thumb%255B19%255D?imgmax=800" border="0"></a><p>Flow の情報にある接続情報の中に、エラーとなった接続譲歩と同一の名称が存在しているか、値をフィルタリングさせています。<p><a href="https://lh3.googleusercontent.com/-Iv2Ue_uYRWs/W_Y_It-OsBI/AAAAAAAAEwU/20ZiEoSsai8ZJwxlXoF_ZHKpagWRitRcgCHMYCw/s1600-h/image%255B40%255D"><img width="240" height="70" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-BGLSz5qz0PY/W_Y_I-XnVLI/AAAAAAAAEwY/q_rFm7ypt4wuE67XQ-MwGlscaR03_6cXgCHMYCw/image_thumb%255B20%255D?imgmax=800" border="0"></a><p>このあたりになると、ダイアログ側で利用したい値が出てこないことが多いので、詳細設定モードを利用しての直接記載が便利になってきます。<p><a href="https://lh3.googleusercontent.com/-2keToQAY1OU/W_Y_JUMc3VI/AAAAAAAAEwc/d8q3jgbx0o4Z7_pJItU03PETHgzhFRaowCHMYCw/s1600-h/image%255B44%255D"><img width="240" height="59" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-wNYCa6b7BkM/W_Y_JrHdeQI/AAAAAAAAEwg/ADIrLQHEgzYuFVe2rp-HpohOZokMPJ-lACHMYCw/image_thumb%255B22%255D?imgmax=800" border="0"></a><p>フィルタした結果からの判断部分は、このように記載しています。</p><p>@greater(length(body('接続一覧から対象の接続情報に絞り込む')), 0)</p><p>フィルタした結果が 1 件以上あるのであれば、この Flow でエラーとなっている接続を利用していることになります。ここで 0 件であれば、この Flow では利用されていないことになります。</p><p><a href="https://lh3.googleusercontent.com/-3ZefxWj50_Q/W_Y_KIdUEdI/AAAAAAAAEwk/9lONBCIS9NgNeYuuOZ1j65UCOUoinEo1gCHMYCw/s1600-h/image%255B48%255D"><img width="240" height="57" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-NvdeRuCW6Z8/W_Y_KcZX8sI/AAAAAAAAEwo/0RZbZfhpsbEqKF2HMhTvVr8VTfX2py2hwCHMYCw/image_thumb%255B24%255D?imgmax=800" border="0"></a></p><p>1 件以上あった場合ですが、今回はこのタイミングでその接続がエラーかどうかを判定させています。このあたりは処理の組み立て方な部分でして、あらかじめエラーのものだけに絞ってから処理を行えば、ここでの判定は不要になります。</p><p>@not(equals(first(first(actionBody('接続一覧から対象の接続情報に絞り込む'))['properties']?['statuses'])?['status'], 'Connected'))</p><p><a href="https://lh3.googleusercontent.com/-41ORW-QKAxc/W_Y_K_qIPXI/AAAAAAAAEws/XpQ2nS7MsVctwfMODKZx6tPysUI4mob8gCHMYCw/s1600-h/image%255B52%255D"><img width="240" height="137" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-ml9Ythjoz7g/W_Y_LQ3XDOI/AAAAAAAAEww/m_fTOfgUjWUR4yqNbWKwuQUHCE_Ku3gJwCHMYCw/image_thumb%255B26%255D?imgmax=800" border="0"></a></p><p>判定結果でエラーだった場合には、後で結果を送信するためにも配列で作成した変数に追加しています。ここで配列を利用している理由ですが、同じコネクタの接続でも複数作成することができますので、単純に文字を追加していった場合は結果が重複してしまいます。そのため一度配列に追加し、あとで重複分を除去しています。</p><p><a href="https://lh3.googleusercontent.com/-PheAbtLhSkc/W_Y_LjBe29I/AAAAAAAAEw0/esef8uY8SO0ID_aVHdExbCElHWphs9WTgCHMYCw/s1600-h/image%255B56%255D"><img width="240" height="40" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-rNAWFqZ7ObM/W_Y_M7p2CDI/AAAAAAAAEw4/Y0cRt4Hlp2sEV03ZBScYnWzCP7DRD4sVQCHMYCw/image_thumb%255B28%255D?imgmax=800" border="0"></a></p><p>重複の除去は、union 関数を利用します。union 関数は二つ配列を指定する必要があるのですが、ここでは同じ変数を指定します。そうすることで重複が除去できます。</p><p><a href="https://lh3.googleusercontent.com/-pKAM5FrjYiw/W_Y_NMMgMUI/AAAAAAAAEw8/Y9HggbWo0ZMnbR8OBwm2prY1uuHV0y4pwCHMYCw/s1600-h/image%255B60%255D"><img width="240" height="124" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-VxveR6jyCfw/W_Y_NiynhkI/AAAAAAAAExA/6rGGly-Ib8U0_WRgZnUVV88S1wQcTU_lwCHMYCw/image_thumb%255B30%255D?imgmax=800" border="0"></a></p><p>重複を除去したら、最後に通知用のメールを作成します。エラーな接続が記録されている配列を、join 関数にて一つの文字列へと変換します。その際、<br> で区切らせ、メールの文面上で改行させます。</p><p><img width="240" height="119" src="https://pbs.twimg.com/media/Dsk00r5UwAAkMUY.jpg:large"></p><p>実際に送付された結果はこのようになりました。こうすることで、このメールが届いた時だけ Flow ポータルへ行って接続情報を修正すればよいと、確認行為自体を自動化することができます。</p>Ahfhttp://www.blogger.com/profile/01553064540426163049noreply@blogger.com0tag:blogger.com,1999:blog-3357313501722746592.post-87051235104794342252018-09-28T12:32:00.001+09:002018-09-28T12:32:34.600+09:00Logic Apps Live Sep 26 2018<p>今週に開始された MIcrosoft の大型イベント Ignite で、久々に Logic Apps チームによる Logic Apps Live が行われていました。事前告知がなかったので、気づいたのは放送終了後・・・。</p><p><a href="https://lh3.googleusercontent.com/-QmhUNth2y8I/W62gqyRXpQI/AAAAAAAAEto/rxw5SnRrW2A8uiEjREGIIkQm0WZ5QWgnACHMYCw/s1600-h/image%255B3%255D"><img width="240" height="135" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-CXqjpiG0QmE/W62grXwiFNI/AAAAAAAAEts/mLFsuCTAnMMGieT2cgV7H4OnuyLGH1TpACHMYCw/image_thumb%255B1%255D?imgmax=800" border="0"></a></p>
<a name='more'></a>
<p><a href="https://lh3.googleusercontent.com/-gdgkXwXp8_I/W62gsBVJWVI/AAAAAAAAEtw/qAoWaOpm_2QhPe-Fy8foE1055M97iGAJwCHMYCw/s1600-h/image%255B19%255D"><img width="240" height="135" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-yKMwTPCAgJQ/W62gs0d7gEI/AAAAAAAAEt0/zFIMMjXEY70VlqP_SleNwfka7Mo4B_M8QCHMYCw/image_thumb%255B9%255D?imgmax=800" border="0"></a></p><p>今回の更新情報です。すでに発表されているので、多くの事は周知な話題かと思います。中国リージョンでの対応、VS Code での拡張機能提供、ISE のプライベートプレビュー開始、統合アカウントの制限向上、マネージサービス認証、トラッキング ID の spliton 対応、Azure Functions V2 対応、となっています。</p><p>また新規/更新コネクタとしては、MQ、SFTP-SSH、SAP があります。VSTS は Azure DevOps へとサービス名に合わせた名称変更です。</p><p><a href="https://lh3.googleusercontent.com/-x1ouwu7L8MY/W62gtjpVIuI/AAAAAAAAEt4/78XGT9hYGoQKu9Vf9RrjguQx3l8V4tN-gCHMYCw/s1600-h/image%255B18%255D"><img width="240" height="135" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-4h6SPNi41OU/W62guIb1iZI/AAAAAAAAEt8/Tp7G7byWgGQLidxqfrz84SrrV1VAgF9YgCHMYCw/image_thumb%255B8%255D?imgmax=800" border="0"></a></p><p>Azure Scheduler が Sep 30 2019 に廃止されることがアナウンスされました。Logic Apps や Flow でも内部的には利用していたと思われますが、もし Scheduler を利用している場合は、移行が必要です。Logic Apps としては特に気にする必要はなく移行されるようです。</p><p><a href="https://lh3.googleusercontent.com/-35SRNwrcKdk/W62guhX7JJI/AAAAAAAAEuA/LBZ8TJbQF6gkmWgNiEgFUP5zNMqXCsyKACHMYCw/s1600-h/image%255B17%255D"><img width="240" height="150" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-Jpz2gba01mg/W62gvQKSdZI/AAAAAAAAEuE/6OgrXbEraq4VbUKtN2WezR6SZQJCT051ACHMYCw/image_thumb%255B7%255D?imgmax=800" border="0"></a></p><p>デモとして、リリースされたばかりの VS Code 用拡張機能を紹介しています。自分でも利用してみたのですが、トリガの履歴も含めた管理業務的にも利用可能なのは面白いと思いました。ただ、LogicFlow を直接編集できることについては、正直なところ自分が思うターゲット層(非開発者)には適していないと思っているので微妙な気持ちです。</p><p>また統合アカウントに関するものも、VS Code 上で編集ができるのは素晴らしいと思いました。統合アカウントを利用している場合、XML 変換用の XSLT スタイルシートや Liquid テンプレートを利用します。これを直接参照したり編集できるのは便利です。</p><p>他のファイルについても、今後対応予定とのことです(カスタム DLL とかかな)</p><p><a href="https://lh3.googleusercontent.com/-jDAhg7BZrEE/W62gwHG88HI/AAAAAAAAEuI/gn0FrHJXCjwTMz_jLSi4T-e9K6bW1PyRwCHMYCw/s1600-h/image%255B16%255D"><img width="240" height="135" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-GIcJGDst7P8/W62gwycK5tI/AAAAAAAAEuM/b25BlaiqQqIakDE1UstMRZ4G4ZV6stJXQCHMYCw/image_thumb%255B6%255D?imgmax=800" border="0"></a></p><p>追加の情報として、メールでもアナウンスが届いている人がいるかと思いますが、Logic Apps のコネクタが配置されている IP アドレスが変更になります。アクセス制限を行っている場合は、変更が必要です。</p><p>デザイナー上でのコネクタ一覧表示方法の変更、XSLT3 サポート、ForEach アクションにおける item() 関数が指し示す値のピック表示、IF 関数の遅延評価対応、追跡関係の設定対応、そしてここまでに追加されたがサービスコネクタの一覧となります。</p><p><a href="https://lh3.googleusercontent.com/-HUhc0oQtzj8/W62gxnMXlqI/AAAAAAAAEuQ/yeyqIO460BAFFXa9wShjSBggIi_5-rSAACHMYCw/s1600-h/image%255B31%255D"><img width="240" height="72" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-C4Ft9iCR_T4/W62gyRuAfSI/AAAAAAAAEuU/7c0U_zZHVTAM1jj1vK4jTW6U9rCK8_svQCHMYCw/image_thumb%255B15%255D?imgmax=800" border="0"></a></p><p>ForEach アクションのピック対応は、こういった形でデザイン中にカーソルを当てると、関数として記載している items() ではなく実際に利用される項目を表示するようになったものとなります。</p><p><a href="https://lh3.googleusercontent.com/-EvG4NIF-w3U/W62gyxdHnyI/AAAAAAAAEuY/JNZgnUTaYLgc76J2qNn8bPV_hmCS75LOwCHMYCw/s1600-h/image%255B27%255D"><img width="240" height="135" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-dyEXzg7l-Hw/W62gzZqCAfI/AAAAAAAAEuc/w0GYm_6TXPc94ru9QmMdjWw5Qzc1j_f-ACHMYCw/image_thumb%255B13%255D?imgmax=800" border="0"></a></p><p>現在作業中となるものです。</p><p>ISE のパブリックプレビュー、スマートデザイナー、HTML でのテキスト入力対応、実行の取り消し、アリゾナへの政府向けリージョン、といったところが主だったところのようです。また開発中サービスコネクタとして、色々上がってます。Azure のサービスで言えば Iot Hub と Budget が開発中のようです。Microsoft Forms Pro とあるのですが、Office365 の Foms も、追加で何かしら対応するということでしょうか……? あと知っている人がいたら教えてほしいのは IBM3860 です。これは一体……?</p><p><a href="https://lh3.googleusercontent.com/-G3zAwrWSE2E/W62gz6LvDUI/AAAAAAAAEug/J-KerqcN9ZsdDMn56AAs2rid0XOX2_REwCHMYCw/s1600-h/image%255B26%255D"><img width="240" height="136" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-FWG-GjogrII/W62g0YNM9NI/AAAAAAAAEuk/1Qt6QVD2wUQLBaZiDJ8RMLfHGV9Z8c6JQCHMYCw/image_thumb%255B12%255D?imgmax=800" border="0"></a></p><p>最後に Blog やロードマップの紹介を行って終わりです。</p><p>今回は本当にゲリラ的に行われたのもあって驚きました。</p>Ahfhttp://www.blogger.com/profile/01553064540426163049noreply@blogger.com0tag:blogger.com,1999:blog-3357313501722746592.post-15215007859476206652018-09-26T09:58:00.001+09:002018-09-26T09:59:00.593+09:00LogicFlow のトリガに関数を指定してはいけない<p>LogicFlow で利用できるトリガの中には、設定を色々行えるものがあります。その際に、大体は直接的な値を設定することが多いのですが、場合によっては LogicFlow の関数を利用したいこともあります。ところが現状の仕様ではそれは面倒を招いてしまっていました。</p><a name='more'></a><br />
<p>実際にはこのような形で、トリガ上で関数を利用することが可能です。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjC2oqgpRPeibO8q9rD4k4Nfpo0G9HWZ0m0trRzoTYXg9wT9Tp2hVmCTrlgahYKSehTbDtRM1dqiQtvVIaSKyJQCBM8s4KCn1ncLp90duyPzyBuL2OFVzN3reeUGuEwScKWr8Ighmj34MiK/s1600-h/githubdoc%255B3%255D"><img width="240" height="133" title="githubdoc" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="githubdoc" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyOYpdLfmXkmnP2Z_XpQC5qHo_BCFPNftblxaJGB-LjWavaSTUMrfMZOS6f6Gisol-6GeXhNbVQdzxKXEtw8V2ST6yQEnNOXNHr4AaUd1gdokss7-sH8lco4Cm2DkTG1tGKX8Ujb-WyrIS/?imgmax=800" border="0"></a></p><p>HTTP コネクタをトリガとして利用した場合です。URL を関数を利用して設定しています。上記の場面では以下のような記述を行いました。</p><p><strong>@concat('https://api.github.com/repos/MicrosoftDocs/azure-docs/commits?path=articles%2Fconnectors&since=', uricomponent(adddays(utcNow(),-1)))</strong><p>これは Github の API を呼び出して、Azure Logic Apps のドキュメントリポジトリでのコミット履歴を取得しています。その際に「前日までに」という条件を付与したかったので、adddays 関数を利用して動的に指定を行っています。<p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlSSd8OHF5GrHMwTYjZ-4DZvfmospO7-51ClkmQIgezWdB-v-MVmIyD56vFvaZGqAV9tOhnouA_sxTuNeEJK2vwu4u8mS5BfIOLRKAlGqzjuK0g8ra5RNok56PNSpT0ao8z4EuSJLeuK0r/s1600-h/image%255B4%255D"><img width="240" height="278" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2Ze81KX4b7ky6BPhe1vXetm5BGw4atTzpW6NaZpUiV8KNiGJ_ii35m-UbhEL6eAZdiF5HTXBH8yTGi0RJjfy6iucqlxLefQiFhbcsb5hmppJJ18DhvAA5J3rzz1IPprcGOgsA2bMBdsyj/?imgmax=800" border="0"></a><p>呼出結果はこのように、前日までという指定が正しく行えています。<p>ところがこの状態になると、LogicFlow のデザイナー上で編集ができなくなります。最初の状態で fx となっている箇所をクリックしようと、ダイアログが表示されず編集することができません。この場合は、CodeView にて直接編集を行う事しかできません。<p>Flow で同様の状況を作成してみようと思ったのですが、ダイアログが出ない状態でいくら関数を入力しても、関数として認識されないのか作成できませんでした。ですが、Logic Apps からのインポートを行えば、同様の現象は再現可能と思われます。<p>このように、トリガで関数を利用するとその後のメンテナンスが非常に面倒なことになりますので、できる限り利用を控えるのがよいかと思いますが・・・UserVoice 経由でリクエストをあげるのが一番よさそうです。Ahfhttp://www.blogger.com/profile/01553064540426163049noreply@blogger.com0tag:blogger.com,1999:blog-3357313501722746592.post-35826166719177297132018-09-12T10:27:00.001+09:002018-09-12T10:27:49.629+09:00JSON などの配列値を縦横変換するパターン<p>日頃 JSON の値と戯れていると、時々その値をどうこうするときに面倒くさいと思うことが多いかと思います。配列な値が関連すると、面倒くささはさらに増してしまうので、このあたりをなんとかできないかなと考えてみました。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrPiLrIvh_CO-E5ww4frIma5EatOea_mFyuwm_XHXgbUOQjG4sfCGZ05czWsniG_YZPhjNLvPSAcl-ItSPlHIiyqDhENlilAjh9j0z-sj2O00GSvV2uLcBl8tfRsRSAwNkaTLF4zG64T3l/s1600-h/image%255B3%255D"><img width="240" height="167" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS1O5RNU7YlqXG8Loets-wosVn1XtxP0HR2fK7Cxu8HTdMJJsM2_mgycFG50QJI_hvwgxGQQzl-dtbDhvG-H3JRzcMsmNBmaGtS-Fh21Kpg_OsePsqgjb_9reLHFDRK_ABvkiGouR5-e5C/?imgmax=800" border="0"></a></p><p>例えば上記の例な場合です。通常であれば SampleArray でループさせて一つずつ値をチェックすることでしか、現状の Logic Apps や Flow では対応ができないので、ここを少しでも楽にしたいというのが目的です。</p>
<a name='more'></a>
<p>データベースでは PIVOT などを利用した縦横変換の仕組みがありますので、それを用いることが多いですが、その仕組みをもたない Logic Apps では自前で用意する必要があります。</p><p>試しに作成した LogicFlow の全体図は以下になります。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2PXTjQclt50YoNrXh0xuk7VlAn6CpUeUYQl3NewglS2Z8qihRWc3Dv1StkbdzyeLvo-rILaDeFWj_XZaOu2NcMossZaJrXZMQs0dLUxNLAXvv-SuQRm3dFmU1trkGloeITLNmbP8gb8az/s1600-h/image%255B8%255D"><img width="240" height="514" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkYWboSi_DfaxxFEJ_Kl9W1NuU7q56pIF7xChSXVSq6cY98w95I-3mXdySDPfbBiwfTGhjRcmXUx2dtveK2nDWMxCxrd9uqvYAwCnsvlqXzsEp7G1pYgZv530v83mriUHeCZECf_WWiXpb/?imgmax=800" border="0"></a></p><p>試しで利用していたのは、LUIS の解析結果に含まれる Entity の値、これが配列となっているのでここをターゲットにしました。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisl__aKnNhyXXqx4ekSwB4FYbKvmBLOVK-99OA9zQaVJa_KuUXBt1DmpUzO6aQEizodaEVlAQ5vxNBSBkpUOMbVSBifsxaEgPYpwf3si4e7VaYqGN73ZVhGrlgHZAy6RfRzCJ7vLR2LlB6/s1600-h/image%255B12%255D"><img width="240" height="139" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6I0p2oa4IP58RBugBu0p4mfFs1cwl1fx1RuMzXqOmrFjIaXHPTMd9jmFnItGh2IP6p8a-qBvUI0nQMbIIPNAKRdVf3vZYkZBt8TTwRcTIn-sn-tVaksbVJv3nOTjtla88VjvZInibeCA0/?imgmax=800" border="0"></a></p><p>まずは下ごしらえです。JSON解析は LUIS からの返却値から、Entity の部分だけを解析させています。こうすることでダイアログから値の指定を行えるようにします。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNHmuqaCCwZEsvpoXO6JZ9t44_9rpTY3s4GzeLMbOaEJOEqiCWL63Yn5rzyjYYzmNvTqBvzSELJhmrM5oIciLJ6debPSm9G7Mw3qpS63gmCyZF6JZcmW6PynGV2JzEpjV5M82csBFH0XdV/s1600-h/image%255B16%255D"><img width="240" height="127" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9hRKNF_yhKoFrySs0UkD0kPXJHKBjxAXJ7EA7N5OwN8FG6gFFCspsx2X64VJnhY31CkdSPNz-FczE2z7wkgUy3Qf1hq924zJ08QHVXjk2VneQw7sKppD4cuF_kqN3bySn7Sgt7kRSuGly/?imgmax=800" border="0"></a></p><p>その際に一点注意があります。サンプルデータを投入してスキーマを作成することが多いかと思いますが、<a href="http://blogahf.blogspot.com/2018/08/logicappsflow-json.html" target="_blank">以前のエントリ</a>で書いた通り、required 指定が付与された形でスキーマは生成されます。そのため、生成されたスキーマから required 指定の箇所を全て削除し、値が省略されてもよいようにします。もちろん、省略されることがないのであればそのまま利用しても大丈夫です。</p><p>次にダミーの JSON を作成しています。これは後々の処理で JSON 値を新規に作成する際の受け皿となるものです。JSON 関数を利用して適当な値を作成しています。</p><p><strong>json('{"title":""}')</strong><p>このような感じで JSON 関数を利用しています。空の JSON 値というのは作成できないので、なんらかの要素は必要です。<p>そして生成結果を受け取るための変数を用意します。種類はオブジェクトとして、JSON 値を受け取れるようにします。<p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8ly4tgKflxOrn1k_VwJlZRlEjlRpAQ3LWWe5y-fWY5toEy7aD3eO7cyztBZgtYzlVTY2iRY0FYLx61hctEOwlogcQOiskc1dx_YAfqS9M4X6qoK8yPm9pgZwFjD6LQEgw8bbtYe-zcO_U/s1600-h/image%255B20%255D"><img width="240" height="217" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiucqZUOhjG6uxX4-gDwGLDGkZceiSpGBoyEmSxlQqPslcNaCk_MmwO-YSj7mE2s_UHnHk2p6kUO5oxarO64aIhCLGe8RohbdNhYalj4MpK1KYz91_ZQ8T8tqa-ehoKGFCyJlpfbD80_EaB/?imgmax=800" border="0"></a><p>メインとなるのはこの箇所です。ループで配列の値を回すようにし、それぞれの値をもとに新しい JSON を作成しています。<p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjjyNECsKUZUVjaaXQMAv3JrjlLB68mEqhoJ1QMki5NcVKN1OK1lDV-saXd2dpX9_gSQihuqB_P7z2W8lR17QVuhK_0DKqbS_P4kIzAY2UL6L_W1E4AW3zavrQHjZwg883Qvf9d2wgdlXL/s1600-h/image%255B24%255D"><img width="240" height="125" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKzjVPPKDSqksFL9Zne1_Z8TmhDnAxq9NPyzG7SHhS-J4Vhoqi4QSvfyvqwe-DXlE8B5Adl1p9h-b3yeOg00WdXdlzk47GgaQERb0-1-lYrYB52HLGmWmn_XngAOu5BA43lkJ2cb6tRI6a/?imgmax=800" border="0"></a><p>今回処理するにあたり、ForEach ループの設定で同時実行制御を OFF にし、シーケンシャルに 1 件ずつ処理されるようにしています。これは受け皿となる変数へ結果を設定する際に、結果が正しく設定されるようにするためのものです。同時に処理を行った場合は、片方の値しか入らないなどマルチスレッド実行時の現象に近いことが発生するので、この設定が必要です。<p>ループの中では、最初にキーとしたい値を取得し、そのキーに対して取得したい値を付与、結果を新しい JSON として生成しています。<p>キーの取得は、最初に JSON 解析を行ったのでダイアログから指定が可能です。そして一番のポイントとなるのは次の「Typeの値をもとにしたJSON値の作成」な個所です。<p>ここでは以下のように関数を組み合わせて、新規に JSON 値を生成しています。<p><strong>addProperty(variables('newValues'),replace(string(outputs('Typeの値を取得')),'.',''),replace(string(items('Entityの値でループ')),'.',''))</strong><p>addProperty 関数を利用して、新しくキーと値を追加しています。最初の引数 variavles(‘newValues’) が追加対象となる JSON 値です。今回は、キーと値をまとめたいので、受け皿となる変数を指定しています。最終的にこの変数を参照すれば、すべての値が取得できるようにするためです。<p>二つ目の引数 replace(string(outputs(‘Typeの値を取得’)), ‘.’, ‘’) の箇所は、キーとなるものを指定します。今回のケースでは、キーとなるものに JSON で利用できない値(.)が含まれていたので、それを除去しています。もし利用するケースで、JSON で利用できない文字がない場合は不要ですが、outputs 関数でアクションの結果を参照する場合、string 関数で明示的に文字列にする必要があります。<p>最後の引数 replace(string(items(‘Enttityの値でループ’)), ‘.’, ‘’) で、新しく作成する JSON に設定する値を指定しています。ここも利用できない文字を除去しています。<p>このようにすることで、newValues という変数に設定されている JSON 値に対して、キーと値が追加された新しい JSON 値を作成します。もともとの変数 newValues を書き換えはしないのと自己参照ができないのもあり、ここで生成した結果を次のアクションで変数 newValues に再設定します。プログラマであれば、addProperty の結果をそのまま newValues に設定、と 1 つのアクションで済ませたくなりますが、自己参照できないために 2 つのアクションに分ける必要があります。<p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1WXpIjkr2LL_xmgGb3_C4KeT2rtK2thQmN_1omVGvQdQ75gLmd7h1itFixXD2EIpTD8WkJAZ_liXrc1eBjEz2ukFKdFY7aLKXM_6LSUbORM3WRzENzbz89fS8ATEQR3euIpTuIyZcj1PZ/s1600-h/image%255B28%255D"><img width="240" height="213" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIDozD-XLRRNxXNmcsLXJiL6Nhye4fQhFHDlik4vWXcOzW097mpMOXmXqOU6TLEL09qb-UBPywGhnGGUH7Gyvb4bzuXWrzoL02Kd8SXGw_jw9DyTrEFic_6QYvBySUG5inpMcHVKCMtRay/?imgmax=800" border="0"></a><p>ループで全ての値を処理すると、このような感じで JSON 値が変数 newValues に設定されているのが確認できます。<p>こうすることで、変数 newValues に対して以下のような記述にて、値を取得することが可能となります。<p><strong>variables('newValues')['Hisashi Food::Food']</strong><p>若干手間があるように見えますが、このように縦横変換することで後続の処理で、毎回ループして値を値を利用しやすくなります。Ahfhttp://www.blogger.com/profile/01553064540426163049noreply@blogger.com0tag:blogger.com,1999:blog-3357313501722746592.post-83160505937252344332018-09-04T13:41:00.001+09:002018-09-04T13:41:12.347+09:00LUIS を HTTP 直接呼出しにて利用する<p>Logic Apps/Flow それぞれに LUIS のコネクタは用意されているのですが、現在 LUIS V2 API へ切替られたということもあり、デザイナー上での挙動に問題があるのと、コネクタがいつまで使えるかが不明だという問題があります。一時しのぎ的な対応方法はあるのですが、根本的にコネクタが V2 API に対応されないと解決にはならない不安もあり、HTTP で直接利用する方法も必要になるかと思うので、まとめてみました。</p>
<a name='more'></a>
<p>先に現象と一時しのぎな対応についてです。</p><p>まず接続を作成する際ですが、以前は LUIS 側で構築した Application ID を指定して接続作成も行えていたのですが、現在は不可になります。接続作成時に必要なキーは LUIS ポータル側で作成したアプリケーションの PUBLISH から参照できる、Resources and Keys 設定の Key Strings になります。こちらを指定して接続を作成する必要がありますので、注意が必要です。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguNu2jbkYXScDztl5uthYyJgiP-TQny5WKkCdPswpvqusmEPwD2PJUzR4M-s_8qV-eipX3-KmCg7zviyEuDK7b46iOxmtzGz01JCyBa29pAsqED8rzSHk71MFmCTbr1q2yfvdOQAzulbA/s1600-h/image%255B7%255D"><img width="240" height="76" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg58TnUY8ie2c7DZby5yFLqLDELzTcxaDFjhTTBqzXHw5ZdM8mhs6qLoUGvzNv89ZCj8-MFOit4cCFslZc3xrA2QlyI6knQIPgIIXMOJaZ4LwtiPcesG-VyvrPd1W5XMyIuTzvUanYLn8E/?imgmax=800" border="0"></a></p><p>ここをこれまで通り Application ID 指定で接続を作成した場合、デザイナ上では以下のようなエラー表示になります。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp1LvkemKCbJDEy6Ed4IYz76Sv-ApBMkfbII0-vvSBUpdD0bqxtSl1Isw8z73PzDGz54IHdwIbXiBQVluaGRbDeACZKgYyf_DoWwz_n9UJm4fgtA3L-g6JA5H3u8DjbOWq8PqEm51ZGSw/s1600-h/image%255B11%255D"><img width="240" height="83" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2sJQqPa4UBVTlyxYSF-6dqwe6uDXuqGBlyNqrMlF5-lKPnokagwwpvzhJ-75OvSYspUDu-vJepyl4rM9dJ2nmm9VwqQOE9J67ikWiIaoZH8_vgkC9pRnrwF1Zo76ILRmDsfiM0Rts7AY/?imgmax=800" border="0"></a></p><p>このように 401 エラーとなっている場合は、接続が誤っている可能性が高いので、Key Strings を指定して作成しているかどうかを確認してください。</p><p>そして正しく接続を作成した場合は、以下のようなエラーになります。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiW2RDsdRG5XLD09FqYSelNFdbt3ZdMmTy883v785OQ-Uphv2gDNvNMm_EOwFrxkKchG6NTdDnwEBMGjpLFJYxpvkaddu5Ge4OSeecuYEEUjyjpS2pVVmIuBJaZNkeTtEe-sluLcMpi1_s/s1600-h/image%255B3%255D"><img width="240" height="83" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZfUI3sTJfpOw32pgfd9ESRRGGmj5EA7YUOaqSrExvdqEKihSANTWawnVo_WJImlgd3SqgmD2RYTGSxFVsk4Q5VLN2Ys1TWNfiOAmG2OwoX681Z2ZXtirfnnzVRatmNrNPO5LR7ymXJRg/?imgmax=800" border="0"></a></p><p>こちらは 400 エラーとなっています。そして説明として「V1 authoring APIs have been depreccated. Please switch to the V2 authoring APIs instead.」とあるように、V1 API はもう廃止だから V2 API に切り替えて、となっています。</p><p>現状の Logic Apps/Flow の LUIS コネクタでは、このように V1 API を呼び出すように作成されていますので、そのままでは利用できないものです。</p><p>一時しのぎ的対応案としては、次のようになります。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAYUAnRLPEs-7Up_iqHh2bud_htrmgNxeX9XD0k7GHHlDkxT2hXfwRGwbxTaFoAlavwT3Vd8awfCmC1weDykTYyRzHM69cIs_CJIz2TVUIw99PY9m-gwR_u52HyfLCWDC016uKpyUlgV8/s1600-h/image%255B19%255D"><img width="240" height="81" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicir27GoWkpDMRMJ2T5NgMD3xwI-IwHuMCVLEZUUk7Garnt9p-36hKvSmo-9CW2zgSOoe6zfqejteV3A7705214UTKBnZXMdsChshXAr8WkrryrcNdHK6mvqrmmIw-JMzcq9zp6Bcw2ic/?imgmax=800" border="0"></a></p><p>App Id 欄ではエラーが出ますが、気にせずに「カスタム値」を選択。その後実際の Application ID の値を設定します。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4xh30SlIowiQraABYOVL_LQ3OW1gzTheP1q8ord7aqXokrumTM5UhH8BHTM_nknQysWcDS7P1Bjc659EaFwWIV4PhYQSipURd5jSzWT3YcYLmJr_mTn1-S5nNDj1qW5mFt2ONgolt0Sw/s1600-h/image%255B15%255D"><img width="240" height="226" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjP6sHxANGE1mF-ysmtC6wMAL-iS13vXnNTX_QTYz4dqQQf0KSpox3JgO3R1cDceH4SDa69GbbhrZNHQovIgnaE9-3GknO5QdNsi5dYnigTbKxI05s_PqXgeS8-kXFzPWLPrXg-tBDdjxA/?imgmax=800" border="0"></a></p><p>そうすることでこのように動作することはします。内部的にはどうなのか、というのはコードビューで確認が可能です。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKRJHutHMtOoqC9Z3uYQ1aMg-uXlsO1Rq7FAm3ZDu4RsmxN9bE31H-ahYqnwS1DK16cJLgvMnuhNF9_iJq8zme89CveTE4-IPkTsw6UYs-ejABEzDw-orRQvYXeav81uRLGvkOsPRUbmc/s1600-h/image%255B41%255D"><img width="240" height="147" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVqCN1cRzORPqF5xzMU6H5PKTg4r53Kpouh9fApquL-X5Mgna1Z8CQXcnf17rZ0LXl0uhTi-iA_3gmUI44X5q_50EdUheecyc7Gg4fK2QAL_Kfk32m7lpzvS6Konnv_M3z8xusbMC-BdQ/?imgmax=800" border="0"></a></p><p>path として V2.0 となっているように、LUIS の V2 API に対応しているように感じます。実態としては、Logic Apps コネクタが API Management を通じて提供している呼び出し用 URL だと思われるので、ここだけで断定はできないのですがそれでも可能性は高いです。</p><p>これと同様のことを、HTTP コネクタから直接 LUIS V2 API を利用して実施してみます。API を呼び出す、と言われるとハードルが高いように思えますが、管理系の機能を利用しようとしない限り、LUIS V2 API は非常に簡単に利用可能です。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkkWJ5aQA9e-5MJpUKB3D_2rlWYxxjhP26zphDgGyAa6Wjo7dFaVT6jlsRTHlh5-A4ve4ykBtUoyHTxjwCavd-t7yIX_k6ymzhRiu9qRP5nxSpZqowJlBLowWpyVlY_MCkZoPj2LCPDi4/s1600-h/image%255B28%255D"><img width="240" height="76" title="image" style="margin: 0px; border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ7Lfp6V4M-sj17Dn5D8myQIkPnm7D6mlEY5aYAl9zQZy7_twPGnnNRAfEauGXfMdHK7wuemjsRCTda_XIlz4ceb06ZJx96arTJkpBip_nnHnslZI8q3_9BoaO7uCPSKoz5jliDQducbs/?imgmax=800" border="0"></a></p><p>呼び出し先は先程の PUBLISH にて確認できる Endpoint となります。この URL は次のような構成です。</p><p>https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/<strong>[Application ID]</strong>?subscription-key=<strong>[Key Strings]</strong>&verbose=true&timezoneOffset=0&q=<strong>[URL エンコードした解析したい文字列]</strong></p><p>この URL に対して HTTP GET で呼び出しをかけるだけで、LUIS による解析は利用可能です。以下のような結果を取得できます。ブラウザ上でも実行可能です。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSQTyKuvMafEcl0wC_5fNin5QOddjk7yDne6G8rTB5DFXLv913ingr-frUxqVSfaU4KVjEkfWJcF27KolYbG2OvXIDrF92yh_NjwMABJ5yPgY0VFOq_33yJdUog_MZK7srgPB0mR9O2HM/s1600-h/image%255B24%255D"><img width="240" height="272" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguBW38IXGGPHv6ZzOHqQciVBwTjQNXa0p5d5G9vmVplXeXe9E8UMoTH2L1-YXZXlP0oZfndFBUUt-rnIHhZXMnj-x8-v5eXkoNCXbog_pPr-OpRgcfpxKRgOHnKEKfnoCQwuEQlycJ2E8/?imgmax=800" border="0"></a></p><p>Logic Apps 上でも同様に HTTP コネクタを利用して呼び出しを行ってみます。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGlvDxvGnqUFiFHYz-CJnWqw0YnYsmrBbJuy4TtqeQFc5gN6VN-wYKEGHIj1YZiEj8uNGwEmBDSropTqkkdrEBnb9sPRhr05Uq_HNbBG_13OroWqfSkdDEwtNqP-jPhbqXbnqpPFe_NBQ/s1600-h/image%255B32%255D"><img width="240" height="111" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi871vfOLtBdYPcnBTHn_nXfsu-E-HYE50BqMeabI7Va42n0Ok8UV_eHvfXCvGxNy77CTA2-Gv3-Ynr_kZTpt4K_OVFu_N-VdMHQ4UR4INxgpXhMgP8H6jhjoo4BphhRz0zT1vzlxSmhdQ/?imgmax=800" border="0"></a></p><p>比較用に LUIS コネクタを設置して、結果が同じであるかを確認してみます。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4qb7ajVnaUNGJaA_Ecg2Qj-j8GN5yY4zKWyionB2YznNjvXH5yiDd6OnLXUeHJc9pg1Gdu02-QnYCcwRNJRcn4PPu5WXwQoUQ_Sv1rjOh5AJTHN00OgIsZ64mSHP2qeycPLCQ4jz2TUQ/s1600-h/image%255B37%255D"><img width="240" height="268" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilZTVZe2TEWB1zYl3df0eGkEJyQpfZpM3ltDUdlzlT-XEiIJyLaWpUnMzSJ30_jKrBkp5swtb85UYOif56gv6Sim-sZVKnyVXmCLVXK-lxbvGBDZyJ4dEfq60NzSfY6_j4qkJj7FnVCX8/?imgmax=800" border="0"></a></p><p>これが実行結果です。既存の LUIS コネクタも、HTTP で直接 V2 API を呼び出しても結果が同じになっています。</p><p>このような形で、直接 LUIS の V2 API を呼び出すことは可能です。今後同様のケースが別コネクタで発生した場合、API 仕様が公開されているのであれば、一時的に HTTP コネクタによる直接利用へと切り替えて、改修されるのを待つというのも一つの方法として必要だと思います。</p>Ahfhttp://www.blogger.com/profile/01553064540426163049noreply@blogger.com0tag:blogger.com,1999:blog-3357313501722746592.post-74011902141894115252018-08-27T14:25:00.001+09:002018-08-27T14:27:20.600+09:00Flow Management for Admin コネクタによる承認申請の削除<p>最近追加されたコネクタに <a href="https://docs.microsoft.com/ja-jp/connectors/microsoftflowforadmins/" target="_blank">Flow Management for Admin</a> コネクタというのがあり、これまでの Flow 管理コネクタと比較すると、より管理系のアクションが増えたものとなっています。その中で、Remove Approval というアクションがあったので、どのような動きになるのか確認してみました。</p><a name='more'></a> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj40kXpnV51iG98ixc9XEBkwiprGllzAlHnF8kZ4vfq2eJ15phAVySM0VTMQUtrnfnnhYUK89rWddPhJzLvZ40p_-cWwO4fNY-jdEhQPEzRQJ0PsiwuFPApdKUjitt4clZpQ4ihLvlITTM/s1600-h/image%255B4%255D"><img width="240" height="345" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh01o-PB8eDgROZEu60m_FdA_gGCs7rmtoEVX92JGDCcixbt9GS5O8wDvrZ-327Ym8L5R0T-vI9ejaEWMbW-m6m-4bZ6OfFXksF54Lt1QNkuXeCg7zMVJb0w89kNlm9vaPD76sEzk7YM4w/?imgmax=800" border="0"></a></p><p>検証用に作成したのは、上記のような LogicFlow です。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIFYr2Qj_65kZQ8SV1FbrjHFaTfHSJSZWSy1wKg7TaFNs7ubLTR2hrsTmY0Hqp7-KXVOpAX38yGI-LMLGBS4TqsZj7NlhfJAcYWRm2UPq5Il9sxQKqN_yRvWqPfz0Q0M7lirdfmOCL58Y/s1600-h/image%255B8%255D"><img width="240" height="163" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEic6OWIRPsT96oJ6jO_5bNvCH-AfMn9gLjNnurRLUNQI1PUYP_wFa5Fj8EY4MHLoYqLk3di-Fnr8zbR9S1zh-j6bo2ltBRI2NybAK9P9nN-MQwHEFdKHdmLJUu9lRqOMlLSBBASGUTATBo/?imgmax=800" border="0"></a></p><p>確認するために、適当な承認申請を発行しておき、このように承認待ちの状態にしておきます。この形で、先ほどの LogicFlow を実行して申請を消すことができるかどうか、という点になります。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBn2uApwvGaaKy2XvhYz7esjS006c3m2MPzgsWjcyl_0XAdGLfSB8stgs9UsaDmxE7KJ2MgPWnfo3QUy85VqJeYqTqQnlY8Q5DDX2_BUPpM5qbHo1FLkwJ2Zh1Y77sqVV_QUkYrGEFeNU/s1600-h/image%255B12%255D"><img width="240" height="61" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVuQ9WeINa6iinVzDGeDxMe5Tsr4WMAnZPP4SoXXwOWOUEUEgy1Czl9gJ-IW_Rmo3pbIvnL8IGHafNZxFVoRQTt3etpx66w-80SAfiKwEf4BXg-Zs4_CEB7kJDh7-AbwAmsRbP5z-wkfc/?imgmax=800" border="0"></a></p><p>Remove Approval アクションでは、どの環境かを表す「環境名」と対象となる「ユーザーID」の指定が必要です。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLykmGhC4on-i2bG4ciskcZM-2LwN0dLJN9cY-cnQQ6FRpktZWHmSzGy-A2CTrVzqRPXTKLCroBM-ytAEd5AsGjO0oXJPqaGveEYUhA6TatWCMfeBB8IxZHZgUekZg3DdhZhfpjJ8d1pQ/s1600-h/image%255B16%255D"><img width="240" height="31" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdgAJqNkETAX0bVjXzEw39f2BdtBdLHDuU01_6NwKSvQG7qdliv7GxMN9jGyk8d1-L0TBlv4bNv3D6I6xKL9ckLe1Oj7S3i9UUqgceQ1Ub_r-Y0c3EzOMNRyjlQzv00dAE11CGOcYjuQI/?imgmax=800" border="0"></a></p><p>環境一覧は、Flow Management コネクタの List My Environments アクションで、ユーザーの環境をすべて取得できますので、ここから必要な環境を取得します。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd_-elOA0XYjGlUjOih2WLydKnWXMtpfLQ02ukeZkarvt-xZ_sgDODKUSm0J6e9R9nZY-bk28OpnaCo1fNSNlwIuC0zzcsAgYV__hP42YqjU8SWp5ug_kH1jXPfTqZS1Xemqce6YTRY9Q/s1600-h/image%255B20%255D"><img width="240" height="73" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvpSq9NgdIdTXo6J7qo5RdoSLVMlXTXopxnZjhFRHYZCKjXhGYPvvKYt_Lkmvl8_iBa8Xari6rTExcKkXvY6d8n3GsmU3pLNU0pnDRafZ6zWgY94YsRquKEiOoPgYycWwIGOqrv_YtfNg/?imgmax=800" border="0"></a></p><p>今回は、表示されている環境名をもとに対象を限定させています。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyLm9DOI2CjbGsNnGIOgJcP3TQLrCkEM0d0tJUTPZlIoxa3h_l4xI_NXMi1wLBMDDIHzX5qvWEJ2OdRQ09hp7sJOO3DweOWXF0sKtmEFtewj2i7K0kqZMbs_2kJDyQgAVvTRtjAnlKmFY/s1600-h/image%255B24%255D"><img width="240" height="103" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghZq3xMWAtlR5fbWl_aHHimcNr5h7-0fz8r3l-b1IY-xf9qneNwMZOh-tQorleiU0XqgMNxL0FuQDn7RHB-iRBEjStTRYvv1vRJsC1mWfjS1IKcFvZi7-ZxqfNC7M_RGx9uJOHqW0fPJk/?imgmax=800" border="0"></a></p><p>もう一つのユーザーIDですが、AD 上での ID がそれにあたります。Azure Active Directory コネクタのユーザーの取得アクションで、対象となるユーザーの ID を取得します。取得できた ID は、そのまま Microsoft Flow Management for Admin の get Flow User Details アクションの条件として設定します。これで、Flow 上でのユーザー ID が取得されます。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmHYDAWuVtX-zb9EMfiWMw6nUA-DFR7IHrFbPnFinB3gjjqMCAlHXWBSqTkJei9PydVn5FLj3GPQ-cPb1QQ5gCNkJcqVjYRQMTbHGeIKHFsy21uvHEaF6WXclaviStUbaxS6O1-8-oDns/s1600-h/image%255B28%255D"><img width="240" height="131" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhryjyg8aJAGj6VKYiYaFXaxDqDa9XkeuyC3IGlMmSiFNbZY22hsMSgBbI7DOaNcxoRhYZ507MPKbcLMbBAJPYTP8YwCEOmEKS2tapA8CCfIhGfhbuwxuapACCT7ACt6TUx6uFRIFW0MuM/?imgmax=800" border="0"></a></p><p>実際に実行すると、上記のように正常終了する場合とエラーとなる場合の2ケースがあります。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhY8OQ3_c6UTRFhZGlX3SEAAcO8HZiEuPf5xCxbyUFDZyPzwPALFXD_izAen4944odxQqk4AfvtqSH1DvEOzsXtVw6IAAjIJVXwY0dzrhD1yS7BsQ6xhkML7iLM-pwjW7YcdPzSbpVhF0U/s1600-h/image%255B36%255D"><img width="240" height="84" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7Y343cNQu_LcOAAn96AJcjQPlgxm_XFeAW_zpCgCUuzuq-IYBfnyJDAaZTKVLOrWZM7nfyaik1JgfGhjYWrjZhhy1TJo6wKCywS86HKgnh4Gdxifz2PXZ2rqBOrLABuFh1D3BRorgnPM/?imgmax=800" border="0"></a></p><p>エラーとなるケースですが、Common Data Service を v2(CDS for Apps)にアップデートしている環境の場合は、このアクションで承認を消すことはできないというエラーが返却されてきます。この場合はいまいまだと、コネクタを利用しての削除は行えないようです。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0DYxTig_hftRIxy-2ENfJCals61ABwWNDXJPM5NSiWsrh9UdX99zZuc6PSSGAZX4F2D2MiTJMQO00ObEKZ-LOV83gfB3zXn1m6PsXMC0prUXWEuyaoInGfcw67GQsjRt9JxYIbiUUXKQ/s1600-h/image%255B32%255D"><img width="240" height="138" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPpFWTqqCNI6H9x7IvCIWgEvfX-IU5UVr0e2ULjReGLzRQf0X7TcVlmrZJo0jyuzjv0csPCa7ISrYbkYW_2AWqVQri_o6MOYb6oYMo8boKyJw60J0h34fo5I5CpdoAoD9igmn_uuaV4-o/?imgmax=800" border="0"></a></p><p>正常終了したケースでは、このように届いていた承認がなくなっているのがわかります。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjP6V_-Sc8nwYxNNJuHgeBU3voR8OtwXRuNiTO0L_J0OZquE5xdiHA3S8B80UuIVkSjQiih4jR357iuuborWThaGCYepHJmjvApEKm6tGbf3H53zminNX5ze6d181Odqh6FKatW-gL9Ht4/s1600-h/image%255B40%255D"><img width="240" height="77" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaFAjai356HBWIym58PyZAojGA36Wp61EIgNXho-2N6VWsb_bGZndmIB-muBiuoBRSX3CJNV3qeKSePieMjHolMOI8kKL-0Vult_yoDJ9oR7bK7CYVOn-_9FhzOHjAxcB81E1DURFQ8wk/?imgmax=800" border="0"></a></p><p>ところが、申請を行った LogicFlow 自体は、まだ継続して実行中の状態です。これは Remove Approval アクションで申請を消すことは、あくまでも申請データを消すだけであり、申請元となる LogicFlow には何も行えないからだと思われます。</p><p>もしかするとこの状態でしばらく放置することで、LogicFlow 自体が終了(おそらくエラーとなる可能性も)するかも知れません。その点については、別途確認してみようと思います。</p><p>このように Microsoft Flow Management for Admin コネクタを利用することで、申請データは削除することができました。ただし、その後の手動による対応が必要なこともあり、利用する場合は注意が必要だと思います。</p><p>ふと思ったのですが、おそらくこのアクションであれば、承認申請の履歴をも削除するものだと思われます。となるとこれは、現在発生している申請をどうこうするのがメインではなく、GDPR 対応が主な利用用途なのかも知れません・・・。</p>Ahfhttp://www.blogger.com/profile/01553064540426163049noreply@blogger.com0tag:blogger.com,1999:blog-3357313501722746592.post-26978792862476660662018-08-13T10:24:00.001+09:002018-08-14T10:30:07.152+09:00LogicApps/Flow で JSON を受け取る際のあれこれ<p>Logic Apps や Flow を利用するシーンとして、外部から JSON 値を渡してもらい色々と処理を行うケースというのが多々あります。その際、Logic Apps/Flow としては、スキーマを定義しておくことで LogicFlow の作成が楽になるという点があるのですが、このスキーマ作成は開発者でなければ戸惑うところの筆頭でもあります。</p><p>色々な形を試してみて、利用する際に注意する場面をまとめてみました。</p><a name='more'></a><br />
<h2>1.JSON スキーマを定義しない方法のメリット</h2><p>そもそもスキーマを定義しない状態だとどうなるかというと、実際にはダイアログから指定ができないだけで、渡された値の参照などは可能です。また要求トリガ(HTTP Request)にはスキーマを設定せずに値を受け取るようにし、後続処理で JSON を解析するという処理の流れも場合によって有用です。</p><p><a href="https://lh3.googleusercontent.com/-buIBkUVQLJA/W3Ddu-Pd_lI/AAAAAAAAEnY/vpSrVdc0y0YmjN6RmCifMgqBjqwTkOTWgCHMYCw/s1600-h/image%255B4%255D"><img width="240" height="443" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-rNhmrs-4XS4/W3Ddvdvc_FI/AAAAAAAAEnc/XsHc3Ht6QSgrN1VUcuvDMAjUQZmu4bOgQCHMYCw/image_thumb%255B2%255D?imgmax=800" border="0"></a></p><p>この方法のメリットは、受信する際にどのようなデータでも受取が可能ですので、複数種類のデータを受け取る処理の入り口を定義する場合に有用です。</p><h2>2.JSON スキーマをサンプルから作成する場合の注意</h2><p>Logic Apps/Flow において、スキーマ生成は多くの人がサンプルデータから作成することと思います。非常に便利なこの機能ですが、その挙動においては若干注意する箇所があります。</p><p><a href="https://lh3.googleusercontent.com/-2d_M_nab78Q/W3Ddv0-hRRI/AAAAAAAAEng/MipQBSFFCawVplQ05Uwvz2izSIEbp_bmwCHMYCw/s1600-h/image%255B12%255D"><img width="240" height="97" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgleJoERgOTZ4FUfYp2r5kzJwzn0_o_9_2KZ2P8u35nRP25Ke2uuNhFzddcpQYwsJHTed7UxKCq7jKsUWMJIehutqENNxKvu9mCq3zV84QWr0doGfvWxiO9IlJEDkTP3j-gnIZlZ8npb4M/?imgmax=800" border="0"></a></p><p>上記のように、ある値が配列を持つ場合の挙動です。</p><blockquote><p>{<br />
"type": "object",<br />
"properties": {<br />
"type": {<br />
"type": "string"<br />
},<br />
"text": {<br />
"type": "string"<br />
},<br />
"property": {<br />
"type": "array",<br />
"items": {<br />
"type": "object",<br />
"properties": {<br />
"optionsA": {<br />
"type": "integer"<br />
},<br />
"optionsB": {<br />
"type": "string"<br />
}<br />
},<br />
"required": [<br />
"optionsA",<br />
"optionsB"<br />
]<br />
}<br />
}<br />
}<br />
}<br />
</p></blockquote><p>サンプルデータを投入すると、上記のようなスキーマが生成されます。一見問題なさそうなスキーマですが、配列となっている箇所に required 属性が設定され、必須項目が初期値となります。JSON に限らず、配列であろうと必須ではないケースもありますので、配列を含んだ値からスキーマ生成する場合は、必須項目の調整が必要です。</p><h2>3.JSON 解析で想定していない値がきても検知できない</h2><p>JSON 解析アクションで、スキーマとデータをぶつけた際、スキーマ上で定義していない値があっても特にエラーはなりません。定義していない値が来るのを防ぐには、HTTP Request 要求トリガにスキーマを定義し、設定からスキーマ検証を ON にする必要があります。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_67yFBBjdea3xTqrrGC0QLE9TGqyRfIH9RsTZK938K4JGT6r_rR25NcguddUwwk6VqDnwD7TVGG602Depp07XNaF435ymXFv-iSaoFK4kEyFDY3souT1ZI1M5Uua0l-7_hZ-Mkfbv2H4/s1600-h/image%255B17%255D"><img width="240" height="291" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhn3NiUvxihp3djs6yHBUjyR5vHwWnzyyKpdUmfR4eLuVMrPvDZB7pxPZ_DzG-UBdcum7Yet2UAxY8yl6rZ34iWdQDF19hdOoyd256Msn0fqtfOYouFxjiC-9UQsGo2OqCRu6PcgNPFbQI/?imgmax=800" border="0"></a></p><p>ただしこれは悪いこととは言い切れないもので、例えば呼び出し先の API がバージョンアップされ、何かしらの新しい値が連携されるようになったとしても、LogicFlow 側の修正は不要だということになります。</p><h2>4.すべてのパターンを兼ねる JSON スキーマの作り方</h2><p>Logic Apps/Flow で多く必要になるケースは、これではないでしょうか。色々な API を利用しようと思ったけども、公式ドキュメントにはスキーマが掲載されていないので、自分で作成しようとしても、どうすればよいかわからないことも多々あるかと思います。</p><p>流れとしては、大体以下のような形でやることが多いです。</p><ul><li>A.サンプルデータを入手</li>
<li>B.別のサンプルデータを入手。A のデータとマージする</li>
<li>C.以降同様に、予定するすべてのサンプルデータをマージする</li>
</ul><p>例えば</p><p>パターン A</p><blockquote><p><br />
{<br />
"type": "message",<br />
"text": "sample text",<br />
"property": [<br />
{<br />
"optionsA": 0,<br />
"optionsB": "1"<br />
}<br />
]<br />
}</p></blockquote><p>パターン B</p><blockquote><p>{<br />
"type": "message",<br />
"text": "sample text",<br />
"timestamp": "2018-08-13T13:00:00.0000000Z"<br />
}<br />
</p></blockquote><p>というサンプルデータがあった場合、この二つをマージして次のように用意します。</p><blockquote><p>{<br />
"type": "message",<br />
"text": "sample text",<br />
"property": [<br />
{<br />
"optionsA": 0,<br />
"optionsB": "1"<br />
}<br />
],<br />
"timestamp": "2018-08-13T13:00:00.0000000Z"<br />
}</p></blockquote><p>A に存在しない B のデータを、後ろに加えていく形です。その際、A のデータの末尾に , を付ける必要があります。</p><p>何かしらの API に対応しようとした場合、この作業を繰り返し行うことで必要なパターンをすべて網羅したスキーマを作成することが可能です。LINE Messaging API などはこの方法で、全メッセージに対応可能なスキーマを作成できます。</p><p>サンプルデータが作成できたら、実際にスキーマを作成させます。スキーマを設定できたら、何度か実行を行い、予定したとおりにデータを利用できるかを確認してください。</p><p>特に起きやすいのは必須項目(required)指定です。2の項目でも書きましたが、ここの調整を行う必要が多いです。場合によっては、すべての required 指定を削除することもありえるのですが、異常なデータ連携のためにも、本当に必要な項目には reqired 指定を行うようにしてください。</p>Ahfhttp://www.blogger.com/profile/01553064540426163049noreply@blogger.com0tag:blogger.com,1999:blog-3357313501722746592.post-18258816533096625012018-08-09T14:51:00.001+09:002018-08-09T14:51:00.436+09:00Logic Apps や Flow の LogicFlow 全体図キャプチャを撮る<p>こういったブログをやっていると、LogicFlow の全体図キャプチャを取るのが非常にどうしたもんだかと悩んでいたのですが、Chrome の機能でうまいことキャプチャを取る手段があったのでメモメモ。</p>
<a name='more'></a>
<p>実際にその方法でキャプチャした場合、以下のように全体像を収めることができます。</p><p><a href="https://lh3.googleusercontent.com/-0ypg5u4J6fs/W2vWMsBGDcI/AAAAAAAAEmI/mn8UKjnwAN4y8QFBqlXhUN-ty59C6UG-gCHMYCw/s1600-h/logicflowcapture%255B4%255D"><img width="240" height="308" title="logicflowcapture" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="logicflowcapture" src="https://lh3.googleusercontent.com/-3dOnj-F0kkg/W2vWNCH_kJI/AAAAAAAAEmM/pGW7HO7jZI83y0_1FiHztspUaZJQOThuwCHMYCw/logicflowcapture_thumb%255B2%255D?imgmax=800" border="0"></a></p><p>まずキャプチャしたいものを表示します。</p><p><a href="https://lh3.googleusercontent.com/-gP13qIAyBDo/W2vWNq9e2mI/AAAAAAAAEmQ/_hNClsysgAAvFTHhLHBlk2_9hz5esCBugCHMYCw/s1600-h/image%255B3%255D"><img width="240" height="152" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-oj27C-8mMvs/W2vWONeQmsI/AAAAAAAAEmU/jL_6qGpVGbEauv5IbV0jdp6yL9M78J3lACHMYCw/image_thumb%255B1%255D?imgmax=800" border="0"></a></p><p>F12 を押すか、右クリックから「検証」を選択して、開発者ツールを起動します。</p><p><a href="https://lh3.googleusercontent.com/-2y-VS5qEawM/W2vWOncYrII/AAAAAAAAEmY/ZeGLjF77nwUnQBBu0PC26RhWqo-IZEe7QCHMYCw/s1600-h/image%255B7%255D"><img width="240" height="94" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-kpWUiOHHr8s/W2vWPOUXe2I/AAAAAAAAEmc/N4H7llIIZ2EJuoDI6wM6jT9iqey7JB-gACHMYCw/image_thumb%255B3%255D?imgmax=800" border="0"></a></p><p>Toggle Device Toolbar(赤く囲んだところ)をクリックして、表示モードを切り替えます。</p><p><a href="https://lh3.googleusercontent.com/-hoaCdEy5BVc/W2vWPQa_xbI/AAAAAAAAEmg/mkkyaxFuK4gwiLToe4594YTcgiRqmNcOwCHMYCw/s1600-h/image%255B11%255D"><img width="240" height="62" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-mohFp_qfLoE/W2vWP8Vt-dI/AAAAAAAAEmk/FES8nYqFJXwQryvyoRzlGcMIHB485Tx9QCHMYCw/image_thumb%255B5%255D?imgmax=800" border="0"></a></p><p>表示する大きさで Responsive を選択します。そうすると、幅と高さを好きな値に調整できますので必要な大きさに調整します。</p><p><a href="https://lh3.googleusercontent.com/-5n_AW5LHsBI/W2vWQal_poI/AAAAAAAAEmo/hmf7m6HmGfYXrZsemN3A9j4Nxz8XAkR3QCHMYCw/s1600-h/image%255B20%255D"><img width="240" height="264" title="image" style="border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-d6bcPKQErvg/W2vWQpYqldI/AAAAAAAAEms/oUAH9OHh-asdrlwsKXho0GjPojsSJcV8ACHMYCw/image_thumb%255B10%255D?imgmax=800" border="0"></a></p><p>大きさを調整出来たら、右上にあるメニューをクリック、すると Capture screenshot と Capture full size screenshot というメニューがありますので、好きな方を選択するとキャプチャ結果がファイルに出力されます。</p><p>このようにすることで、縦に長くなりやすい LogicFlow のキャプチャも行えます。この機能自体全く知らなかった・・・</p><p><a href="https://lh3.googleusercontent.com/-5n_AW5LHsBI/W2vWQal_poI/AAAAAAAAEmo/hmf7m6HmGfYXrZsemN3A9j4Nxz8XAkR3QCHMYCw/s1600-h/image%255B20%255D"><br></a></p>Ahfhttp://www.blogger.com/profile/01553064540426163049noreply@blogger.com0tag:blogger.com,1999:blog-3357313501722746592.post-10356823749453111582018-08-08T13:37:00.001+09:002018-08-08T13:39:16.231+09:00Slack Event API を利用した Bot を LogicFlow で作成する<p>Slack でメッセージが投稿された際に、外部を呼び出す仕組みとして OutGoing Webhook がありますが、こちらはどこで廃止するかわからない状態へと変わったのもあり、今後は Event API など別の仕組みを利用する必要がありました。</p><p><a href="https://lh3.googleusercontent.com/-howi7fIp55Q/W2pzNXwvaqI/AAAAAAAAEho/vxhV8K5j-pcDuS4GflznwElffKQs9ipXACHMYCw/s1600-h/image%255B3%255D"><img width="240" height="57" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-cmcp9aEwAqY/W2pzOICsdrI/AAAAAAAAEhs/-1Kr7XQnPmkNJA33p8EEekY8PhpWnIQEQCHMYCw/image_thumb%255B1%255D?imgmax=800" border="0"></a></p><p>今回は Event API の仕組みを利用して、Slack で投稿されたら反応する Bot を LogicFlow で組んでみました。</p><a name='more'></a> <h2>1.Slack アプリケーションの登録</h2><p>Event Api を利用するために、まずは Slack に対してアプリケーションの登録が必要です。</p><p><a href="https://lh3.googleusercontent.com/-wsSsNorw4wk/W2pzOWItFbI/AAAAAAAAEhw/n62cIhEo_doKe-a_1VkmcQDtZhS629DnACHMYCw/s1600-h/image%255B8%255D"><img width="360" height="210" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-SJt4eCpDeAw/W2pzO9tdiMI/AAAAAAAAEh0/ANEfJ2VxcCkI8356tHneC8ZYT4S-cNEJwCHMYCw/image_thumb%255B4%255D?imgmax=800" border="0"></a></p><p><a href="https://api.slack.com/slack-apps" target="_blank">Slack API</a> にアクセスして、アプリの登録を行います。上記スクリーンショットで表示されている「Create a Slack app」と表示されている緑色のボタンをクリックします。</p><p><a href="https://lh3.googleusercontent.com/-pDfrnUCcFNQ/W2pzPSUx5HI/AAAAAAAAEh4/E_vZ54zN3fIbwpCVKVyICHLTJ36cmtLuQCHMYCw/s1600-h/image%255B12%255D"><img width="240" height="238" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-xFWMlu-pgGk/W2pzPhMKE6I/AAAAAAAAEh8/63JwO204y4w_r0ITSYbNtv-otF2ZoTNDACHMYCw/image_thumb%255B6%255D?imgmax=800" border="0"></a></p><p>上記のようなダイアログが表示されるので、App Name には適当なアプリケーション名を、Development Slack Workspace には Bot が動作するワークスペースを選択します。</p><p><a href="https://lh3.googleusercontent.com/-JVzO8dnHJuc/W2pzQF12s6I/AAAAAAAAEiA/anL6CKqHpTEwVDrtkzLlHz5E6QAowKesQCHMYCw/s1600-h/image%255B16%255D"><img width="234" height="240" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-vsLnl3WcxoU/W2pzQlQup5I/AAAAAAAAEiE/2CObml6XK0YGkdjfJS8CTRJ43IESVKe7QCHMYCw/image_thumb%255B8%255D?imgmax=800" border="0"></a></p><p>値を入力すると、右下の「Create App」がクリック可能になるので、クリックします。</p><p><a href="https://lh3.googleusercontent.com/-9PLeSD0ZuNU/W2pzRF_41UI/AAAAAAAAEiI/j9pG8MWNb4wodMz_wVAp3TlP5NKsAlPAgCHMYCw/s1600-h/image%255B20%255D"><img width="240" height="151" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-UVCPsagbmdA/W2pzRRnMmvI/AAAAAAAAEiM/gBtSWDvLfFI3nzQ53_5Klt0GkffPaEplgCHMYCw/image_thumb%255B10%255D?imgmax=800" border="0"></a></p><p>アプリケーションの登録が行われると、上記のような画面が表示されます。今回は Event API を利用したやりとりを行うので、Event Subscriptions をクリックします。</p><p><a href="https://lh3.googleusercontent.com/-4Pd9enQlO_M/W2pzRyy8L2I/AAAAAAAAEiQ/29PGYnBaAKsmAdP_m_HMyGESGa2f4cBhwCHMYCw/s1600-h/image%255B24%255D"><img width="240" height="75" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-YxCT9bCfWTU/W2pzSLzeUBI/AAAAAAAAEiU/k5imULQhYN8J9ZxZW3ncVSv19DUPzMGEACHMYCw/image_thumb%255B12%255D?imgmax=800" border="0"></a></p><p>ここで Off となっているトグルを On にすることで Event API が有効化されます。</p><p><a href="https://lh3.googleusercontent.com/-Bfs-8gOqxLU/W2pzSu605mI/AAAAAAAAEiY/5_jWDu7zlcoL1i56bAvJtzJSHN57GWAgACHMYCw/s1600-h/image%255B28%255D"><img width="206" height="240" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-Lh2MGLuTXzA/W2pzTEKUdhI/AAAAAAAAEic/9Dno2pLmHxc9fV9i_tb_N2n6rWsvNZylACHMYCw/image_thumb%255B14%255D?imgmax=800" border="0"></a></p><p>そこから先の設定では、Event API で呼び出す先の URL が必要になったりしますので、Slack 側の設定は一度ここで区切ります。</p><h2>2.LogicFlow の作成 第一弾</h2><p><a href="https://lh3.googleusercontent.com/-c6WSrjazx1s/W2pzTvuPFDI/AAAAAAAAEig/bHAhzSWHhf0CxamH9si9ADVttCB3soU8ACHMYCw/s1600-h/image%255B32%255D"><img width="240" height="212" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-eNtLLYoLseU/W2pzT0EmukI/AAAAAAAAEik/2XM8XLYGQfoMRSI3rQXK7tLaAOFsByBpgCHMYCw/image_thumb%255B16%255D?imgmax=800" border="0"></a></p><p>Azure Portal から新しく LogicApps を作成、または Flow にて新しく作成を行います。題目にある「第一弾」というのが色々感じるかと思いますが、Slack の Event API を利用する際、送り先 URL の検証をクリアする必要があり、その時のやり取り用処理を先に用意する必要があるためです。</p><p>その際に、送られてきた値を元に手億艇のルールにのっとって返答を返す必要があります。実際に送られてくる値については、<a href="https://api.slack.com/events/url_verification" target="_blank">API ドキュメント</a>でサンプルがありますので、これをもとに受け取るデータのスキーマを定義するよう LogicFlow の設定を行っていきます。</p><p>サンプル値<br />
{ <br />
"token": "適当なトークン値", <br />
"challenge": "適当な値", <br />
"type": "url_verification" <br />
}</p><p><a href="https://lh3.googleusercontent.com/-t1vvvNYoGaY/W2pzURIWddI/AAAAAAAAEio/HTiV5rl0EA0_nerlpz2o9JgOE98_b2qygCHMYCw/s1600-h/image%255B38%255D"><img width="240" height="300" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-JqGcbsE-7PU/W2pzUzI3CfI/AAAAAAAAEis/_M0_4oeHpysaTscxuYNcESAuYelcOgTPgCHMYCw/image_thumb%255B20%255D?imgmax=800" border="0"></a></p><p>最初の段階で必要な LogicFlow は上記のように、HTTP の要求を受けるトリガと返答するアクションの二つだけです。</p><p><a href="https://lh3.googleusercontent.com/-VKhUE-2Bonw/W2pzVEMy8pI/AAAAAAAAEiw/7Tv38e9dPFkHA0jQrkjlRKS0dLAxjO8ZwCHMYCw/s1600-h/image%255B42%255D"><img width="240" height="159" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-n1A_fHe4AEE/W2pzVv1fIqI/AAAAAAAAEi0/4LnJkUpzUkwapNF5Vvlubsd9hCd95rirACHMYCw/image_thumb%255B22%255D?imgmax=800" border="0"></a></p><p>サンプルデータをもとに、スキーマを定義します。</p><p><a href="https://lh3.googleusercontent.com/-ongvF1dmUwc/W2pzV0Yo8hI/AAAAAAAAEi4/R3avDa6Z2JUnMy4JWigaFkKavUS8xe24QCHMYCw/s1600-h/image%255B46%255D"><img width="240" height="132" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-9ldLGnstRjk/W2pzWRJX9UI/AAAAAAAAEi8/LpcYnq6JijM3wtMxnqsdE29r__ZQkDB0QCHMYCw/image_thumb%255B24%255D?imgmax=800" border="0"></a></p><p><a href="https://api.slack.com/events/url_verification" target="_blank">API ドキュメント</a>を参考にして、この際に戻す値を設定します。戻し方は何種類かありますが、今回は text/plain の形式で対応する方法を行います。この場合は、本文として受け取った challenge の値をそのまま返却することが必要です。</p><p><a href="https://lh3.googleusercontent.com/-nxjRAKrRkuQ/W2pzWlPjP1I/AAAAAAAAEjA/r-qAiVdX6Pc_R3RPBFnAk9nbIH-ewJ4egCHMYCw/s1600-h/image%255B50%255D"><img width="240" height="120" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-lWrn7iUnce0/W2pzXGBzv9I/AAAAAAAAEjE/GkkqsuKDYhobGCWR07FarGDlFZVLuJT6gCHMYCw/image_thumb%255B26%255D?imgmax=800" border="0"></a></p><p>先ほど定義したスキーマにより、ダイアログで challenge が選択できますので、それを本文に設定します。ここを設定したら一度保存し、HTTP 呼び出しを行える URL を生成してもらいます。</p><p><a href="https://lh3.googleusercontent.com/-XWxUXThprkE/W2pzXS597_I/AAAAAAAAEjI/lDPAAV5lhm0Cp8_MKoiyWqozPtskiNbUACHMYCw/s1600-h/image%255B54%255D"><img width="240" height="142" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-8QAYHan0za0/W2pzX5UdtQI/AAAAAAAAEjM/QoLawToIrCcHBKnuli0uvz0U9YaHkeMTQCHMYCw/image_thumb%255B28%255D?imgmax=800" border="0"></a></p><p>この URL を Slack の Event API 設定に設定する必要がありますので、今度は Slack 側に戻ります。</p><h2>3.Slack Event API の設定</h2><p>Slack 側に戻ったら。Event Api を利用するよう各種設定を行います。</p><p><a href="https://lh3.googleusercontent.com/-7K-uSFUxUF8/W2pzYc1rtFI/AAAAAAAAEjQ/jK9xgpVojVo9lpcL9gsH074Xo7G41ZoYwCHMYCw/s1600-h/image%255B90%255D"><img width="240" height="82" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-9ejRXiiw_yM/W2pzYtR-4RI/AAAAAAAAEjU/hLaB34yoQD8_2VuKBBjrygi7DoeykIL8ACHMYCw/image_thumb%255B46%255D?imgmax=800" border="0"></a></p><p>左側メニューの Bot User をクリックすると、上記のように表示されますので Add a Bot User をクリックします。</p><p><a href="https://lh3.googleusercontent.com/-iWS9xq9PlOs/W2pzZPSOibI/AAAAAAAAEjY/gL-6bQ6P-SA6XlYWPNLVCBwZFqAnpVkPwCHMYCw/s1600-h/image%255B94%255D"><img width="240" height="203" title="image" style="margin: 0px; border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-Jvic9-9gL2k/W2pzZZ2cg5I/AAAAAAAAEjc/MqU28Fm3WW0Tzp10skaMxivFcJ2T1oAIACHMYCw/image_thumb%255B47%255D?imgmax=800" border="0"></a></p><p>次に、Slack 上でどう表示されるかといった部分を設定します。Display Name が表示される名前、Default Username は Slack 上で扱う際の基本ユーザーアカウント、Always Show My Bot as Online は、Bot がオンラインであると常に表示するかどうかの選択です。</p><p>設定したら、下にある緑色な Add Bot User をクリックします。追加が行われると、今のボタンの周りの表示が変わりますが、特にクリックしなくても大丈夫です。</p><p>次に Event Subscription の設定を行います。左メニューの Event Subscription をクリックします。</p><p><a href="https://lh3.googleusercontent.com/-CEowx9kOlCc/W2pzZxmrliI/AAAAAAAAEjg/qA18HSTvbj0VTH_I7ewPh_uRrjTzNL8jgCHMYCw/s1600-h/image%255B98%255D"><img width="240" height="75" title="image" style="margin: 0px; border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-RBHsmLTcvvg/W2pzaRuzDhI/AAAAAAAAEjk/OLo6Gb8BK6sqpn5vNNLdHTdJ5R8_LvUUQCHMYCw/image_thumb%255B48%255D?imgmax=800" border="0"></a></p><p>まずは Off になっている設定を On にします。すると設定が必要な個所が表示されます。</p><p>2 で作成した LogicFlow の URL を、Event API の設定にある Request URL 欄に貼り付けます。張り付けると、実際にその URL が有効かどうかを Slack 側から呼び出しをかけ、先ほど作成した LogicFlow が呼び出されます。</p><p><a href="https://lh3.googleusercontent.com/-1PXS2nlihHo/W2pza7hqGNI/AAAAAAAAEjo/XeWHibNZF9cTYQqkRFnkLxTPbdVrEdANACHMYCw/s1600-h/image%255B58%255D"><img width="240" height="108" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-wP4EDvAzB14/W2pzbFhQObI/AAAAAAAAEjs/Mpbjs4HfPsI2L4icDipsY5Ybo-Fvg3pUgCHMYCw/image_thumb%255B30%255D?imgmax=800" border="0"></a></p><p>問題なくアクセスが確認できれば、上記のように Verified と表示されます。ここで何らかの問題があった場合は、URL の張り付けミスか、LogicFlow の内容を確認してみてください。</p><p><a href="https://lh3.googleusercontent.com/-6ocE5Yz_1kk/W2pzbobCEmI/AAAAAAAAEjw/jRZ9TAWewSoiOTtslGRTdtogCodxf2XEACHMYCw/s1600-h/image%255B62%255D"><img width="240" height="162" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-b2BllORxyvk/W2pzb7F6qZI/AAAAAAAAEj0/rNLIrWNtZ18cHfdCLkX38uf0Q9E5pMv0wCHMYCw/image_thumb%255B32%255D?imgmax=800" border="0"></a></p><p>LogicFlow 側でもこのように、Slack 側からの呼び出しが履歴に確認できています。ここに呼び出し履歴が確認できない場合、Logic Apps であればワークフロー設定のアクセス制御で、呼び出し元の制限をかけているかどうかをチェックしてください。Flow の場合は基本的に呼び出せるはずです。</p><p><a href="https://lh3.googleusercontent.com/-mqvIKElGI_I/W2pzcXlVOoI/AAAAAAAAEj4/yeBdAW_QgPwgFdSolc2ts-_9pzdMRHdFwCHMYCw/s1600-h/image%255B102%255D"><img width="240" height="185" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-oCcLC47e19Y/W2pzc3dYmuI/AAAAAAAAEj8/rDM--0TdbZElJRUc1M7Q7NI3ge189L-tgCHMYCw/image_thumb%255B50%255D?imgmax=800" border="0"></a></p><p>続いて Bot に送信してもらうイベント種類を設定します。今回はメッセージの取得が行えればまずはよいので、message.channels というイベントを選択します。ここで選択したイベントが、Bot 側へ通知されるものとなります。</p><p><a href="https://lh3.googleusercontent.com/-7-iXx0BKAQ0/W2pzdKG1LHI/AAAAAAAAEkA/XcBJz28dYnAlUlrio-uI9okG1lOxnOl2QCHMYCw/s1600-h/image%255B106%255D"><img width="240" height="69" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-_RLqY3yQHBI/W2pzdudBjUI/AAAAAAAAEkE/XvK5M455r7IkPbkwIXnUXiwhCLD5kN9rgCHMYCw/image_thumb%255B52%255D?imgmax=800" border="0"></a></p><p>ここまで設定したら、画面の一番下にある Save Changes をクリックして、設定を保存します。ここで保存しないと後で泣きます。</p><p><a href="https://lh3.googleusercontent.com/--YSO8c8PmGs/W2pzd0_ZrEI/AAAAAAAAEkI/iqIgjmcf8dUG0hZjQypqsqnlSNQgeVvbQCHMYCw/s1600-h/image%255B110%255D"><img width="240" height="56" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-p8ygchGiF8c/W2pzeXtTuNI/AAAAAAAAEkM/1teEcuBFFTgyv9SeOaqiuJNPQ8q76y0YgCHMYCw/image_thumb%255B54%255D?imgmax=800" border="0"></a></p><p>保存が行われたら、左メニューの Install App をクリックし、アプリケーションを Slack 上で利用できるように登録します。</p><p><a href="https://lh3.googleusercontent.com/-tUhxpyFzp-4/W2pzenHDAeI/AAAAAAAAEkQ/tFlruKfI_5cCv0528bWjUQ1BtvuyC9szgCHMYCw/s1600-h/image%255B78%255D"><img width="240" height="90" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-Q3bLY63jGKA/W2pzfF_GZqI/AAAAAAAAEkU/h0TwmT-WWNwJnPc3rV-_WshroFrZEo8TgCHMYCw/image_thumb%255B40%255D?imgmax=800" border="0"></a></p><p>ここで緑色の Install App to Workspace をクリックします。</p><p><a href="https://lh3.googleusercontent.com/-m174U5VAQlU/W2pzfr2I_HI/AAAAAAAAEkY/NH_d4I7HaHMI9mT13rpq3KhMisd7wrXGgCHMYCw/s1600-h/image%255B82%255D"><img width="240" height="201" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-pfqIqTb4I7Q/W2pzfxnOx_I/AAAAAAAAEkc/1qkKBbJQ-KAvSC3rcB-fIHx81_w2m9VZgCHMYCw/image_thumb%255B42%255D?imgmax=800" border="0"></a></p><p>すると上記のように、アプリを登録する際に与えられる権限が表示されます。今時点ではそのまま 許可する をクリックします。</p><p><a href="https://lh3.googleusercontent.com/-J7BZ3Nhu4zE/W2pzge0GU2I/AAAAAAAAEkg/nvAHDAlDOekNO82GWt2ZDabQOeq5O3kRQCHMYCw/s1600-h/image%255B86%255D"><img width="240" height="121" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-vmUGbjQpeg4/W2pzgrWwsDI/AAAAAAAAEkk/MWsfk4oG-XEVhp-mh03cT5llBn9U47EnQCHMYCw/image_thumb%255B44%255D?imgmax=800" border="0"></a></p><p>設定が終わると、OAuth のトークンが表示されますが、今回は使用しませんのでスルーして大丈夫です。これで Slack 側の設定は一通り終了です。</p><h2>4.LogicFlow の作成 第二弾</h2><p>いよいよ Bot として動く部分の LogicFlow を作成します。すでに HTTP での要求に対するトリガと、返答を返すアクションが定義されている状態から変更していきます。</p><p>まずは送信されるデータの内容をスキーマ定義します。<a href="https://api.slack.com/events/message.channels" target="_blank">API ドキュメント</a>を参考に作業を行います。</p><p><a href="https://lh3.googleusercontent.com/-WS-q4fDkZQ8/W2pzhLUO-GI/AAAAAAAAEko/3rCqLaOKRdkZw9lp-tJXBK5iUAYngPWNwCHMYCw/s1600-h/image%255B114%255D"><img width="240" height="129" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-Gomb2GozW-8/W2pzhiMgeMI/AAAAAAAAEks/QVzr2Qz4zDsISwTYQQeJVvlXQUpY0clsgCHMYCw/image_thumb%255B56%255D?imgmax=800" border="0"></a></p><p>理想としては、ここにあるサンプルデータをもとにスキーマ定義してそれで万事OK、となるのがよいのですが、残念ながらそううまくは行きません・・・。</p><p>今回の message.channel イベントのデータですが、上記サンプルでは記載されていない値があり、しかもそれが今回の処理で必要となるものだったりします。このあたりですが、開発を経験している人でなくては難しいところになっているのが残念です。</p><blockquote><p>{<br />
"token": "************************",<br />
"team_id": "*********",<br />
"api_app_id": "*********",<br />
"event": {<br />
"text": "Bot の発言やで",<br />
"username": "Microsoft Azure Logic-Apps",<br />
"bot_id": "*********",<br />
"type": "message",<br />
"subtype": "bot_message",<br />
"ts": "1533689573.000015",<br />
"channel": "*********",<br />
"event_ts": "1533689573.000015",<br />
"channel_type": "channel"<br />
},<br />
"type": "event_callback",<br />
"event_id": "EvC5TP1W30",<br />
"event_time": 1533689573,<br />
"authed_users": [<br />
"*********"<br />
]<br />
} </p></blockquote><p>例えば上記のデータは「Bot が発言した際のイベントデータです。event の中に色々ありますが、API ドキュメントにあるサンプルには記載されていない値「bot_id」と「subtype」があります。Bot を作る際にはこの辺りに注意が必要で、送信されるデータをすべて一つにまとめたものから、スキーマを作成する必要があります。今回作成したスキーマを以下に記載しておきますので、こちらも利用してみてください。</p><blockquote><p>{<br />
"properties": {<br />
"api_app_id": {<br />
"type": "string"<br />
},<br />
"authed_teams": {<br />
"items": {<br />
"type": "string"<br />
},<br />
"type": "array"<br />
},<br />
"challenge": {<br />
"type": "string"<br />
},<br />
"event": {<br />
"properties": {<br />
"bot_id": {<br />
"type": "string"<br />
},<br />
"channel": {<br />
"type": "string"<br />
},<br />
"channel_type": {<br />
"type": "string"<br />
},<br />
"event_ts": {<br />
"type": "string"<br />
},<br />
"subtype": {<br />
"type": "string"<br />
},<br />
"text": {<br />
"type": "string"<br />
},<br />
"ts": {<br />
"type": "string"<br />
},<br />
"type": {<br />
"type": "string"<br />
},<br />
"user": {<br />
"type": "string"<br />
},<br />
"username": {<br />
"type": "string"<br />
}<br />
},<br />
"type": "object"<br />
},<br />
"event_id": {<br />
"type": "string"<br />
},<br />
"event_time": {<br />
"type": "integer"<br />
},<br />
"team_id": {<br />
"type": "string"<br />
},<br />
"token": {<br />
"type": "string"<br />
},<br />
"type": {<br />
"type": "string"<br />
}<br />
},<br />
"type": "object"<br />
}<br />
</p></blockquote><p>さて、感の良い人であれば不足していた値の名称から気づくかもしれませんが、Event API では Bot が発言したこともイベントとして通知されます。そのため、Bot が自分自身の発言に反応するのを防ぐ処置を用意していないと、無限ループとなり延々と同じ発言を続けてしまうので注意が必要です。</p><p><a href="https://lh3.googleusercontent.com/-3nUSLO45EBI/W2pziMEoeNI/AAAAAAAAEkw/kR3hBa--GZQqJnxfxNRTa3U5Xqi2oFlCgCHMYCw/s1600-h/image%255B118%255D"><img width="240" height="123" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-neUv76rsSPI/W2pziSG0t-I/AAAAAAAAEk0/rly-OOS4ZgQeeHzah1e2Swm2_AAwsMm7wCHMYCw/image_thumb%255B58%255D?imgmax=800" border="0"></a></p><p>そこを判断するための材料に、先ほど不足していると書いた subtype の値を利用します。</p><p><a href="https://lh3.googleusercontent.com/-tIdy2ajQdXA/W2pzi6_8EII/AAAAAAAAEk4/sNjN3n4F2cc3ElO02Va3dBgwx1ylV2aZQCHMYCw/s1600-h/image%255B122%255D"><img width="240" height="77" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-iusfkFLQ8s8/W2pzjHcoFUI/AAAAAAAAEk8/v6WPyUCE05wlh3xAwRdA_dcA71IgpSH7ACHMYCw/image_thumb%255B60%255D?imgmax=800" border="0"></a></p><p>受信したデータに対して subtype の値が bot_message だった場合、Bot による発言を意味しますので何も処理を行わずに終了する必要があります。</p><p>そのあたりも踏まえて、以下のような LogicFlow を作成しました。</p><p><a href="https://lh3.googleusercontent.com/-H0sfAsh2xWA/W2pzjjZ6RXI/AAAAAAAAElA/sT3sU8EGcMkpfkyo6fZtnvK4aE4QdPEewCHMYCw/s1600-h/image%255B128%255D"><img width="360" height="326" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-CtxM5fzizlQ/W2pzj-RiDoI/AAAAAAAAElE/pxfc-z63O58rvuS9mQ0mnkMv2XnISRI3ACHMYCw/image_thumb%255B64%255D?imgmax=800" border="0"></a></p><p>ポイントとなるところは、</p><ol><li>Botから返答する前に応答を返している</li>
<li>ユーザーの発言かどうかを判定している箇所</li>
</ol><p>の2点です。まず最初に応答を返している点ですが、これをやっておかないと Slack 側で HTTP 通信に失敗した、と判断されて何度もリトライされます。</p><p><a href="https://lh3.googleusercontent.com/-Q0N7SPc8qjY/W2pzkSbV23I/AAAAAAAAElI/ACBnW14DxDQB_G1WUI4tGlnK77tFg7xJQCHMYCw/s1600-h/image%255B132%255D"><img width="240" height="155" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-qJNmP47kaiQ/W2pzkszhjlI/AAAAAAAAElM/1ZjR6Jlr86QpfNd0kNjoT5cB8nREPt6eACHMYCw/image_thumb%255B66%255D?imgmax=800" border="0"></a></p><p>応答では特に何も設定せずに、状態コード 200 で結果を返すようにしてください。これが Slack 側で正常に送信できたことを確認できるものとなります。</p><p><a href="https://lh3.googleusercontent.com/-WTIMzsLakZA/W2pzlNOcL_I/AAAAAAAAElQ/cQ7lWYOPu6w4_cBft6kx8hoff-R8uQ0PwCHMYCw/s1600-h/image%255B136%255D"><img width="240" height="95" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-1iD1V7HV1EA/W2pzleskkVI/AAAAAAAAElU/io4saA35KgAPY7-SNvE1Do4zgwrEaqbegCHMYCw/image_thumb%255B68%255D?imgmax=800" border="0"></a></p><p>次にメッセージの判断を行っている部分ですが、subtype はまだいいのですが問題は type の方です。Slack から送信される値で type という値は 2 つあり、どちらを選択しているかがデザイナ上では全く分かりません。Logic Apps の場合は CodeView を利用することで確認が可能です。</p><p><a href="https://lh3.googleusercontent.com/-ADpeiwJrc3Y/W2pzl5CEF2I/AAAAAAAAElY/toQ8txUtYikh1Sp5k8y2--1nI-q316lyACHMYCw/s1600-h/image%255B140%255D"><img width="240" height="236" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-cJcECKPDxjs/W2pzmIWz7zI/AAAAAAAAElc/VRqdmPV6edcAznd7mhp5pSGskA7MiHX9ACHMYCw/image_thumb%255B70%255D?imgmax=800" border="0"></a></p><p>上記のようにトリガで受け取った値の直下、triggerBody()?[‘type’] となるように設定してください。Flow の場合は CodeView 相当のものがないので、片方で試してダメだったらもう片方、もしくはエクスポートして直接上記の個所を書き換えるなど必要です・・・。</p><p><a href="https://lh3.googleusercontent.com/-9BmzCNkUAqE/W2pzmvHGgMI/AAAAAAAAElg/-hbD921qsOEzDDTGWt9z3t_r_zHJf8FlgCHMYCw/s1600-h/image%255B145%255D"><img width="360" height="66" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-pcGbLjWxRQc/W2pzm2WG5LI/AAAAAAAAElk/tY5cTY7gHH4CZTQAu2dJ1fV2M8GMiHsxgCHMYCw/image_thumb%255B73%255D?imgmax=800" border="0"></a></p><p>このようにすることで、Slack Event API を利用した Bot を LogicFlow で構築することが可能です。</p><p>最後に注意ですが、Slack から Bot へ通知されるイベントは、結構な頻度となります。そのため Flow では対応できるけどもあまり向いていない類となりますので、このような場合は Logic Apps で対応するのがよいと思います。</p>Ahfhttp://www.blogger.com/profile/01553064540426163049noreply@blogger.com0tag:blogger.com,1999:blog-3357313501722746592.post-75077529221726238372018-07-27T11:46:00.001+09:002018-07-27T11:46:36.050+09:00afterShip を利用して配送物の状態を調べる LogicFlow<p>大人の都合(?)もあり、配送されているものが今どういった状況化を調べるのに、どういったやり方がいいかなというのを探していた最中に、面白いサービスを見つけたので利用してみました。<a href="https://www.aftership.com/" target="_blank">afterShip</a> というサービスで、色々な配送業者から情報を取得することができるサービスです。今回は Flow のボタントリガを使って、自分に届く荷物が今どんな状態なのか調べるものを作ってみました。</p> <a name='more'></a> <h2>1.下準備</h2><p>afterShip のサイトを開くと次のように表示されます。</p><p><a href="https://lh3.googleusercontent.com/-AKc3q9Tay-8/W1qHSmHcp3I/AAAAAAAAEek/lfgC4CznbiY_Myqvy3OE2atNpufvoNgvQCHMYCw/s1600-h/image%255B8%255D"><img width="240" height="128" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-uEqrDIYkqvk/W1qHSwDCXtI/AAAAAAAAEeo/fDiv8y0IPrEUyBrqWEDjLvwLZrP-AjHTQCHMYCw/image_thumb%255B4%255D?imgmax=800" border="0"></a></p><p>afterShip は月間で扱う荷物量によって、必要となるライセンスが異なります。月間 100 個の荷物であれば、無償アカウントで対応が可能で、それを超える場合は有償ライセンスや、別途相談という形を採用しています。ちょっとした EC ショップなどであれば、無償の範囲でも有効だと思います。</p><p>アカウントは右上の SignIn から作成します。</p><p><a href="https://lh3.googleusercontent.com/-SKSwAzQTaTg/W1qHTc9XJ4I/AAAAAAAAEes/hYfRuSkWMH0cV7URKMDfPe1LEjorcOyYACHMYCw/s1600-h/image%255B13%255D"><img width="240" height="315" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-w55EEBfKJtk/W1qHTzSKoWI/AAAAAAAAEew/jf1z2876IcECPlWQArAMTQbbLd2i-ZxQQCHMYCw/image_thumb%255B7%255D?imgmax=800" border="0"></a></p><p>新規の場合は、一番下にある Create Account をクリックします。</p><p><a href="https://lh3.googleusercontent.com/-PhNm7so6jhc/W1qHUZKDOrI/AAAAAAAAEe0/V3lP9bZNWRMjs7ZYWYjZWmLbOSWyJlR4ACHMYCw/s1600-h/image%255B18%255D"><img width="240" height="351" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-J6VsC5Sq44Y/W1qHUjPdqlI/AAAAAAAAEe4/i7WHQ4ecJDgic7ad94zlY2P3Hkd6mcv2gCHMYCw/image_thumb%255B10%255D?imgmax=800" border="0"></a></p><p>するとこのように表示が変わりますので、氏名とメールアドレス・パスワードを指定して Create Account をクリックします。</p><p><a href="https://lh3.googleusercontent.com/-A300Gf7Xbzc/W1qHVGwbBhI/AAAAAAAAEe8/ikOQAJeobH0os6aGIzfe4KQrMeF4PibTgCHMYCw/s1600-h/image%255B22%255D"><img width="240" height="182" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-3Ilka4Md0bg/W1qHVkBLevI/AAAAAAAAEfA/uqqDjmUEIyoLEWUwo0kejfyq6FA9KYOcACHMYCw/image_thumb%255B12%255D?imgmax=800" border="0"></a></p><p>無事にアカウントが作成できログインできると、上の画面に変わります。API を利用しないのであれば、この画面から荷物の問い合わせ番号を入力して状況を確認したり、現在登録されている荷物全体の状況を俯瞰したりすることになります。</p><h2>2.最終的に作成する LogicFlow</h2><p>今回は提供されている API を利用して、LogicFlow から荷物の状況を取得する、ということをやってみます。最終的な LogicFlow は以下のようになりました。</p><p><a href="https://lh3.googleusercontent.com/-ED6a8kon3WE/W1qHV8SPa2I/AAAAAAAAEfE/4xZaNPhbqdovh5UDxq1CXu_CFFbS4vmOQCHMYCw/s1600-h/image%255B7%255D"><img width="240" height="303" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-MzsNGHplz7E/W1qHWTvw1vI/AAAAAAAAEfI/kUHVdxOjWg0MFp7V_NoajzJfhJOOfPRWgCHMYCw/image_thumb%255B3%255D?imgmax=800" border="0"></a></p><p>縦に長いですが、大まかにいうと</p><ol><li>荷物の登録</li><li>荷物の状況取得</li><li>荷物の削除</li></ol><p>となります。各工程で利用する API については、afterShip サイトにて<a href="https://docs.aftership.com/api/4/overview" target="_blank">開発者向けドキュメント</a>も用意されていますので、そこを参照します。通常利用であれば、荷物を登録して状況確認したといっても、削除を行う必要はありません。業務であれば「配達完了した」「相手がいなくて持ち戻った」など、配達が終了する状態になってはじめて削除することが多いとは思いますが、今回は「最初に必ず登録を行う」ように処理を考えたため、最後に削除を行う形にしています。登録済みの荷物の場合、そこでエラーになりますがそのエラー処理を盛り込もうとすると、ちゃんと考えないといけないな、と思ったのでお試しでやっている今では行っていません。</p><p>開発者向けドキュメントの方には、状況によって戻されるステータスについても解説があるので、そこを見て処理を作るのがよいと思います。</p><p><a href="https://lh3.googleusercontent.com/-tONbbq2jx-s/W1qHWlH1YPI/AAAAAAAAEfM/IKCSg8eLTN4FmjsxweC_k8UpNRxF1eIZgCHMYCw/s1600-h/image%255B26%255D"><img width="240" height="76" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-0TpFvlUk6d8/W1qHXCA8BcI/AAAAAAAAEfQ/lLK1-JH2ezo-EH_KKgDEmtetH6PT_Le0gCHMYCw/image_thumb%255B14%255D?imgmax=800" border="0"></a></p><h2>3.API キーと配送会社情報の準備</h2><p>さて利用するには、上記の流れに沿って API キーを準備する必要があります。初期状態で一つ用意されていますので、今回はそれを利用しています。サインイン後に表示されるマイページ的なところから、一番左下にある設定アイコンをクリックすると確認できます。</p><p><a href="https://lh3.googleusercontent.com/-KQJUVeWgmtU/W1qHXbD063I/AAAAAAAAEfU/wFSoAtJ24g4jRDpERZzdnrz3tXoSlPF8ACHMYCw/s1600-h/image%255B30%255D"><img width="240" height="153" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-CWTeUwDdMiw/W1qHX4jAURI/AAAAAAAAEfY/aJjH2iycW0kEbdsB9CmC4ySvs1UE7VnhACHMYCw/image_thumb%255B16%255D?imgmax=800" border="0"></a></p><p>この API キーは、API を呼び出す際に必要になりますので、どこかにメモしておきます。</p><p>次に、API で配送会社を指定するために必要な情報を準備します。これは afterShip のサイトで Courier をクリックすると、対応している配送会社一覧が表示され、その中に Download Courier List とリンクが用意されていますのそれをクリックします。</p><p><a href="https://lh3.googleusercontent.com/-DZtHs8dZ6Tc/W1qHYaD_39I/AAAAAAAAEfc/tBU_jq8VbDghk3kHmPrX5fdjN7brFJyhwCHMYCw/s1600-h/image%255B34%255D"><img width="240" height="162" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-txW4tNLWTCY/W1qHYmtW9lI/AAAAAAAAEfg/fSw54744cbYsxRJNHZ7CyVK4m7AM-B7SQCHMYCw/image_thumb%255B18%255D?imgmax=800" border="0"></a></p><p>今回はここで入手した配送会社の情報は、Excel 上に保持させて OneDrive に保存、LogicFlow 実行時にはその Excel から API 用の配送会社コードを取得するようにしています。業務で使うのなら、どこかの DB とかストレージ、今なら cosmosDB がいいかもしれません。</p><p><a href="https://lh3.googleusercontent.com/-c4pY8gbgq7I/W1qHZMzBeFI/AAAAAAAAEfk/CDnY9KQqofYs7dRW3IiabpYbKVqIQ_ucwCHMYCw/s1600-h/image%255B38%255D"><img width="240" height="155" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-jcLh0vtqV-M/W1qHZlWXXHI/AAAAAAAAEfo/Kelb1V1_MdQnccGBkFxK_ZhBFnzYEMROACHMYCw/image_thumb%255B20%255D?imgmax=800" border="0"></a></p><p>ダウンロードしたファイルは CSV 形式ですので、Excel で開きテーブルとして設定します。このファイルでいう左側の項目(Courier Slug)が API に渡す際に必要となる配送会社のコードのようなものです。本来であればこのように全件持つ必要はなく、自分が必要な配送業者に限定しておくのがよいと思います。</p><p><a href="https://lh3.googleusercontent.com/-FxxRKdLlorw/W1qHZ1i7icI/AAAAAAAAEfs/ioo-drcPqDIQF8tJFZezuQnkBL0atHMrwCHMYCw/s1600-h/image%255B42%255D"><img width="240" height="150" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-Njd9cqFwuzk/W1qHaRkDEJI/AAAAAAAAEfw/GyeFzdHmmUs9dq8N9ERhK-o_9UL3HMOnACHMYCw/image_thumb%255B22%255D?imgmax=800" border="0"></a></p><p>afterShip 側でも、必要となる業者を設定画面から登録しておく必要があります。基本は、ここで選択されている業者の情報が取得できる対象となります。</p><h2>4.LogicFlow の作成</h2><p>ここから実際に LogicFlow を作成していきます。今回はボタントリガを利用して、スマホから問い合わせをしたかったのもあり Flow を利用していますが、別のトリガを利用するのであれば Logic Apps でも問題ありません。</p><p><a href="https://lh3.googleusercontent.com/-y8ifQwKssG8/W1qHasJJ2GI/AAAAAAAAEf0/GFhTd2O7iokcwdKWml46eZP-Se9i0ACMQCHMYCw/s1600-h/image%255B46%255D"><img width="240" height="174" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-c2ZOzZISC1A/W1qHbBzjZ0I/AAAAAAAAEf4/RwsCSLVdFkcXGGlWs537jXHtKjScHuOMgCHMYCw/image_thumb%255B24%255D?imgmax=800" border="0"></a></p><p>最初のボタントリガはこのような形で作成しました。送り状の番号と、利用した業者を選択させます。この時、業者の日本語での名称と英語名称を併記していますが、これはこの英語名称をもとに先に準備していた Excel シートから、API で利用するコードを取得させたいためです。</p><p><a href="https://lh3.googleusercontent.com/-_BXXnIC2-7E/W1qHbS7Vr6I/AAAAAAAAEf8/ECvLnOxZa38NQiCfGA4gDLHXfJIDmAWowCHMYCw/s1600-h/image%255B50%255D"><img width="240" height="231" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-bTXEs2aRTMM/W1qHb2qNM0I/AAAAAAAAEgA/0SqoJ10XmTUG-PPI5_xa2f7RnlpLszWuwCHMYCw/image_thumb%255B26%255D?imgmax=800" border="0"></a></p><p>次に、今回の LogicFlow では何度か API 呼び出しを行いますので、API キーをあらかじめ選ぶだけで利用できるように「作成」アクションで定義しておきます。</p><p>そして Excel ファイルから配送会社を抽出するのですが、今回は全件取得してその結果に対してフィルタリングをかける、という方法を利用しています。Excel コネクタのアクションで 行を取得する というのがあるのでこれでいいかな?、と思い試してみたのですがうまくいかなかったので苦肉の策です。Flow であれば課金には影響しないので問題ありませんが、Logic Apps の場合は 1 アクション増やしてしまっているので、そこは注意が必要です。</p><p>今回利用している Excel コネクタのアクションでも、OData クエリとして抽出するデータの条件を指定できますので、それを利用するのもよいかと思います。</p><p><a href="https://lh3.googleusercontent.com/-CKBukjr4fz4/W1qHcZB2GNI/AAAAAAAAEgE/j86WV3DZi9g2xnZtHIXIfs1Y0ao6ImNQwCHMYCw/s1600-h/image%255B54%255D"><img width="240" height="55" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-7n6eKZEVlPg/W1qHcx6AW9I/AAAAAAAAEgI/9MMNfewjPgcqrzPW8dWyNNsk8E9U2Y5-ACHMYCw/image_thumb%255B28%255D?imgmax=800" border="0"></a></p><p>フィルタリングを行っているのは、このような条件で行っています。</p><p><strong>split(triggerBody()['text_1'], ':')[1]</strong><p>上記のように関数を指定して、Excel 上の配送業者名(Courier Name)が一致するものに絞り込みを行っています。ここで Split 関数で文字列を分割しているのですが、その時に利用しているのがボタントリガで選択させようとしていた、配送業者の日本語名と英語名を並列で表記しているものです。日本語名:英語名、として表示しているので:で分割を行い、0:日本語名、1:英語名という配列に分割しています。<p><a href="https://lh3.googleusercontent.com/-IUpgXiajIXU/W1qHdRa7hEI/AAAAAAAAEgM/rGeNG1JHuCsLZGNvVYntXwRVMBTRTdlcQCHMYCw/s1600-h/image%255B58%255D"><img width="240" height="60" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-LjOjhbATG_w/W1qHdnM3iBI/AAAAAAAAEgQ/qKbOFLFy_vk5hs7o9jHYX_dvFu3I87uGQCHMYCw/image_thumb%255B30%255D?imgmax=800" border="0"></a><p>その結果を見て、該当したデータがあったかどうかをこのような形で聞いています。<p><strong>length(body('指定した配送会社を抽出'))</strong><p>フィルタさせた結果に length 関数で、分割した結果の配列数を取得しています。対象が拾えた場合は、日本語名と英語名が拾えているので 2 となりますし、対象がなかった場合は 0 となります。<p><a href="https://lh3.googleusercontent.com/-54MQYY_UIP8/W1qHeNn5V7I/AAAAAAAAEgU/N965tXyyD1ksPZc2XNPkH1QsdlPDjU2LwCHMYCw/s1600-h/image%255B62%255D"><img width="240" height="37" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-CcdxgMUJr70/W1qHedu14YI/AAAAAAAAEgY/ZNgtdd3Kfn4lH7WILF9Ov-Y6K9sEEdcVQCHMYCw/image_thumb%255B32%255D?imgmax=800" border="0"></a><p>Excel から取得できた結果から、API に必要な配送会社コード(Courier Slug)を定義させています。<p><strong>last(body('指定した配送会社を抽出'))?['Courier Slug']</strong><p>ここでは last 関数を利用していますが、これは先にフィルタリングした結果が「(万が一)複数存在した場合」を考えてしまったこともあり、取得できた結果が何件であってもその最後の結果から拾えば大丈夫だろう、という考えに基づいています。実際には 1 件しかないのでこのように書かなくともよいのですが、その場合は<p><strong>body('指定した配送会社を抽出')[0]?['Courier Slug']</strong><p>のような形で書く必要があります。個人的に配列の最初の値を表す [0] の部分が好きではない、という理由もあります(<p><a href="https://lh3.googleusercontent.com/-NBiEtITXt3Q/W1qHe7G1NlI/AAAAAAAAEgc/rN8o4b-Fa4YKoPbDTeicdyVU2CjnOpdFQCHMYCw/s1600-h/image%255B66%255D"><img width="240" height="178" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-ZX2S9rX677Q/W1qHfMqPODI/AAAAAAAAEgg/02f0DYf45-cMhxR-BcRruPvRQ18AvH9lQCHMYCw/image_thumb%255B34%255D?imgmax=800" border="0"></a><p>いよいよ API を呼び出す部分です。afterShip の開発者ドキュメントにあるように、荷物を登録する際には POST で必要な情報(配送会社、送り状の番号)を JSON 形式で付与して呼び出しを行います。<p>ヘッダ情報として、API キーと Content-type を指定するのも必要です。ここが誤っていると 403 エラー(認証エラー)となります。<p><a href="https://lh3.googleusercontent.com/-DUspXOqYu3M/W1qHfre18PI/AAAAAAAAEgk/EWkZ-mJsnqsZiFduk7Ez2Yfs_2U22AFSACHMYCw/s1600-h/image%255B70%255D"><img width="240" height="199" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-cHcwDg4PaSI/W1qHgZfiMcI/AAAAAAAAEgo/yLMx5w4ZTEYlbF9YVOYmoxIMh2mvtMVUgCHMYCw/image_thumb%255B36%255D?imgmax=800" border="0"></a><p>API で登録した際に、afterShip 側から返却された結果を分析して、後で利用する ID 情報を拾えるようにします。ここは開発者ドキュメントでサンプルのレスポンス情報が記載されているので、その値をもとに JSON スキーマを生成します。<p>その後に 20 秒待機させていますが、これは afterShip に荷物を登録しても、すぐにはその情報が反映されないためです(登録後 afterShip 側で現在の荷物状況を取得しに行っているため)。少し時間を空けることで、最新状況を取得できます。<p><a href="https://lh3.googleusercontent.com/-iy2HqW29Ohg/W1qHggEW73I/AAAAAAAAEgs/H1E8HrovaL4QzHpXpzFZvbSUbTlJsOHPwCHMYCw/s1600-h/image%255B75%255D"><img width="240" height="318" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-1wAhjkRKSkI/W1qHhOO9m6I/AAAAAAAAEgw/nXMNPAOmbYcaBiwaLoPrE9RLFFHzpcFZwCHMYCw/image_thumb%255B39%255D?imgmax=800" border="0"></a><p>少し時間を空けたら、最新の状況を取得します。この時の URL に id という値を利用していますが、これが登録時の結果に含まれている値で、API を呼び出す際に URL に含めてあげることで「この荷物の情報を~」といった指定が簡単に行えるようになっています。REST 形式ってやつですね。API としては ID 値でなくとも、配送会社コード(Courier Slug)と送り状番号を含んだ形の URL にも対応しているので、ここはどちらでも構いません。私の場合は、二つの値を含ませるのが面倒だったので ID 値一つだけ利用するようにしています。<p>最新状態を取得できたら、その中の tag という値に最終状況が設定されています。これは afterShip サービス上で統一した値が設定されるようになっており、本来では配送会社ごとに異なる状態(日本語で配達中となっていたり、英語で delivering となっていたり)なのですが、それを意識したくなかったため、ここ値を利用しています。<p>配送業者ごとの値でもよい場合は checkpoint という配列で細かい詳細状況が返却されていますので、この配列の最新(一番最後のもの)を参照すればよいでしょう。<p><a href="https://lh3.googleusercontent.com/-wZEz9sZRxCQ/W1qHhR8XDzI/AAAAAAAAEg0/eCaEiDAMsqo3mMWzhKM5s7CD3J1IGxa-gCHMYCw/s1600-h/image%255B79%255D"><img width="240" height="201" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-QRh4xYOVVdU/W1qHh0b0WZI/AAAAAAAAEg4/vghrAlfsL3U_RFXR4NvPhhREC6vC3odQgCHMYCw/image_thumb%255B41%255D?imgmax=800" border="0"></a></p><p>最後に、今回問い合わせた荷物の情報を DELETE 形式で API を呼び出し、afterShip サービスから削除しています。ここで削除しなかった場合は、afterShip のサイト上で荷物情報を確認できる状態のままとなっています。そして次に同じものを登録しようとしたときに、エラーとなりますのでこのあたりの組み立ては、ちょっと注意してください。</p><p><a href="https://lh3.googleusercontent.com/-TL1rUiSh9M8/W1qHiLmHTrI/AAAAAAAAEg8/fNPjC2tYN-Ig8XgulcwpYtmQK0Wi_GiYQCHMYCw/s1600-h/image%255B83%255D"><img width="240" height="137" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-zL915FpQt8w/W1qHiqNqL0I/AAAAAAAAEhA/iO_CTpKWWNM2aHFYZGHCjYJIX7GPwUZkACHMYCw/image_thumb%255B43%255D?imgmax=800" border="0"></a></p><p>ここまでくみ上げると、ボタントリガで入力した送り状番号と配送業者をもとに、現在どうなっているかを afterShip サービスで検索、その結果をスマホにプッシュ通知といった LogicFlow が完成です。</p><p>API を利用しているので複雑なようにも感じられますが、今回のケースのようにそこまで複雑ではないものも世の中のサービスにはたくさんあります。そういったものを Logic Apps や Flow から呼び出してみて、いろいろなものをつなげてみてください。それが iPaas と呼ばれるサービスの得意分野となります!</p>Ahfhttp://www.blogger.com/profile/01553064540426163049noreply@blogger.com0tag:blogger.com,1999:blog-3357313501722746592.post-64234800649768134622018-07-03T15:23:00.001+09:002018-07-03T15:23:31.256+09:00LogicFlow における Try-Catch-Finally パターン<p>Logic Apps や Flow では、エラー処理のためのパターンが利用できます。プログラムを書く方にはおなじみの Try-Catch-Finally な形式です。</p>
<a name='more'></a>
<p>想定通りの動きを作れるか試すために、以下のような LogicFlow を作成します。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik4GGq0oaZ_18oGZjD_jguT6aiXh49TF_M0TJPpGwuJTq_cC7MH8IIemaaLqHKPbLx100RGkyp-rP1vxucnDhADfHb3OBcKzJpewWCASPuzK0qZDvd_EI66WgnNZtHGQyGbBRkDPxTxojw/s1600-h/image%255B34%255D"><img width="165" height="240" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhT_cgWPCYulS6k80JYsSh0w-4kx-4jw5OYX4iwcPyH9l4Eoy6MzyVsVKD-08AO445Z6A-DkHFpUc4NLVUVJvulHJJcMk6JYMK5_sflEjdl-YOigbDBvG3QxeHEKGW8x3BRHjn3YCscKMi4/?imgmax=800" border="0"></a></p><p>上記のように、スコープを利用して Try 部、Catch 部、Finally 部を用意します。最初に適当な変数を作成していますが、これは後でエラーを発生させるためにも利用します。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFVyglvA8K9LJDdf1c3ylfTG8V1_hAhCb2WY-hcYVqidLXa7rjQb-xrEHxP2lYNUBiezEdeRsKcud96iGEsyyfAuYInU7DOWjjB14XiW2EYAF01Agic1Zoh77pTq9w43y-m2fKo7J9uvN1/s1600-h/image%255B5%255D"><img width="244" height="86" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdOGkCbBSGPBgv7J2gqJ81GfkNhrlWNBR8yVdQ5od1bkpZhkZXnz_lKId0XOmATYQRebdksnFOMZpJNpDPWJYiDBGz7LaHDxXR4bJmHy1yhyq9UA6Znm1HOT8wlZPpfO64UaRUeJWuKsW6/?imgmax=800" border="0"></a></p><p>次に Catch 部の設定を行います。右端をクリックすることで実行条件の設定を行えますので、「失敗」と「タイムアウト」にチェックをつけ他は外します。このような設定をすることで、処理が正常終了しなかった場合に対応することができます。場合によっては「スキップ」も設定してよいかもしれませんが、ここは Try 部分でスキップが発生するかどうかで分かれます。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZUoatdfhlxWjPbWK6gzJU0FYeQLq51ejHoblu8PLPGizK3Sb42OUmga9GjIxK4_rc4u-mj7ZbXulH9G71vlh4AQK8YJdG17yxD-I69kYallLeYNAAqNKpoiSkcjrI501s0xpSzi4Xa8hs/s1600-h/image%255B33%255D"><img width="240" height="93" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga4TsX7W3FsKmz0ggK4taiMAkde3V8FLkMIljCMbi_85xlLeFQYRZsxJvyf0w-LdR7YExRLlm_b0o9933FAbdpOwpFaaie-jfLqbvNoq1-2N8TgchaGsaTI1nVXe5vmq0en6xHawYZiPsN/?imgmax=800" border="0"></a></p><p>次は Finally 部です。ここはここまでの処理がどうであれ、必ず実行を行う部分です。そのため実行条件としては、「成功」「失敗」「スキップ」「タイムアウト」すべてにチェックを付けます。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpeEVqCud1DcYIYOfP4j-P_2T7I-jj2dtcsOMy2bcqCUD27cbEWlR29XT1S_OnqMCEhZxNwYdVEObgYIShvkb85mNiMi5XvxcDUlBbP4pouNDdv078SU33cIzLFRbdo3tc9cggGAZVQ1tH/s1600-h/image%255B32%255D"><img width="240" height="90" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTNFxnwr1ExgrPwqmmbywcMq1fpe7Wzb3kIky2-U8GyO7R3QP7sjH3k2rCczHmuST7lnVp6G3-zrvrqSW3W36gG3nVoN1B_1GXz-sWOT2wY4z3GVbmP-DJQzuk5bzQcr7hA2WhQf04ZYv8/?imgmax=800" border="0"></a></p><p>まずは正常パターンとなるように実行してみます。Try の中の処理は正常に実施できるよう、変数に値を 1 追加させるなど、問題なく動作するものを設定しています。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_iLoKpvj1ATqaWYAxGZzNbrRra9rX32yFn0Rl9IBXDANBCNojAypWOihJEzSFeHOeGX2Wqbj900iy9Vqmm60cdP-U8t4rTEGMrW0OHY2dWiiYCjbz1SJTPoR9XuUMCNCxn60XAKjTEqtq/s1600-h/image%255B31%255D"><img width="216" height="240" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6j-6FIiDfFIhQRnmtHYej6zYsz1M6GMceArf6tNQOcDoPp9RSVRFG6wc5q6LbJOEwYKxNVBvDYH_Db20E_bZGKhl7-0fqMwCguUU_Gx9fFPMGr6yzx6IKNKdTcg0sLmO1J2xiUOcG60t9/?imgmax=800" border="0"></a></p><p>このように、Try 部と Finally 部が実行され、Catch 部がスキップされているのがわかります。これが正常処理時の流れとなります。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOEvvh0KsbGGLTVxLbhfn_AUDKZR44EjfpdUpAaEeF3jtGer_mouZ6WUX6x96CqvoJDzm4Bl89wizF00gaJ7jJJjam3fVDACn8c-lGEnKRMIoCksefmxhUMEVEXpaL9thX7Rr-BVOKWNg-/s1600-h/image%255B30%255D"><img width="240" height="69" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxrXWD_5Dvf4k07Og4Of0lwZ7rD0vWWX1GbGop_Q734AXkMvMdPNjFmlR2nJctBq53fhYgNQg55usOasBlMTzc1MQaFB8y2cpADWVB7GsNWyN23bec1WS3D3zbSKEPwlCAso3py3tqAmFZ/?imgmax=800" border="0"></a></p><p>続いて処理でエラーをわざと発生させます。上記のように関数を利用することで、意図的にエラーを発生させることが可能です。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1ZvBVHXA0WLw1RsDV7GKRlGmRhqKwuNRxHYkXXcKqLmi6A5tfg10ehgiIv1zh5RED276hNzV4l-2ATknZk7LrB1fjFMNNr6gs7PxwIPL-aWdaDSil2jAZ_nZT_1gMztOuNsGONBAX3jzr/s1600-h/image%255B29%255D"><img width="240" height="229" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqbPUDG0EDXlavmUQUuiY9-8Vwm3Ee2tg2cFyj8YrL7O4zL2lWgKM5Ungl3JKOCKtvD0n185GAZOgVz20EVmlKo25VLb_d5sU-VaY8DO_28sC8BaQXr8Yy_aLXEf2PBo9M-PLxyxr9J9ec/?imgmax=800" border="0"></a></p><p>実行させると Try 部で関数がエラーとなり、Catch 部が実行され、Finally 部も実行されています。Catch 部ではこのようにエラーが発生した際の処理、例えば補正などを行うことになるかと思います。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYyrsOI1HJEcqvVmgINjcU-ur3V1vBJGaYYsQjup9cDyOceGkTaVSaoEsa4nukrBFhjh241klHucs1XulLnUX8Zwo8J2Bcj2onjkk95dWlDMW4MiTtFcYO7hVsVZ9NsB5lfCfHNZwvi2Zs/s1600-h/image%255B28%255D"><img width="222" height="240" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8VbXc3qUERPdjrc582ew19eMQ2mL6rh4Zgys08wJMKjwpnGSMfnkr86kj5kRpOjVTlO-ds7FvBqkIS8JcJhW54epn5HxPtAwmEthhVjBOXAtjm-WpM0_5BBf01dxdMnT9jzDw5Ks-XTJf/?imgmax=800" border="0"></a></p><p>最後に Catch 部の中でもエラーを発生させてみます。上記のように、Try 部、Catch 部それぞれでエラーとなっていますが、Finally 部は問題なく実施されています。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-geXq4C5xDQEsXXnksGWOHFWq9p52NPNC-IynNmcxeIBKC55DXU3f561Xwsm2Aegs0Jg-JfXeH3dUADsifEA8V2vMWZBBpbUIkz9o5YS2PBEawP095LozC3nXcW8vMM3pPKKatf4JkErb/s1600-h/image%255B27%255D"><img width="240" height="99" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyA2r7Tsg2vNVocXrAqSpkCQLC-_MI4OOwn1n7aZ2UK3ilexX4gGN5RcqRcZGStSYxPVCxBrCNsCUkJhG9t5SDTo4UqGqcTVeY_JSU92Ohc2nKKtpT894_JOXy0HVI8V9rqjqU1aHAprZ_/?imgmax=800" border="0"></a></p><p>このような形で LogicFlow を実行できるのですが、一つ注意が必要です。このままだと、たとえエラーが発生したとしても LogicFlow の処理結果は「成功」となってしまいます。そのため、それぞれの部で、処理が終了したかどうかのステータスを変数に設定し、最終的にその値をもって成功か失敗かを返却する必要があります。</p><p>もちろんこの部分はケースバイケースで、たとえ途中でエラーが発生しても成功とするのがよしとされることもあります。必ずしもこう、というものではないので適宜変化させて利用してみてください。</p>Ahfhttp://www.blogger.com/profile/01553064540426163049noreply@blogger.com0tag:blogger.com,1999:blog-3357313501722746592.post-51607824496132131762018-06-26T13:39:00.001+09:002018-06-26T13:39:54.650+09:00Logic Apps の実行履歴を取得する<p>ふと気になることがあって、Logic Apps の実行履歴を取得して直近で処理された日時がわかるかな、というのを試してみました。</p>
<a name='more'></a>
<p>Logic Apps の実行履歴を取得するには、<a href="https://docs.microsoft.com/ja-jp/rest/api/logic/workflowruns/get" target="_blank">管理用 REST API</a> を利用する必要があります。Workflow Get の API を利用することで、指定した Logic Apps の実行履歴が取得できます・・・が、この際に必要なパラメータに runName というのがあるのですが、これの情報を簡単に取得する方法が用意されておらず、結果としては Get ではなく <a href="https://docs.microsoft.com/ja-jp/rest/api/logic/workflowruns/list" target="_blank">List</a> の API を利用することで履歴取得を行うことになります。</p><p>今回作成した LogicFlow は以下のものです。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgy-mjxApwrvqSK5HRbe2VUmHcehgIBBbFgFh6O2pMbibkKhcly-zXCs9Nl7xrqQ3y4VZWkClWQozHlJLEWu8xc1Zv0XTDED_irdPH5jlYITZGqNNlMzkpGTLq2ylWyWL_LkL2qYhEn4UxO/s1600-h/image%255B4%255D"><img width="360" height="290" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhBlNawE0Ne6U0-Tbu6KmnaW3aucNLGVmAXkArXupkCbZqACRPVFwAArhjKKa2G5EY7MuSAMo8X96iFvmrq9rrVeqizdYctdtWUNGRr5_K-p2TNnoELfjEA8aoSAQ8Q9C_8tXoqCBOh9rq/?imgmax=800" border="0"></a></p><p>最初に API を利用する際に必要な Bearer Token を取得しています。こちらについては <a href="https://github.com/ahf0124/LogicFlow-ja/tree/master/GetBearerToken" target="_blank">GIthub にサンプルとなる LogicFlow を用意</a>してあるのと、<a href="http://blogahf.blogspot.com/2017/05/logicflow-bearer-token.html" target="_blank">過去のエントリ</a>で扱っていますので参考にしてください。</p><p>Bearer Token を用いて管理用 API にアクセスします。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglMF2kY0pv0nvcOv4xGLm3Tkao_AfiKqjBwXNXW4l-r1s8pho5ZJnjaf4BrqU3wJFNn8fvdrsqKmHa6kE0X1szhpBieCpE0QI7hUyhTl09bTvmsczriRityUKQ0wa9j1sC8hv8peP7gAkd/s1600-h/image%255B9%255D"><img width="360" height="196" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7k0_tS_6xocYHqMsSgazvEjufrHlDBQ1ndpVhayUbLxpGBYCjLv6WJP4zhC8e9RbRq25edT4ChW8UM-U5WThX8QIEpyd8Us1lmXgkprZnGgBgbNxXqXnpnXa1TlKJN7pLMp3MymtMBTch/?imgmax=800" border="0"></a></p><p>List API へのアクセス URL は</p><p><a href="https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Logic/workflows/{workflowName}/runs?api-version=2016-06-01">https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Logic/workflows/{workflowName}/runs?api-version=2016-06-01</a></p><p>になります。サブスクリプション ID とリソースグループ名、取得したい LogicFlow 名を含めて GET で呼び出します。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRNKkWJWf9zMIxMTRG-16lqPCaDfJRFsXWCryWH-RAeGl-0Gpuezgv8r2h_xNb6nXeV1WZ0-R5dFSDDkTDsqOblPjLWqCbstP7mShZuSL3YyWhrfnujG7L8nM813Gb8WGyldBM_lCww1uf/s1600-h/image%255B14%255D"><img width="360" height="434" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbJeMmsg-SpyZXJEdjtRTrxryqfgSkwO5OvnCWc8tCdXTBT5dgGgpTC7Na2Xj6vNMv-mPqHlNsKkv7YMx2hsLqj0HeMki_pFonB6k9Ge3fW5MWcgyTcxijFUoJ5R6TGHRm7g5U5fT5ZLra/?imgmax=800" border="0"></a></p><p>API を無事に呼び出せると、上記のような結果が返却されます。最初に書いた runName ですが、この値の中の name がそれに該当します。この値は実行ごとに設定されるもので、この履歴を取得しない限り値がわからないのです・・・。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxi1CFSnmjd84MnmWHDsS-9lW1OyfHDSvQKLWTLWJgdmciw3GyuNUzHCQnDygNKuwWxhEkUI6zIjiwsWvYkzVNRDoeuoUL21mvsx2e1MMvYlYxPHvRT9Vm_mxtpFkHU2SPWY2BwOIbqP0O/s1600-h/image%255B19%255D"><img width="360" height="174" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoa8_iYef2dk-QdiYNA0HSNea0p8z6KEm4965E-UiBt8M75OQrJguzLN8RZIXN_z_yXWBU7G_Dcu1ZvgcZsNwtmlviXh137lsz2KT1V0Qx0d9AX14dmVnk-MRpxEiJ3zrC0_KsT-vweJBG/?imgmax=800" border="0"></a></p><p>返却される履歴には、実行中のものも含まれます。status が Running となっていることで、実行中だというのが判別できます。また、開始時刻や終了時刻、終了したのが反映された時刻なども取得できています。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGjC6hRqT8wevXVACnPFfCKJSEXMEtxtvg0rqD82tutBIW45jNCPUu5TtYyFPpKj4iWfar46F_KERagGrAjnhsj_D6JDag2YLpkT6jII6aVP-bYp2SgSZgSvPVGj45pphyxhFfyV243_QA/s1600-h/image%255B24%255D"><img width="360" height="225" title="image" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj8WS7aE7ecdLSeGeJ6E5JP5ay3GQYHBuqNQkhYyb6uHFzsfp0NQYU20LE2SHcMnzKG-THCii7Gay82ddYghj1D80aRp5qx72DUImkJB2I49pIwUVI6v0SNg8jzoUO7ZTusfvok6Idci_B/?imgmax=800" border="0"></a></p><p>場合によってはこのように、実行失敗した結果も取得できます。この場合は、error として、エラーコードとメッセージが含まれています。</p><p>この API を利用することで、LogicFlow がいつ実行されてその結果はどうだったのか、また結果を取得するための URL も値として返却されていますので、ポータル上で確認できる情報はすべてこれを起点にして確認が可能です。</p>Ahfhttp://www.blogger.com/profile/01553064540426163049noreply@blogger.com0tag:blogger.com,1999:blog-3357313501722746592.post-16564214914042185402018-06-18T15:34:00.001+09:002018-06-18T15:55:33.725+09:00Logic Apps / Flow で長い時間が必要な処理に対応する<p>とある<a href="https://twitter.com/normalian" target="_blank">人</a>から「Logic Apps のタイムアウト 120 秒、なんとかならんですか」という質問が飛んできたので、面白そうなのもあり試してみました。</p><a name='more'></a> <p>仕様として Logic Apps のアクションにはタイムアウト制限が付いて回ります。コネクタによって若干の違いはあるかもしれませんが、基本的には <a href="https://docs.microsoft.com/ja-jp/azure/logic-apps/logic-apps-limits-and-config" target="_blank">120 秒が一つの制限</a>として存在しています。そのためそれを超える時間が必要な処理においては、<a href="https://docs.microsoft.com/ja-jp/azure/logic-apps/logic-apps-create-api-app#async-pattern" target="_blank">非同期パターン</a>を用いる必要があるので、Logic Apps だけでその状況を試してみました。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWnza7T5Y70Q_dgE5eE278uFTkl__YtgTW4BD3xZsNYbsZgN8mt8-4iB26XvSymjG1uT0lnwGuAjuo3qFWodxdzGy9gjjy3dIBHLLHreosjvwptqjsYw8fp0UlLsmaPYx-CFHvoQMYojOd/s1600-h/image_thumb20%255B2%255D"><img width="360" height="266" title="image_thumb20" style="margin: 0px; border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image_thumb20" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioZXtPjYNDxODPL_Cpi598gPeDgIYjMmMqkwGhe1mzdPqqYcj1gZkHd7VgBlokVYixFe07qVCmQqkIMYZvOhYkPjopgtjoksyAi530i0lWyiJJvNAA1O3JnWKrugngUKjlxdQB4QjS4rZ0/?imgmax=800" border="0"></a></p><p>大本となる LogicFlow をこのように作成します。イメージとしては、ここで HTTP にて呼び出す処理が長時間必要なものです。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPAA2u1oDpankXLns2IAyUIqJTLXwE0gkwnEqzxKKz9k5TJktqu5_wJnB4vGtIpKvmXl5-VkBophcNc5Yz6C6xIWPnopQsgVKhRLZUkDpgyQ7DQ5gxfOEH3_PiP5odGVmIRKAoZU0kgEcG/s1600-h/image_thumb23%255B2%255D"><img width="360" height="428" title="image_thumb23" style="margin: 0px; border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image_thumb23" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSNNKdjMcIpnTL_sno-goRz44mPW1Fzmdh3u2sz56ZjJnrMvRT-ubR6srchYHMf8Q-L6mT4YuNPdiSKShA3664A6tYY8u4XUwKGWQ9Ij3O_d_Ibe45nLsoh6t8PyBa1A_9Bj5RrqbInh1q/?imgmax=800" border="0"></a></p><p>まず呼び出される LogicFlow はこのような形にします。ここで応答アクションとして、retry-after に再試行秒数を、location に処理状況を確認するために呼び出してほしい URL をセットします。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhb1svwgpkxkGeLgTMA_wcGfDo1v-2fbkXBLmIPuIEPRZAnx8Khqa-hvP2VFynuf28mYZ55XrdbJKyexTSKc_zahTjJwurjmqtrFbYdsc0ZRfR7rRb74WStq0hR9goHi5XnUb9881S2Z3AN/s1600-h/image_thumb26%255B2%255D"><img width="360" height="272" title="image_thumb26" style="margin: 0px; border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image_thumb26" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOlDqMxLMcP8m5_8PZwsvh7sIrSIzLGlNTFNQ0MIKr13Ho-9fTlpfgkq2M7bUqr9kig8j0HQm3RTB1tVnJ3-yHo5Gpey5aUjd_cShs0dtd47jfaXH9ck8rg7K7Dl1G60JPZYjR8Da9pQCY/?imgmax=800" border="0"></a></p><p>最後に処理状況を戻すための LogicFlow をこのような形で作成します。お試しだったので、現在時刻をみて適当なタイミングであれば結果として 200 を、そうでなければ 202 としてまた状況確認用の URL を返却するものです。なお、この時の HTTP Request トリガですが、GET でアクセスできるようにする必要があります。Logic Apps の仕様として、location で指定された URL には GET でアクセスする、というのがあるためです。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVC0aQNtOCBWoz5MSWj6QDJG3gMd3zyyLxVubirOcX-voaKnOot97beHFklKeVzOYU1Bhvnm84nvakDsD_1DXw4NORrNPZEPxOsYHBw4xM6dVLH2YmU1sf1tQrH1WAzrQyq29tVC2Bb5Mw/s1600-h/image_thumb16%255B2%255D"><img width="360" height="116" title="image_thumb16" style="margin: 0px; border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image_thumb16" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY6H6byS-uVGVysr7pUUkdD27AAJmKAWhCesf-yIswggjpVs7t3tovkJgdLiVJ3GA-5QeHmeQsNMM86UfqP_0kOEV76-AZXR9jBKdcJkyD8gk_NyBWRvsKibH10qg2e7rcbgIJMszZPLM4/?imgmax=800" border="0"></a></p><p>大本の LogicFlow では、上記のように 120 秒を超えても実行が続いていたのがわかります。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcp79f8CtvGgSHS2tKjLbFyVrSJIs2EnM2q4atnDvrzGexLp6Dzc_l9DuI-M9YPLLpU0zJHvZ9lNm7crCVve8Zd82KWhT4xOf-sctpyYU8D3qmW1NZcl3hxsZZtYaHoTsv99UGVj8R7L8j/s1600-h/image_thumb17%255B2%255D"><img width="360" height="100" title="image_thumb17" style="margin: 0px; border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image_thumb17" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgldyR_iEw0IzL1g6m-rNFJuwtS13qILPgbLiNLZevWCCoeAKpPsjjlaGAA2R8IIavgfVvsFNSOesAVnrhNacr9c5INXWgFC1s5rlnB3MgJSDFrss3_SyTPz-xbbbVx-meZk6a8pRYpcdjw/?imgmax=800" border="0"></a></p><p>2 つめの LogicFlow では、最初に大本から呼び出された後は、呼び出された形跡が残っていないのがわかります。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZLBlbacxyoPGlcDCAHRrYVqpzFrcBkyXIF5vspE63lLJ79y4oY8Pu7xO7BwHL8aHr8zS4_J8LWLoWM88xSLtFYClhyphenhyphencouP-PH4mIphAlKt89DFtgltx4miX054Byp5I5LyKFwSxEGhutd/s1600-h/image_thumb11%255B2%255D"><img width="360" height="172" title="image_thumb11" style="border: 0px currentcolor; border-image: none; display: inline; background-image: none;" alt="image_thumb11" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjm8Y4Yvfij6E8CvYAGzRQ0LqwRxVfHA19wM3zO82tHD8V0HXrNaI4D7d2WzzioUaqOclUNNZPZkfZq11jpWbhYxOvMS0V78ctV4F-kcCJd4Say2pdhonibVue3u674qjcdWrIFNprXYYlN/?imgmax=800" border="0"></a></p><p>3 つめの状況を返却する LogicFlow では、このように Retry-after で指定した間隔でアクセスが行われているのがわかります。</p><p>このような形で、処理をくみ上げていくことで 120 秒を超える処理時間にも対応が取れます。実際に利用する場合は、2つ目の LogicFlow では 202 で応答を返した後に時間が必要な処理を開始、処理状況は別途ストレージなどに記録。3 つ目の LogicFlow では記録されている状況を確認しつつ、処理終了したならば結果を返却する、そういった形が適しているかと思います。</p><p>カスタム API を含めて構築すれば、もっと手軽に長時間必要な処理を扱う LogicFlow も作成できるものと思います。</p>Ahfhttp://www.blogger.com/profile/01553064540426163049noreply@blogger.com0