5. イベント処理用クラウドファンクションの実装

イベント処理用のクラウドファンクションを実装する際の、注意事項について説明します。

クラウドファンクション一般については、Cloud Functions Developpers Guide を参照してください。

5.1. 引数の型について

イベント処理用のクラウドファンクションは、イベント(JSON形式)を第一引数で受け取る必要があります。

そのため、第一引数の型はJSONとの互換性が必要です。 Javaの場合は、 Map<String, Object> 型とするのが普通です。

package com.example;

import com.nec.baas.cloudfn.sdk.*;

public class Hello {
    public static void handleEvent(Map<String,Object> event, Context context) {
        // イベント処理コードをここに書く

        context.succeed("ok");
    }
}

JavaScriptの場合は、第一引数に Object 型のオブジェクトが引き渡されます。

'use strict';

exports.handleEvent = (event, context) => {
    // イベント処理用コードをここに書く

    context.succeed('ok');
};

5.2. レスポンスについて

イベント処理用のクラウドファンクションでは、レスポンスの値は意味を持ちません。

ただし、レスポンスを返さないと、イベント処理がタイムアウトしたと見なされてエラーログが記録されます。 そのため、イベント処理終了後には、 context.succeed("ok"); を必ず呼ぶようにしてください。

5.3. クライアントコンテキストについて

イベント処理用のクラウドファンクションでは、クライアントコンテキスト(context.clientContext() の値)に注意が必要です。

通常のクラウドファンクションでは、API Gateway経由でファンクションが呼び出されるため、 クライアントコンテキストにはAPI GatewayのREST APIを呼び出したクライアントの情報が格納されています。

しかし、イベント処理用のクラウドファンクションでは、 モバイルバックエンド基盤自身がファンクションを呼び出すので、クライアントは存在しません。 そのため、クライアントコンテキストにはダミーの値が格納されています。 具体的な値は、下記のとおりです。

Method Value
contentType() "application/json"
function() JSON
headers() "Content-Type: application/json"
method() "POST"
nebula() Special value (See below.)
pathParams() Empty
queryParams() Empty
uri() "dummy://dummy/dummy"

5.4. Nebulaコンテキストについて

イベント処理用のクラウドファンクションでは、Nebulaコンテキスト(context.nebula() の値)に注意が必要です。

通常のクラウドファンクションでは、API Gateway経由でファンクションが呼び出されるため、 NebulaコンテキストにはAPI GatewayのREST APIを呼び出したクライアントと同等のNebulaコンテキストが格納されています。

しかし、イベント処理用のクラウドファンクションでは、 モバイルバックエンド基盤自身がファンクションを呼び出すので、クライアントは存在しません。 そのため、Nebulaコンテキストには特殊な値が格納されています。

特殊な値を格納している理由は、 イベント処理用のクラウドファンクション内からでも、Nebulaサーバの各機能を呼び出せるようにするためです。 具体的な値は、下記のとおりです。

Nebulaコンテキストのテナント値(tenant())には、イベントサブスクリプションを登録したテナントが格納されています。

Nebulaコンテキストのアプリ値(appId()appKey())には、テナント内から選んだ何らかのアプリが格納されます。

Nebulaコンテキストのユーザー値(user())は null を返します。

Nebulaコンテキストはマスター権限を持ちます。

注釈

イベント駆動を利用するテナント内には、少なくとも1つの有効なアプリが必要です。 これは、Nebulaコンテキストのアプリ値に有効な値を格納する必要があるためです。 なお、テナント内に複数の有効なアプリが存在する場合、それらのうちから一つが自動的に選択されて格納されます。