Build 2016 報告会で LT した内容を記事にまとめておきます。
gooner.hateblo.jp
Azure Functions を利用して、SendGrid の Event Webhook から POST されたデータを受け取り、Azure DocumentDB に登録してみます。従来の方法については、過去の記事で書いていますので、Azure Functions との連携にポイントを絞ってまとめます。
gooner.hateblo.jp
Azure Functions を作成する
Azure ポータルから Azure Functions を作成します。テンプレートには、JavaScript の Generic - Webhook を使います。
Trigger の WebHook type を「Not a WebHook」に変更します。初期値の「Generic JSON」のままでは、SendGrid の Event Webhook の通知を受け取れずにかなり悩んだので、忘れずに変更しましょう。
続いて、Output に Azure DocumentDB を設定します。Database と Collection がなければ作るように設定し、Azure DocumentDB を作成します。作成に数分かかるので、Azure DocumentDB のステータスが Online になるまで待ちます。
最後に、POST された JSON データを Azure DocumentDB に Outputするように、コードを編集します。Document parameter name が「document」なので、bindings にリクエストのボディをセットするだけで OK です。
Event Webhook から POST する URL を設定する
SendGrid のダッシュボードで、Mail Settings メニューから Event Notification を Enabled します。HTTP POST URL には、Azure Function Urlを設定します。送信に失敗したメールアドレスの情報を取得したいので、Dropped、Deferred、Bounced のアクションを設定しました。
結果確認
存在しないメールアドレス(test@example.com)にメールを送信すると、Azure DocumentDB に JSON データが登録されます。Azure ポータルの Document Explorer から登録されたデータを確認できます。
まとめ
今までなら、ASP.NET Web API を実装して、Azure DocumentDB にログを転送するコードを書いて、Azure Web Apps にデプロイする手間が必要でしたが、Azure Functions ならサーバーをデプロイする必要もないですし、僅か数行のコードを書くだけです。まだ Preview ですが、面白いサービスなので、これからも使っていきたいです。
最後に、本当は、Azure Functions のコードを C# で書きたかったのですが、Azure DocumentDB に上手く Output できず、仕方なく Node.js を使いました。C# で Output する方法も調べておきたいところです。