Microsoft Flowをコードに組み込む


TL;DR

Microsoft FlowのトリガをHTTPリクエストに設定すると、AWS LambdaみたいなFaaSっぽい使い方ができる。(戻り値を使うとかはできないけど・・・) 2019/3/30追記: 戻り値を使うパターンは[応答]アクションを使えば実現できるそうです。r-wakatsukiさん、ありがとうございます!

また、デフォルトで登録されていない、任意のサービスに対応することができる。

Microsoft Flowって?

ノードベースプログラミングで簡単に操作のフローを自動化できる。
Slackやメール、Twitter等のアプリと連携が可能。
フリープランが存在し、月ごと750回まで実行可能 (2019/3/21現在)
https://japan.flow.microsoft.com/ja-jp/pricing

簡単な例 ( Hello World )

  1. トリガに[HTTP要求の受信時]を設定します。
  2. トリガに好きなフローを繋げる。ここではSlackにHello Worldを投稿させます。
  3. 生成されたURLにHTTPリクエストします。メソッドはデフォルトでPOSTです。powershellだと以下のようなコードで発火できます。
helloworld.ps1
Invoke-RestMethod -Uri "https://prod-27.japaneast.logic.azure.com:443/XXXXXXXXXXXXXXXXXXXXXX" -Method POST

引数を渡す例 ( Slackに任意の内容を投稿 )

トリガに[HTTP要求の受信時]を設定する際、JSONスキーマを指定すると、受け取ったJSONのデータをフロー内で扱うことができます。(ペイロードをアップロードすると、自動でスキーマ生成してくれます。)

  1. 以下のsample_payload.jsonから[HTTP要求の受信時]にスキーマを生成します。
  2. Slackのチャネル名で[カスタム値の入力]を選択し、channelを選択します。メッセージテキストも同様にし、messageを選択します。

  3. 生成されたURLにHTTPリクエストします。powershellだとhelloworld2.ps1のようなコードで発火できます。今度はrandomにhello worldを投稿します。

sample_payload.json
{
    "channel":"general",
    "message":"hello world"
}
helloworld2.ps1
Invoke-RestMethod -Uri "https://prod-27.japaneast.logic.azure.com:443/XXXXXXXXXX" -Method POST -Body ( @{"channel"="random";"message"="hello world"} | ConvertTo-Json) -ContentType 'application/json'

サービス連携 ( GitHub : forced push通知 )

Microsoft Flowはアプリケーション連携が豊富で便利だけど、GitHubにforced pushされたとき用のトリガは存在しないので、自分で作っていくしかありません。

  1. github webhookのサンプルペイロード( https://gist.github.com/gjtorikian/5171861 )から[HTTP要求の受信時]にスキーマを生成します
  2. 条件フローを作成し、[forced]trueに等しいとき、という設定にします。
  3. [はいの場合]にSlackを繋げてメッセージの投稿を設定します。
  4. 最後に、GitHubのWebhookに[HTTP要求の受信時]から生成されたURLを設定します。

これでforced pushされたときに、Slackに通知が飛びます。