Firebaseの環境構成ガイド

2025年3月7日

環境構成の概要

FirebaseのCloud Functionsでは、サードパーティのAPIキーや調整可能な設定など、関数に追加の構成が必要な場合があります。Firebase SDKでは、プロジェクトのこのタイプのデータを簡単に保存および取得できるように、環境構成が組み込まれています。

選べる構成オプションは2つあります!
  • パラメータ化された構成(推奨)- 厳密に型指定された環境構成でエラーを防ぎ、デバッグを簡素化
  • ファイルベースの環境変数 - dotenvファイルを使用して環境変数を読み込む
functions.configを使用した環境構成はバージョン6.0.0で非推奨になり、次のメジャーリリースではサポートされなくなります。環境変数への移行が推奨されています。

パラメータ化された構成

Cloud Functions for Firebaseには、コードベース内で構成パラメータを宣言として定義するインターフェースがあります。これらのパラメータ値は、関数のデプロイ時、設定時、実行時に使用できます。

const { onRequest } = require('firebase-functions/v2/https'); const { defineInt, defineString } = require('firebase-functions/params'); // パラメータの定義 const minInstancesConfig = defineInt('HELLO_WORLD_MININSTANCES'); const welcomeMessage = defineString('WELCOME_MESSAGE'); // 関数内でのパラメータの使用 export const helloWorld = onRequest( { minInstances: minInstancesConfig }, (req, res) => { res.send(`${welcomeMessage.value()}! I am a function.`); } );

デプロイ時の動作 📦

パラメータ化された構成変数を使用して関数をデプロイすると:

  1. Firebase CLIはローカルの.envファイルから値を読み込む
  2. 値が見つからない場合はプロンプトが表示される
  3. 入力値は.env.<project_ID>ファイルに自動保存

Secretタイプのパラメータ

defineSecret()を使用して、Cloud Secret Managerに格納されている値を持つパラメータを定義できます。セキュリティが重要な情報に最適です。

const { onRequest } = require('firebase-functions/v2/https'); const { defineSecret } = require('firebase-functions/params'); const discordApiKey = defineSecret('DISCORD_API_KEY'); export const postToDiscord = onRequest( { secrets: [discordApiKey] }, (req, res) => { const apiKey = discordApiKey.value(); // APIキーを使った処理 } );
シークレットの値は関数の実行時まで非表示になるため、関数の構成中は使用できません。

パラメータタイプと式

パラメータ化された構成はパラメータ値を厳密に型指定し、Cloud Secret Managerのシークレットもサポートします。

サポートされるタイプ:

  • シークレット
  • 文字列
  • ブール値
  • 整数
  • 浮動小数点数
  • List型(Node.js)

Firebaseは、関数のデプロイ時と実行時の両方でパラメータを評価します。

パラメータの使用方法 🛠️

  • ランタイムオプションとして:パラメータを直接渡す
  • 比較操作:組み込みの比較演算子を使用
  • 実行時のみ:value()関数でアクセス
// 組み込み比較演算子の使用例 const environment = params.defineString('ENVIRONMENT', {default: 'dev'}); const minInstancesConfig = environment.equals('PRODUCTION').thenElse(10, 1);

環境変数

Cloud Functions for Firebaseは、dotenvファイル形式をサポートしています。デプロイ後は、process.envインターフェース(Node.js)またはos.environ(Python)で読み取れます。

環境変数の設定手順 📋

  1. functions/ディレクトリに.envファイルを作成
  2. 必要なキーを追加(例:PLANET=Earth)
  3. 関数をデプロイ
// 環境変数にアクセスする例 exports.hello = onRequest((request, response) => { response.send(`Hello ${process.env.PLANET} and ${process.env.AUDIENCE}`); });
複数の環境(開発・本番など)がある場合は、.env.<project or alias>ファイルを作成できます!
一部の環境変数キーは内部使用のために予約されています。X_GOOGLE_、EXT_、FIREBASE_で始まるキーなど多数あります。

Secret Managerの利用

機密情報を安全に保存するために、Firebase Cloud FunctionsはGoogle Cloud Secret Managerと統合されています。この暗号化サービスで、構成値を安全に保存できます。

シークレットの作成と使用 🔑

  1. Firebase CLIを使用:firebase functions:secrets:set SECRET_NAME
  2. シークレット値を入力
  3. 関数コードでrunWithパラメータを使用して参照
  4. 関数をデプロイ

Secret Managerの無料枠:

  • 6個のアクティブなシークレットバージョンを無料で使用可能
  • 1つのシークレットに対して毎月10,000回のアクセスを無料で使用可能

CLIの動作を構成

Optionsオブジェクトを使用してパラメータを構成し、値の入力を求めるCLIの動作を制御できます。

const { defineString } = require('firebase-functions/params'); // デフォルト値と説明を設定 const welcomeMessage = defineString('WELCOME_MESSAGE', { default: 'Hello World', description: '関数の呼び出し元に返されるあいさつ' }); // 電話番号形式の検証 const onlyPhoneNumbers = defineString('PHONE_NUMBER', { input: { text: { validationRegex: /\d{3}-\d{3}-\d{4}/, validationErrorMessage: "XXX-YYY-ZZZZ形式で入力してください" }, }, }); // 選択オプション const selectedOption = defineString('PARITY', { input: params.select(["odd", "even"]) });
カスタム検証、選択オプション、プロジェクト情報を自動入力など、様々な制御が可能です!

エミュレータサポート

dotenvを使用する環境構成は、ローカルのCloud Functionsエミュレータと相互運用するように設計されています。

ローカルテスト時の環境設定 🧪

.env.localファイルを設定することで、プロジェクトの環境変数をオーバーライドできます。

優先順位:.env.local > .env.プロジェクト固有 > .env

Cloud Functionsエミュレータは、シークレットの使用もサポートしています。.secret.localファイルを設定してシークレット値をオーバーライドできます。
これにより、実際のシークレット値にアクセスできない場合でも、関数をローカルで簡単にテストできます!

環境構成からの移行

functions.configで環境構成を使用している場合は、環境変数(dotenv形式)に移行できます。

移行手順 📤

  1. firebase functions:config:exportコマンドを使用
  2. 既存の環境構成を.envファイルとしてエクスポート
  3. 関数コードを更新:functions.configの代わりにprocess.envを使用
生成された.envファイルの内容を十分に確認してください。機密情報は.envファイルから削除し、代わりにSecret Managerで安全に保存することをおすすめします。

移行の注意点:

  • すべての構成を自動で変換できるわけではありません
  • 無効な場合や予約済みキーを使用している場合は名前変更が必要
  • 関数コードの更新が必要