ローカルでのファンクションの実行

ファンクションを本番環境にデプロイする前に、ローカルで実行してテストすることができます。ファンクションをローカルで実行するには、次のいずれかを使用します。

  • Cloud Functions シェル。このツールはあらゆるタイプのファンクション トリガーをエミュレートし、テストデータを使用してファンクションを呼び出すための対話型シェルを備えています。
  • Firebase CLI の firebase serve コマンド。このツールは HTTPS ファンクションをエミュレートし、ローカル ファンクションをトリガーするための URL を提供します。

どちらのツールでも、アクティブなセッション中に行ったコードの変更はエミュレータによって自動的に再読み込みされます。コードをトランスパイル(TypeScript、React)する必要がある場合は、必ずエミュレータを実行する前にトランスパイルしてください。

管理者の認証情報を設定する(オプション)

ファンクションのテストにおいて、Firebase Admin SDK を介して他の Firebase API や Google API とやり取りすることを希望する場合は、管理者の認証情報を設定しなければならない場合があります。次の点に注意してください。

  • Cloud Firestore と Realtime Database のトリガーにはすでに十分な認証情報があるため、追加の設定は必要ありません
  • Firebase API(Authentication や FCM など)、Google API(Cloud Translation や Cloud Speech など)といった他のすべての API では、このセクションで説明する設定手順を実行する必要があります。これは、Functions シェルと firebase serve のどちらを使用している場合でも当てはまります。

エミュレートするファンクション(Cloud Firestore と Realtime Database 以外)の管理者認証情報を設定するには:

  1. Google Cloud Console の [サービス アカウント] ペインを開きます。
  2. App Engine default service account が選択されていることを確認し、右側のオプション メニューで [キーを作成] を選択します。
  3. プロンプトが表示されたら、キーのタイプとして [JSON] を選択し、[作成] をクリックします。
  4. ダウンロードしたキーを参照するように Google のデフォルトの認証情報を設定します。

    UNIX

    $ export GOOGLE_APPLICATION_CREDENTIALS="path/to/key.json"
    
    $ firebase functions:shell
    
    OR
    
    $ firebase serve --only functions
    

    Windows

    $ set GOOGLE_APPLICATION_CREDENTIALS=path\to\key.json
    
    $ firebase functions:shell
    
    OR
    
    $ firebase serve --only functions
    

上記の手順を完了すると、ファンクション テストで Admin SDK を使用して Firebase API や Google API にアクセスできるようになります。たとえば、Authentication のトリガーをテストする場合は、エミュレートするファンクションで admin.auth().getUserByEmail(email) を呼び出すことができます。

コマンドラインから HTTP ファンクションを提供する

Firebase CLI を使用すると HTTP ファンクションをローカルで実行できるため、本番環境にデプロイする前に関数をテストできます。

  1. Firebase CLI と firebase-functions SDK の両方が最新バージョンであることを確認してください。これらを更新するには、ローカル プロジェクトの functions ディレクトリから次の 2 つのコマンドを実行します。

    npm install -g firebase-tools
    npm install --save firebase-functions@latest
  2. プロジェクト ディレクトリのルートから次のコマンドを実行して、Firebase プロジェクトをローカルで実行します。

    このコマンドは、ローカルにホストされた URL でホスティングとファンクションをエミュレートします。

    firebase serve
Cloud Functions を使用して Firebase Hosting の動的コンテンツを生成する場合、firebase serve はホスティングのプロキシとしてローカル HTTP ファンクションをデフォルトで使用します。Firebase Hosting と Cloud Functions の構成オプションの詳細については、Firebase CLI リファレンスをご覧ください。

Cloud Functions シェルを使用してファンクションを提供する

Cloud Functions シェルは、あらゆるタイプのファンクション トリガーをエミュレートし、テストデータを使用してファンクションを呼び出すための対話型シェルを備えています。オプションはファンクションのタイプによって異なりますが、基本的な使用形式は次のとおりです。

myFunctionName(data, options)

data パラメータは、Realtime Database トリガーと PubSub トリガーでは必須で、他のすべてのファンクション タイプではオプションです。また、オプションの options パラメータは、Realtime Database ファンクションでのみ有効です。

必要に応じて、ローカル ファイルからテストデータを読み込むことができます。これを行うには、ファイルを変数として保存し、それを使用して次のファンクションを呼び出します。

var data = require('./path/to/testData.json');
myFunction(data);

Cloud Functions シェルをインストールして設定する

この機能を使用するには、firebase-tools のバージョン 3.11.0 以降と firebase-functions SDK のバージョン 0.6.2 以降が必要です。この両方を更新するには、プロジェクトの functions/ ディレクトリで次のコマンドを実行します。

npm install --save firebase-functions@latest
npm install -g firebase-tools

カスタム ファンクションの構成変数を使用していない場合は、次のコマンドでシェルを実行します。

firebase functions:shell

カスタム ファンクションの構成変数を使用している場合は、最初にカスタムの構成を取得するコマンドを実行(functions ディレクトリ内で実行)してから、シェルを実行します。

firebase functions:config:get > .runtimeconfig.json
# If using Windows PowerShell, replace the above with:
# firebase functions:config:get | ac .runtimeconfig.json
firebase functions:shell

HTTPS ファンクションを呼び出す

