Azure Functions では、単機能の Web API やバッチを作成することができます。
とくに、Web アプリケーション全体を構築する必要がなく、開発者が管理するのは関数のソースコードのみで済むという利点があります。
Azure Functions で関数を作成するための詳細の手順は Azure Portal で初めての関数を作成するに記載されていますが、
概略は以下の通りです。
- Function App を作成する
- この段階では、Web サイトが作成されるのみ
- Web サイトとして作成されるため、名前はグローバルに一意でなければならない
- 関数を作成する
- 一つの Function App に、複数の関数を作成できる
- シナリオに応じてテンプレートを選択する
- 言語が C# の場合、関数は、拡張子が「.csx」のファイルで表される
- このポータル上で、コードの修正とテストができる

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

HTTP トリガーでは、以下のことができます。
- 利用できる HTTP メソッド (GET, POST など) を指定できる
- 「Shops/{id:int?}」 のように URL ルーティングを指定できる (パラメーターは Run メソッドの引数になる)
- 応答の本文は JSON になる。new { message = "Hello." } のようなオブジェクトも指定できる
HTTP トリガーには、以下のテンプレートがあります。
- HttpTrigger
- 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); |
|
} |
次は、入力された自然数を素因数分解する関数です。
以前に 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; |
|
} |
|
} |
|
} |
本文がテキストの場合は req.Content.ReadAsStringAsync()
としてもよいですが、JSON の場合は
dynamic data = await req.Content.ReadAsAsync<object>();
とすればよいでしょう。
また、クエリ文字列からの入力は req.GetQueryNameValuePairs()
で読み込むことができます。
なお、下図はデータと連携したバッチを作成するときのテンプレートです。

次回は、これらの関数を使って Logic Apps で Slack bot を作ってみます。
次回: Logic Apps から Slack に通知する
作成したサンプル
AzureFunctionsSample (GitHub)
参照
Azure Functions の概要
Azure Functions における HTTP と Webhook のバインド
Bot Framework で Slack の bot を構成する