Logic Apps から Slack に通知する

以前に Bot Framework で Slack の bot を構成するを書きましたが、
今回はこの素因数分解の bot を Logic Apps で作成してみます。
自然数をランダムに生成して素因数分解してその結果を Slack に通知する、
というのを 10 分間隔で実行することにします。

まず、Azure ポータルで Logic App を作成します (手順は初めてのロジック アプリの作成を参照)。
名前は、グローバルに一意である必要はありません。

次に、デザイナーでロジックを追加していきます。
完成したワークフローを先に示します。

 

以下は、各アクションについての説明や注意点です。

(1) 繰り返し (Recurrence)
最初のトリガーとして [繰り返し] を選択し、10 分間隔で実行されるようにしています。

(2) Azure Functions
アクションとして [Azure Functions] を選択すると、同じアカウント内で作成済みの関数を選択できます。
([HTTP] というアクションで URL を指定する方法もあります。)

Logic-Apps-Functions

ここでは、前回の Azure Functions で Web API を作成するで用意した Azure Functions の 2 つの関数を利用します。

(3) データ操作 – JSON の解析
前の関数からは

{ "result": "5439 = 3 ・ 7^2 ・ 37" }

という形式の JSON が返るため、あとで必要になる文字列 (result プロパティの値) を取り出すためにこれを解析します。
[スキーマ] は、この JSON を入力すれば作成されます。

(4) Slack – 投稿メッセージ
投稿先のチャネルとメッセージを指定します。
初回の設定時にはアカウントを認証する必要があります。Logic Apps 上の画面で失敗する場合は、[API 接続] から設定できます。

Logic-Apps-Slack

 

以上で完成です。
下図は Slack のスクリーン ショットです。

Factorization-Slack

 

前回: Azure Functions で Web API を作成する

参照
Flow、Logic Apps、Functions、WebJobs の比較
Logic Apps とは
Azure Functions を使用したロジック アプリのカスタム コードの追加と実行

Bot Framework で Slack の bot を構成する

Azure Functions で Web API を作成する

Azure Functions では、単機能の Web API やバッチを作成することができます。
とくに、Web アプリケーション全体を構築する必要がなく、開発者が管理するのは関数のソースコードのみで済むという利点があります。

Azure Functions で関数を作成するための詳細の手順は Azure Portal で初めての関数を作成するに記載されていますが、
概略は以下の通りです。

  • Function App を作成する
    • この段階では、Web サイトが作成されるのみ
    • Web サイトとして作成されるため、名前はグローバルに一意でなければならない
  • 関数を作成する
    • 一つの Function App に、複数の関数を作成できる
    • シナリオに応じてテンプレートを選択する
    • 言語が C# の場合、関数は、拡張子が「.csx」のファイルで表される
    • このポータル上で、コードの修正とテストができる

Azure-Functions-App  Azure-Functions-Files

 

以下では、Web API を作成するときに選択できるテンプレートについて書いていきます。
Web API を作成するには、「HTTP トリガー」を利用することになります。

Azure-Functions-Templates-API

HTTP トリガーでは、以下のことができます。

  • 利用できる HTTP メソッド (GET, POST など) を指定できる
  • 「Shops/{id:int?}」 のように URL ルーティングを指定できる (パラメーターは Run メソッドの引数になる)
  • 応答の本文は JSON になる。new { message = "Hello." } のようなオブジェクトも指定できる

HTTP トリガーには、以下のテンプレートがあります。

  • HttpTrigger
    • 汎用の HTTP トリガー
  • HttpTriggerWithParameters
    • パラメーターとしてクエリ文字列を利用する場合のテンプレート
    • HTTP メソッドは GET のみ有効
  • GenericWebHook
    • Webhook のテンプレート
    • 規約上は POST で本文に JSON を送るものだが、かまわず通常の HTTP トリガーとしても使えるっぽい

 

例として、簡単な Web API を作ってみます。

こちらはランダムに自然数を生成するもので、入力データを必要としていません。
HttpTrigger テンプレートから作っています。

using System.Net;
static readonly Random random = new Random();
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
log.Info("C# HTTP trigger function processed a request.");
var n = random.Next(1, 10000);
return req.CreateResponse(HttpStatusCode.OK, n);
}
view raw run.csx hosted with ❤ by GitHub

次は、入力された自然数を素因数分解する関数です。
以前に Bot Framework で Slack の bot を構成するで作成したメソッドを再利用しています。
こちらは GenericWebHook テンプレートから作っており、要求の本文に { "n": 123 } のような JSON が渡される想定です。

using System.Net;
public static async Task<object> Run(HttpRequestMessage req, TraceWriter log)
{
log.Info($"Webhook was triggered!");
dynamic data = await req.Content.ReadAsAsync<object>();
return data?.n == null
? req.CreateResponse(HttpStatusCode.BadRequest, new { error = "Pass n property in the input object." })
: req.CreateResponse(HttpStatusCode.OK, new { result = Factorize(data.n.ToString()) });
}
public static string Factorize(string text)
{
int i;
if (!int.TryParse(text, out i)) return "Send an integer.";
var factorized = Factorize2(Math.Abs(i));
var factorizedString = string.Join("", factorized.Select(p => $"{p.Key}{(p.Value == 1 ? "" : $"^{p.Value}")}"));
return $"{i} = {(i >= 0 ? "" : "-")}{factorizedString}";
}
public static Dictionary<int, int> Factorize2(int x)
{
if (x <= 1) return new Dictionary<int, int> { { x, 1 } };
var d = new Dictionary<int, int>();
for (var i = 2; ; i++)
{
while (x % i == 0)
{
if (d.ContainsKey(i))
d[i]++;
else
d[i] = 1;
x /= i;
if (x == 1)
return d;
}
}
}
view raw run.csx hosted with ❤ by GitHub

本文がテキストの場合は req.Content.ReadAsStringAsync() としてもよいですが、JSON の場合は

dynamic data = await req.Content.ReadAsAsync<object>();

とすればよいでしょう。

また、クエリ文字列からの入力は req.GetQueryNameValuePairs() で読み込むことができます。

 

なお、下図はデータと連携したバッチを作成するときのテンプレートです。

Azure-Functions-Templates-Data

 

次回は、これらの関数を使って Logic Apps で Slack bot を作ってみます。

次回: Logic Apps から Slack に通知する

作成したサンプル
AzureFunctionsSample (GitHub)

参照
Azure Functions の概要
Azure Functions における HTTP と Webhook のバインド

Bot Framework で Slack の bot を構成する

カテゴリー: クラウド. タグ: . 1 Comment »