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の出力バインドに関する記事やブログです。





