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

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 を使用して明示的に削除する
  • Firebase コンソールの関数リストにあるコンテキスト メニューを使用して明示的に削除する
  • デプロイ前に index.jsindex.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. 前の関数を削除します。

たとえば、現時点でデフォルトの関数リージョン webhook に存在する us-central1 という関数があり、それを 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 のサポートページをご覧ください。