Azure Function WebAPI <-> Eventhub連携


概要

システムのIFとしてWeb APIはデファクトスタンダードとなっています。
今回はFunctionという短時間だけCPUリソースを使うものに対して、Azureも推奨している非同期APIを実装していきます。

HTTPの上に構築されるWebは同期的な処理です。
ここでいう同期的とはクライアントがリクエストを送り、サーバがレンスポンスを返すまでがHTTPの一つの処理であることを指します。
非同期APIとは一旦処理待ちキューに情報を追加したタイミングでレスポンスを返します。
処理の結果を気にする場合は別途用意するステータス確認API等で確認を行います。
非同期APIのメリットは時間がかかる処理も時間のかからない処理もクライアントに待ってもらう必要がなく、負担をかけません。
この方式はAzure Functionsにとっても都合が良く、基本的に低スペック・リソース上で稼働するFunctionsに重たい動作は向かず、即座にレスポンスできることに専念させるべきです。
キューにためさえすれば、後の調理方法はどうとでもなります。

それではHTTPとして情報をもらい、Eventhubに格納するまでを実装していきます。

実装

Functionsの作成

まずはFunctionsを作成します。
ここでは言語をjavascriptとして話を進めます。
一番基本の形である、HTTP triggerのエンドポイントを作成します。
作成後、関数名を展開し、「統合」ページに行きます。
今回はHTTPを入り口として、出口としてEventhubに情報を送信したいので、
出力欄にある「新しい出力」をクリックします。
「イベントハブ」が選択できると思いますので、選択し接続情報を入力します。
接続情報は作成してあるEventhubに合わせて適宜入力してください。
ソースコードとして必要な情報はイベントパラメータ名です。
context.bindings.イベントパラメータ名としてEventhubにアクセスします。

また、固定の情報をEventhubに入れるのも変化ないので、
今回は初めから追加されている入力の「HTTP(req)」にルートテンプレートを設定して情報を追加します。
簡単にusers/{userId}としてみます。

HTTPメソッドは作成と削除を想定し、POSTとDELETEを選択しておきます。

ソースコード

上記設定が完了後、後はソースコードを記述していきます。
例外処理等を考えないソースコードを以下に貼ります。

module.exports = function (context, req) {
    context.log(`req: ${JSON.stringify(req, null, "  ")}`);
    var event = {
        id: req.params.userId, // ルートテンプレートは`req.params`で参照できます
        type: req.method, // 'POST' or 'DELETE'
    };

    // Eventhubへの追加はイベントパラメータ名に対して、情報を代入してあげるだけでよい
    context.bindings.outputEventHubMessage = event;

    // HTTPの後処理も行う
    context.res = {
        body: event
    };
    context.log(`res: ${JSON.stringify(event, null, "  ")}`);
    context.done();
};

以上です。
簡単でした。