関数のデプロイとランタイム オプションを管理する

Firebase CLI コマンドを使用するか、関数のソースコードでランタイム オプションを設定することにより、関数をデプロイ、削除、変更できます。

関数をデプロイする

関数をデプロイするには、次の Firebase CLI コマンドを実行します。

$ firebase deploy --only functions

デフォルトでは、Firebase CLI によって index.js 内のすべての関数が同時にデプロイされます。プロジェクトに 6 つ以上の関数が含まれている場合は、特定の関数名で --only フラグを使用して、編集した関数のみをデプロイすることをおすすめします。このようにして特定の関数をデプロイすると、デプロイ プロセスが迅速化され、デプロイの割り当ての問題を回避できます。例:

$ firebase deploy --only functions:addMessage,functions:makeUppercase

使用可能なコマンドの完全な一覧については、Firebase CLI リファレンスをご覧ください。

デフォルトでは、Firebase CLI によって functions/ フォルダ内でソースコードが検索されます。別のフォルダを指定するには、firebase.json に次の行を追加します。

"functions": {
  "source": "another-folder"
}

関数を削除する

以前にデプロイした関数は、次の 2 つの方法で削除できます。

  • 明示的な方法。Firebase CLI で functions:delete を使用します。
  • 暗黙的な方法。デプロイ前に index.js から関数を削除します。

どちらのオペレーションでも、本番環境から関数を削除する前に確認メッセージが表示されます。

Firebase CLI で明示的に関数を削除する方法では、複数の引数だけでなく関数のグループもサポートされ、特定のリージョンで実行されている関数を指定できます。また、確認メッセージをオーバーライドすることもできます。

# Delete all functions that match the specified name in all regions.
$ firebase functions:delete myFunction

# Delete a specified function running in a specific region.
$ firebase functions:delete myFunction --region us-east-1

# Delete more than one function
$ firebase functions:delete myFunction myOtherFunction

# Delete a specified functions group.
$ firebase functions:delete groupA

# Bypass the confirmation prompt.
$ firebase functions:delete myFunction --force

暗黙的に関数を削除する方法では、firebase deploy により index.js が解析され、ファイルから削除されたすべての関数が本番環境から削除されます。非対話モードでデプロイすることで関数を削除することはできません。

関数の名前、リージョン、トリガーを変更する

本番トラフィックを処理している関数のリージョンまたはトリガー(の名前)を変更する場合は、このセクションの手順に沿って、変更中にイベントが失われないようにしてください。以下の手順を行う前に、まず関数がべき等であることを確認します。これは、関数の新旧両方のバージョンが変更中に同時に実行されるためです。

関数の名前を変更する

関数の名前を変更するには、関数の名前を変更した新しいバージョンを index.js に作成してから、2 つの別々のデプロイ コマンドを実行します。最初のコマンドは新しい名前の関数をデプロイし、2 番目のコマンドは以前にデプロイされたバージョンを削除します。たとえば、webhook という関数の名前を webhookNew に変更する場合は、次のようにコードを変更します。

// before
const functions = require('firebase-functions');

exports.webhook = functions.https.onRequest((req, res) => {
    res.send("Hello");
});

// after
const functions = require('firebase-functions');

exports.webhookNew = functions.https.onRequest((req, res) => {
    res.send("Hello");
});

続いて、次のコマンドを実行して新しい関数をデプロイします。

# Deploy new function called webhookNew
$ firebase deploy --only functions:webhookNew

# Wait until deployment is done; now both webhookNew and webhook are running

# Delete webhook
$ firebase functions:delete webhook

関数のリージョンを変更する

本番環境トラフィックを処理している関数のリージョンを変更する場合は、以下の手順を順番に実施すると、イベントが失われないようにできます。

  1. 関数の名前とリージョンを変更します。
  2. 名前を変更した関数をデプロイします。これにより、一時的に両方のリージョンで関数が実行されます。
  3. 前の関数を削除します。

たとえば、現時点でデフォルトの関数リージョン us-central1 に存在する webhook という関数があり、それを asia-northeast1 に移行する場合は、ソースコードを変更して関数の名前を変更してからリージョンを変更する必要があります。

// before
const functions = require('firebase-functions');

exports.webhook = functions
    .https.onRequest((req, res) => {
            res.send("Hello");
    });

// after
const functions = require('firebase-functions');

exports.webhookAsia = functions
    .region('asia-northeast1')
    .https.onRequest((req, res) => {
            res.send("Hello");
    });

続いて、次のコマンドを実行してデプロイします。

$ firebase deploy --only functions:webhookAsia

これで 2 つの同じ関数が実行されます。webhookus-central1 で実行され、webhookAsiaasia-northeast1 で実行されます。

次に、webhook を削除します。

$ firebase functions:delete webhook

