Azure FunctionsでEvent Webhookデータを受信する

Azure FunctionsでEvent Webhookデータを受信する

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のデータを受信した結果は次のとおりです。

Event Webhookのデータを受信結果

受信したデータは関数で処理した後、出力バインドを使って他の処理へ繋げることもできます。(ちなみに出力バインドにはSendGridも用意されています ※2

それでは、具体的な設定方法についてご紹介します。

  1. Microsoft Azureのポータルから「リソースの作成」で「Function App」を選びます。
     Microsoft Azureのポータルから「リソースの作成」で「Function App」を選択
  2. アプリ名などの必要情報を入力して環境を作成します。今回OSはプレビュー版のLinuxを選びました。
     環境を作成
  3. しばらく待つと次のような画面が表示されます。関数の横にある「」を押します。
     概要の画面
  4. 関数を呼び出すためのトリガーを選択します。今回はHTTPエンドポイントをトリガーとするため、HTTP triggerを使います。「webhook + API」を選択して、言語は「C#」を選択します。
     トリガーを選択
  5. 関数の処理を記述します。簡易的なエディタですが、ブラウザ上でコードを記述できます。
     関数の処理を記述
  6. 受信したリクエストのメッセージボディをログコンソールに出力する処理を実装します。今回は以下のコードで試しました。
     
    run.csx
     using System.Net;
    
    public static void Run(HttpRequest req, TraceWriter log)
    { 
        log.Info(new StreamReader(req.Body).ReadToEnd());
    }
    
  7. 保存してコンパイル成功のメッセージが出たら動作確認します。Azure Functionsではコンソール上でリクエストの送信ができます。画面右側のパネルにある「テスト」でメッセージボディに文字を入力してリクエストを発行します。
     動作確認
  8. 成功するとコンソールログに受信したリクエストの内容が表示されます。
     リクエストの内容
    以上でAzure Functions側の準備が整いました。
     
  9. 次にSendGridのEvent Webhookを設定します。設定するURLはAzure Functionsの「関数のURLの取得」で確認できます。
     SendGridのEvent Webhookを設定
    URLをコピーします。
     URLをコピー
  10. 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の保存

ダウンロードしてBlobファイルを開くと受信したデータが確認できます。

受信したデータの確認

Azure Functionsで本格的に開発する場合はVisual Studioなどを利用して実装する必要がありますが、ちょっとした動作確認のコードであれば今回のようにブラウザだけでも十分そうです。

今後、他のFaaSも試していきたいと思います。

(※1)
Event Webhookを簡単に確認する方法は今回の方法以外にも色々あります。

(※2)
以下はSendGridの出力バインドに関する記事やブログです。