シェルで HTTPS ファンクションを呼び出す場合、使用方法は request NPM モジュールと同じですが、エミュレートするファンクションの名前で request を置き換えてください。次に例を示します。

# invoke
myHttpsFunction()
myHttpsFunction.get()
myHttpsFunction.post()

# invoke at sub-path
myHttpsFunction('/path')
myHttpsFunction.get('/path')
myHttpsFunction.post('/path')

# send POST request with form data
myHttpsFunction.post('/path').form( {foo: 'bar' })

HTTPS 呼び出し可能ファンクションを呼び出す

HTTPS 呼び出し可能ファンクションをローカルで呼び出す場合は、適切なテストデータを提供する必要があります。

# invoke
myCallableFunction('test data')
myCallableFunction({'foo': 'bar'})

オプションで、Firebase-Instance-ID-token を 2 番目のパラメータとして渡すことができます。これには文字列を設定する必要があります。

# invoke with Instance ID token
myCallableFunction('test data', {instanceIdToken: 'sample token'})

context.auth のエミュレーションは現在利用できません。

Realtime Database ファンクションを呼び出す

Realtime Database ファンクションをローカルで実行する場合、適切なテストデータを提供する必要があります。つまり、一般的には、onCreate オペレーションでは新しいテストデータ、onDelete オペレーションでは古くなった削除されるデータ、onUpdate ファンクションまたは onWrite ファンクションではその両方を提供する必要があります。

# invoke onCreate function
myDatabaseFunction('new_data')

# invoke onDelete function
myDatabaseFunction('old_data')

# invoke onUpdate or onWrite function
myDatabaseFunction({before: 'old_data', after: 'new_data' })

before/after オプションに加えて、シェルにはパス内のワイルドカードをシミュレートするための params オプションが用意されています。

# mock wildcards in path, for example: if the path was input/{group}/{id}
myDatabaseFunction('data', {params: {group: 'a', id: 123}})

デフォルトでは、シェルは管理者権限で Realtime Database ファンクションを実行します。代わりに特定のエンドユーザーとして、または認証されていないユーザーとしてファンクションを実行するには、auth オプションを使用します。

# to mock unauthenticated user
myDatabaseFunction('data', {authMode: 'USER'})
# to mock end user
myDatabaseFunction('data', {auth: {uid: 'abcd'}})

Firestore ファンクションを呼び出す

Firestore ファンクションをローカルで実行する場合、適切なテストデータを提供する必要があります。つまり、一般的には、onCreate オペレーションでは新しいテストデータ、onDelete オペレーションでは古くなった削除されるデータ、onUpdate ファンクションまたは onWrite ファンクションではその両方を提供する必要があります。Firestore のデータは Key-Value ペアです。サポートされるデータ型を参照してください。

# invoke onCreate function
myFirestoreFunction({foo: ‘new’})

# invoke onDelete function
myFirestoreFunction({foo: ‘old’})

# invoke onUpdate or onWrite function
myFirestoreFunction({before: {foo: ‘old’}, after: {foo: ‘new’} })

before/after オプションに加えて、シェルにはドキュメント名のワイルドカードをシミュレートするための params オプションが用意されています。

# mock wildcards in document name, for example: if the name was input/{group}/{id}
myFirestoreFunction({foo: ‘new’}, {params: {group: 'a', id: 123}})

シェルは Firestore のファンクションを常に管理者権限で実行します。したがって、作成 / 更新 / 削除のイベントは管理者ユーザーによって実行されたように見えます。

PubSub ファンクションを呼び出す

PubSub ファンクションでは、Buffer インスタンスにメッセージ ペイロードを挿入し、オプションで次のようにデータ属性を追加します。

// invokes a function with the JSON message { hello: 'world' } and attributes { foo: 'bar' }
myPubsubFunction({data: new Buffer('{"hello":"world"}'), attributes: {foo: 'bar'}})

Analytics ファンクションを呼び出す

シェルで myAnalyticsFunction() を実行することで、データなしで Analytics ファンクションを呼び出すことができます。テストデータを使用してファンクションを実行するには、ファンクションが必要とする特定のイベント データ フィールド用の変数を定義することをおすすめします。

var data = {
  eventDim: [{
    // populates event.data.params
    params:{foo:'bar'},
    // populates event.data.name
    name: 'event_name',
    // populates event.data.logTime, specify in microseconds
    timestampMicros: Date.now() * 1000,
    // populates event.data.previousLogTime, specify in microseconds
    previousTimestampMicros: Date.now() * 1000,
    // populates event.data.reportingDate, specify in 'YYYYMMDD' format
    date: '20170930',
    // populates event.data.valueInUSD
    valueInUsd: 230
  }],
  userDim: userDim
};

myAnalyticsFunction(data);

Storage、Auth、Crashlytics のファンクションを呼び出す

Storage、Auth、Crashlytics のファンクションの場合は、ファンクションの内部に表示するテストデータを使用してローカル ファンクションを呼び出します。テストデータは対応するデータ形式に従う必要があります。

コードに必要なフィールドのみを指定するか、ファンクションの実行だけを行う場合はフィールドは指定しないでください。

ログ

firebase serve と Cloud Functions シェルはいずれもファンクションからのログを、実行中のターミナル ウィンドウにストリームします。ログには関数内の console.log()console.info()console.error()console.warn() ステートメントからのすべての出力が表示されます。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。