Azure FunctionsでEvent Webhookデータを受信する
- 2018年2月27日
- by 菊田 洋一
- Category: 技術ネタ
SendGridサポートエンジニアの菊田(@kikutaro_)です。本日のブログではMicrosoft AzureのFaaS(Function-as-a-Service)であるAzure Functionsを使って、SendGridのEvent Webhookデータを受信する方法についてご紹介します。
Event WebhookはSendGridのメール送信イベントを通知する仕組みです。通知を受信するには、HTTPのPOSTを受け取れるエンドポイントが必要ですが、Azure Functionsを利用すると簡単に作成できます(※1)。
実際にAzure FunctionsでEvent Webhookのデータを受信した結果は次のとおりです。
受信したデータは関数で処理した後、出力バインドを使って他の処理へ繋げることもできます。(ちなみに出力バインドにはSendGridも用意されています ※2)
それでは、具体的な設定方法についてご紹介します。
- Microsoft Azureのポータルから「リソースの作成」で「Function App」を選びます。
- アプリ名などの必要情報を入力して環境を作成します。今回OSはプレビュー版のLinuxを選びました。
- しばらく待つと次のような画面が表示されます。関数の横にある「+」を押します。
- 関数を呼び出すためのトリガーを選択します。今回はHTTPエンドポイントをトリガーとするため、HTTP triggerを使います。「webhook + API」を選択して、言語は「C#」を選択します。
- 関数の処理を記述します。簡易的なエディタですが、ブラウザ上でコードを記述できます。
- 受信したリクエストのメッセージボディをログコンソールに出力する処理を実装します。今回は以下のコードで試しました。
run.csxusing System.Net; public static void Run(HttpRequest req, TraceWriter log) { log.Info(new StreamReader(req.Body).ReadToEnd()); }
- 保存してコンパイル成功のメッセージが出たら動作確認します。Azure Functionsではコンソール上でリクエストの送信ができます。画面右側のパネルにある「テスト」でメッセージボディに文字を入力してリクエストを発行します。
- 成功するとコンソールログに受信したリクエストの内容が表示されます。
以上でAzure Functions側の準備が整いました。
- 次にSendGridのEvent Webhookを設定します。設定するURLはAzure Functionsの「関数のURLの取得」で確認できます。
URLをコピーします。
- SendGridの「Mail Settings」にある「Event Notification」でURLを設定します。設定が終わったら「Test Your Integration」ボタンを押して、テスト用のイベントデータを送信します。
次のように受信を確認できたら動作確認完了です。SendGridでメールを送信して、是非実際のイベントデータを確認してみてください。
なお、Azure Functionsの出力バインドにあるAzure Blob Storageを使うとBlob形式のログ保存も簡単にできます。出力バインドを設定するfunction.jsonに従って、コードを次のように記述するだけです。
function.json
{ "bindings": [ { "authLevel": "function", "direction": "in", "methods": [ "get", "post" ], "name": "req", "type": "httpTrigger" }, { "connection": "funceventstorage_STORAGE", "direction": "out", "name": "outputBlob", "path": "outcontainer/{rand-guid}", "type": "blob" } ] }
run.csx
using System.Net; public static void Run(HttpRequest req, [Blob("outcontainer/{rand-guid}", FileAccess.Write)] out string outputBlob, TraceWriter log) { outputBlob = new StreamReader(req.Body).ReadToEnd(); }
Blobの保存を確認します。
ダウンロードしてBlobファイルを開くと受信したデータが確認できます。
Azure Functionsで本格的に開発する場合はVisual Studioなどを利用して実装する必要がありますが、ちょっとした動作確認のコードであれば今回のようにブラウザだけでも十分そうです。
今後、他のFaaSも試していきたいと思います。
(※1)
Event Webhookを簡単に確認する方法は今回の方法以外にも色々あります。
- RequetBin
Webhookのデバッグ RequetBin - MongoDB
SendGridのイベントデータをMongoDBにストアする方法 - Microsoft Flow
SendGridのメール送信イベントをLINE Notifyで通知する ~Microsoft Flowによるノンプログラミング連携~ - ngrok
Webhookのデバッグ ngrok
(※2)
以下はSendGridの出力バインドに関する記事やブログです。