これで、関数は asia-northeast1 で実行される webhookAsia だけになります。

関数のトリガータイプを変更する

Cloud Functions for Firebase デプロイの開発の進展に応じて、さまざまな理由により関数のトリガータイプを変更する必要が生じる場合があります。たとえば、次のような必要が生じることがあります。

  • 従来のストレージの onChange イベントから onFinalizeonDeleteonArchiveonMetadataUpdate に変更する(詳しくは、ベータ版から v1 または v2 へのアップグレード ガイドをご覧ください)。
  • あるタイプの Firebase Realtime Database または Cloud Firestore イベントから別のイベントに変更する(汎用の onWrite イベントをきめ細かな onCreate イベントに変更するなど)。

ソースコードを変更して firebase deploy を実行するだけでは、関数のイベントタイプを変更できません。エラーを回避するために、次の手順に従って関数のトリガータイプを変更します。

  1. 目的のトリガータイプを使用する新しい関数が含まれるように、ソースコードを変更します。
  2. 関数をデプロイします。これにより、一時的に新旧両方の関数が実行されます。
  3. Firebase CLI を使用して、本番環境から古い関数を明示的に削除します。

たとえば、従来の onChange イベントタイプを使用する objectChanged 関数があり、それを onFinalize に変更する場合は、まず関数の名前を変更して、onFinalize イベントタイプを使用するように編集します。

// before
const functions = require('firebase-functions');

exports.objectChanged = functions.storage.object().onChange((object) => {
    return console.log('File name is: ', object.name);
});

// after
const functions = require('firebase-functions');

exports.objectFinalized = functions.storage.object().onFinalize((object) => {
    return console.log('File name is: ', object.name);
});

続いて、古い関数を削除する前に、先に次のコマンドを実行して新しい関数を作成します。

# Create new function objectFinalized
$ firebase deploy --only functions:objectFinalized

# Wait until deployment is done; now both objectChanged and objectFinalized are running

# Delete objectChanged
$ firebase functions:delete objectChanged

ランタイム オプションを設定する

Cloud Functions for Firebase では、ランタイム オプション(Node.js ランタイムのバージョン、関数ごとのタイムアウト、メモリ割り当てなど)を選択できます。

Node.js のバージョンを設定する

Firebase SDK for Cloud Functions 2.0.0 以降では、Node.js ランタイムを選択できます。プロジェクトの全関数の実行環境を、Node.js のバージョン 6 に限定するか、バージョン 8 に限定するかを選択できます。Node.js 8 ランタイムは現時点でベータ版であり、また関数を Node.js 8 にデプロイするには firebase-tools 4.0.0 以降が必要です。

バージョンを設定するには、初期化中に functions/ ディレクトリに作成された package.json ファイルに engines フィールドを追加します。たとえば、バージョン 8 のみを使用する場合は、package.json を編集して次の行を追加します。

  "engines": {"node": "8"}

また、engines フィールドを完全に省略して、すべての関数に Node.js 6(デフォルト)を使用することもできます。

タイムアウトとメモリ割り当てを設定する

場合によっては、長いタイムアウト値や大容量のメモリ割り当てに関して、関数に特別な要件が存在することがあります。これらの値は、Google Cloud Console または関数のソースコード(Firebase のみ)で設定できます。

関数のソースコードでメモリ割り当てとタイムアウトを設定するには、Firebase SDK for Cloud Functions 2.0.0 で導入された runWith パラメータを使用します。このランタイム オプションは、RuntimeOptions インターフェースに準拠する JSON オブジェクトを受け入れます。これにより、timeoutSecondsmemory の値が定義されます。たとえば、次のストレージ関数は 1 GB のメモリを使用し、300 秒経過するとタイムアウトします。

const runtimeOpts = {
  timeoutSeconds: 300,
  memory: '1GB'
}

exports.myStorageFunction = functions
  .runWith(runtimeOpts)
  .storage
  .object()
  .onFinalize((object) = > {
    // do some complicated things that take a lot of memory and time
  });

timeoutSeconds の最大値は 540(9 分)です。memory に有効な値は次のとおりです。

  • 128MB
  • 256MB
  • 512MB
  • 1GB
  • 2GB

Google Cloud Platform Console でメモリ割り当てとタイムアウトを設定するには:

  1. Google Cloud Platform Console で、左側のメニューから [Cloud Functions] を選択します。
  2. 関数のリストで関数名をクリックして、関数を選択します。
  3. トップメニューの [編集] アイコンをクリックします。
  4. [割り当てられるメモリ] というプルダウン メニューから、メモリ割り当てを選択します。
  5. [詳細] をクリックして詳細オプションを表示し、[タイムアウト] テキスト ボックスに秒数を入力します。
  6. [保存] をクリックして関数を更新します。

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

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