かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Azure Functions + Application Insights で POST されたデータのログを残す(C# & JavaScript)

liginc.co.jp

なんとなく見かけたので Azure でもやってみましょう。 Azure なら一番簡単に REST API 作るんだったら Azure Functions かなぁ。ログは Application Insights かなぁ。

Azure Functions のドキュメント - チュートリアル | Microsoft Docs

Azure Application Insights とは何か | Microsoft Docs

全体像

f:id:okazuki:20181113185007p:plain

Azure Functions は Lambda と違って HTTPTrigger というものがあって、Functions だけで REST API 作れます。 本格的に API として管理したければ API Management を使えば OK。

開発

じゃぁやってみましょう。本格的に開発するときはローカルに開発環境を作ってやるのが王道ですが、今回は使い捨てレベルくらいのものなのでポータル上で開発してみようと思います。

適材適所。

ポータルから Function App を作ります。作るときに一緒に Application Insights を作るのを忘れずに。 作り忘れた場合は、Application Insights を別途作って Function App のアプリケーション設定に Application Insights のキーを設定します。

作成画面はこんな感じ。

f:id:okazuki:20181113185648p:plain

そして関数を作っていく。今回は先ほど言ったようにポータル内を選ぶ。

f:id:okazuki:20181113185946p:plain

webhook + API を選ぶ。

f:id:okazuki:20181113190011p:plain

暫くまつと HttpTrigger1 というトリガーが出来るのでコードをさくっと以下のようにします。

#r "Newtonsoft.Json"

using System.Net;
using System.IO;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
    log.LogInformation(await new StreamReader(req.Body).ReadToEndAsync());
    return new OkObjectResult(new { message = "Powered by Azure" });
}

引数にわたってくる ILogger にログはけば Application Insights に行ってくれる。

実行ボタンを押すとテスト実行が出来ます。実行ボタンを押すと以下のようにログも出るのでちゃんと動いてることがわかります。

f:id:okazuki:20181113190605p:plain

関数の URL の取得で、この関数を叩くための URL がゲットできるので Postman あたりで叩いてみます。

f:id:okazuki:20181113190708p:plain

こんな感じ

f:id:okazuki:20181113190831p:plain

Application Insights のライブメトリクス ストリームを選ぶとリアルタイムでログが流れていくのが見えます。

f:id:okazuki:20181113191214p:plain

数分まつと Application Insights の検索からもひっかかるようになります。

f:id:okazuki:20181113191322p:plain

リクエストで出た一連のログとかも見れるので割と便利。

f:id:okazuki:20181113191439p:plain

JavaScript でもいける

C# になじみのない人は JavaScript でもいけます。

docs.microsoft.com

Function App 作るときにランタイムを dotnet ではなく JavaScript のほうを選んで作ると JavaScript でいけます。C# の時と同じ手順で webhook + API を作るといけます。

index.js の編集画面になるので以下のコードをさくっと書きましょう。 こういうのには個人的には JavaScript お手軽なので好きです。

module.exports = async function (context, req) {
    context.log(req.body);
    context.res = {
        body: { message: "Powered by Azure." }
    };
};

JavaScript のほうは引数にわたってくる context.log で出力した内容が Application Insights に行きます。

Postman などで叩くと同じようにライブメトリクス ストリームや検索でリクエストのボディを確認できるようになります。

f:id:okazuki:20181113192248p:plain

f:id:okazuki:20181113192319p:plain

まとめ

今回は JavaScript 本当に簡単でいい。(今回の例では C# ちょっとめんどい)

触ってみたいと思った人は

最近できた Microsoft Learn を使うと実際の Azure 環境を無料でクレカ不要で学習用だけに使うことが出来るので、そこの Azure Functions あたりのコースを流してみるのをお勧めします。

docs.microsoft.com