しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Functions を使って Triggered WebJobs が失敗した時に Slack へ通知を投げる

最近は Azure WebJobs を使うことがさらに増えてきて、WebJob の実行に失敗した時に Dashboard を見るのがめんどくさくなったので、Azure Functions を使って Slack に通知するようにしてみました。

Kudu には Triggered WebJob の実行が完了したタイミングで WebHook を叩く機能があるので、WebHook として Azure Functions を実行するようにして簡単に扱えるようにします。

f:id:shiba-yan:20160715234813p:plain

なので、まずは Azure Functions を用意して、さらに Generic WebHook な Function を作成しておきます。

Function を作成すると WebHook 用の URL が作成されるので、Kudu の Web Hooks ページから Event として TriggeredJobFinished を選んで URL を追加します。

f:id:shiba-yan:20160715234608p:plain

これで Triggered WebJob の実行が終わったタイミングで WebHook が叩かれますが、成功した時にも WebHook は叩かれるので Payload を解析して失敗した時だけ Slack に通知するようにします。

具体的には Payload に含まれている status が Failed の時だけ処理するようにコードを書きます。

#r "Newtonsoft.Json"

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;

using Newtonsoft.Json;

public static async Task<object> Run(HttpRequestMessage req, TraceWriter log)
{
    var jsonContent = await req.Content.ReadAsStringAsync();
    dynamic data = JsonConvert.DeserializeObject(jsonContent);

    if (data.status != "Failed")
    {
        return req.CreateResponse(HttpStatusCode.OK);
    }
    
    var payload = new
    {
        username = "webjobsbot",
        attachments = new object[]
        {
            new
            {
                pretext = $"*[{data.job_name}]* is Failed. <{data.output_url}|See output logs>",
                text = $"*Start Time*: {data.start_time}\n*End Time*: {data.end_time}\n*Trigger*: {data.trigger}",
                color = "danger",
                mrkdwn_in = new[] { "pretext", "text" }
            }
        }
    };
    
    var endpoint = "https://hooks.slack.com/services/***";
    var content = new FormUrlEncodedContent(new Dictionary<string, string>
    {
        { "payload", JsonConvert.SerializeObject(payload) }
    });
    
    var client = new HttpClient();
    
    await client.PostAsync(endpoint, content);

    return req.CreateResponse(HttpStatusCode.OK);
}

コードはちょっと長くなりましたが、半分は Slack で綺麗に表示する部分なので大したことはないです。

常に実行に失敗する WebJob を作成して、ポータルから実行すると Slack に通知が飛んできます。

f:id:shiba-yan:20160715234348p:plain

含まれているリンクをクリックすると、WebJob の実行ログが見れるようになっています。

同じように Kudu がサポートしている PostDeployment を使って、Slack にデプロイが完了したタイミングで通知とかも簡単に作れると思います。次は WebJobs SDK を使ってみます。