minato128 blog

minato128の公開メモ帳です。

「一休✕bitFlyer C#をつかったサービス開発の裏側」で「新メール配信基盤への移行」の話をしました

一休✕bitFlyer C#をつかったサービス開発の裏側 でお話しました。

speakerdeck.com

この案件は主に @shibayan と一緒に進めていたもので、 最近キリのいいところまで終わったので社内向けの概要資料を兼ねてまとめました。 *1 内容に関しては概ね好評で参考になったという意見が多くてよかったです。 実際にあった質問は中井さんがツイートしてくれていたので引用します。感謝。

  • 質問1 なぜSendGridをしたか?

  • 質問2 なぜ通知だけ Azure Functions?

*1:ちなみに社内向けにはイベントの前に発表し、ツッコミがあった部分を修正してあります

logentries の Alert を Azure Functions で加工してから Slack に送ってみる

そもそも logentries は標準で Slack 通知をサポートしているのですが、raw log (JSONとか) がそのまま通知されるだけなので、アラートがきていることはわかっても何が起きたのかよくわからないということがあります。 そこで Azure Functions で logetries Alert Webhook を受け取って、少し加工してから Slack に通知してみました。 こういったちょっとしたものは AWS API Gateway + Lambda で作るより Azure Functions のほうが楽でいいですね。

まず、ここで飛んでくる JSON の仕様を確認して、普通に Azure Functions を作成して動作確認してみたのですが動きませんでした。

docs.logentries.com

The content type of the message is encoded in application/x-www-form-urlencoded.

よくみたら、Content Type が application/json ではないですね。 手動で POST してみたら確かに 415 が帰ってきて Azure Functions が起動するところまで到達しませんでした。

gyazo.com

function.json の webHookType で選べる値に適切なものが見つからなかったのでぐぐったら項目ごと消せばよいとのこと。その通りにしたら確かに動きました。ちなみに値を空にしても動きました。 設定がなかったら、Content Type をチェックしない仕様なんですね。

{
  "bindings": [
    {
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "webHookType": ""
    },
    {
      "type": "http",
      "direction": "out",
      "name": "res"
    }
  ],
  "disabled": false
}
#r "System.Web"
#r "Newtonsoft.Json"

using System;
using System.Web;
using System.Net;
using System.Configuration;
using System.Threading.Tasks; 
using Newtonsoft.Json;


public static async Task<object> Run(HttpRequestMessage req, TraceWriter log)
{
    log.Info($"Webhook was triggered!");
    var formData = await req.Content.ReadAsStringAsync();
    var list = HttpUtility.ParseQueryString (formData);
    var payload = list["payload"];
    log.Info(payload);

    dynamic data = JsonConvert.DeserializeObject(payload);

    // edit data

       
    // post slack


    return req.CreateResponse(HttpStatusCode.OK, new {
    });
}