【2025年版】Firebase Functions 環境変数の設定方法(v2対応)

Firebase Functions 環境変数の設定方法 DX化
Firebase Functions 環境変数の設定方法

はじめに

Firebase Functionsをプロジェクトで活用していると、APIキーやデータベース接続情報など、コードに直接記述したくない機密情報を扱う場面が多々あります。しかし、Firebase Functions v2以降では、従来の functions:config:set コマンドが非推奨となり、警告メッセージが表示されるようになりました

私も複数のクライアントプロジェクトでFirebase Functionsを利用していますが、v2へのアップデート後に環境変数の管理方法を見直す必要がありました。本記事では、Firebase Functions 環境変数をv2以降の方法で安全に管理・利用する方法を、実際の導入経験をもとに詳しく解説します。

Firebase Functions 環境変数の変更点と背景

Firebase Functions v2では、環境変数の扱い方が大きく変わりました。これまでの方法が使えなくなった理由と、新方式について説明します。

functions:config:set が非推奨に

Firebase Functions v2以降でプロジェクトを初期化し、従来の方法で環境変数を設定しようとすると、以下のような警告メッセージが表示されるようになりました。

Warning: functions:config:set is deprecated and will be removed in a future major release. 
Please use the Firebase Admin SDK, .env files, or a third-party secret manager instead.

この変更の主な理由は、Firebase Functionsの内部アーキテクチャが刷新されたことにあります。v2では、Cloud Functionsのインフラストラクチャがより直接的に利用されるようになり、Firebase固有の環境変数管理システムよりも、Google CloudのネイティブサービスであるSecret Managerの利用が推奨されるようになりました。

なぜ Secret Manager の利用が推奨されるのか

Firebase Functionsの環境変数管理にSecret Managerが推奨される理由は以下の通りです:

  1. セキュリティ強化:Secret Managerは、機密情報を専用に管理するためのサービスで、暗号化やアクセス制御などの機能が充実しています。
  2. バージョン管理:シークレットのバージョニングが可能で、履歴管理やロールバックが容易です。
  3. CI/CD環境との親和性:CI/CD環境でシークレットを扱う場合、Secret Managerを利用することで安全に自動デプロイが可能になります。
  4. 他のGoogleCloudサービスとの統合:GoogleCloudの他のサービスとも連携しやすく、プロジェクト全体で一貫したセキュリティポリシーを適用できます。

Firebase Functions 環境変数の設定方法【v2対応】

Firebase Functions v2以降での環境変数設定には、主に2つの方法があります。それぞれの方法について、実際の導入手順と共に解説します。

Firebase SDK 経由で直接埋め込む方法

最も単純な方法は、環境変数を直接コードに読み込む方法です。特に機密性の低い情報や、開発環境固有の設定に適しています。

.env ファイルの利用

.envファイルを作成し、環境変数を定義します。

API_URL=https://api.example.com
DEBUG_MODE=true

② 次に、dotenvパッケージをインストールして読み込みます:

npm install dotenv

③ Functionsのコードで環境変数を読み込みます:

// functions/index.js
require('dotenv').config();

exports.myFunction = functions.https.onCall((data, context) => {
  const apiUrl = process.env.API_URL;
  // 以降の処理
});

ただし、この方法には注意点があります。

  • .envファイルはデプロイ時にFunctionsのコードに含まれないため、ローカル開発環境でのみ有効です
  • 本番環境では別の方法で環境変数を設定する必要があります
  • 機密情報はこの方法で管理すべきではありません

開発環境と本番環境で設定を切り替えるために、.env.development.env.productionのように環境別にファイルを分け、デプロイ前に適切なファイルをコピーする仕組みも構築できますが、Secret Managerへの移行後はこの複雑な管理が不要になります。

Secret Manager を利用する方法(推奨)

セキュリティ面から見ると、Firebase Functions v2以降では、Secret Managerを使用した環境変数の管理が最も推奨されてます。以下に具体的な手順を解説します。

1. gcloud auth login

初回やセッションが切れている場合は gcloud auth login を行う。

gcloud auth list

ログイン済みのアカウントが表示されない場合

gcloud auth login

その後、対象プロジェクトを選択します。

gcloud config set project your-project-id

2. Secret Manager APIの有効化

まず、Secret Manager APIを有効にします。

gcloud services enable secretmanager.googleapis.com

3. シークレットの作成

Secret Managerにシークレットを登録します。

gcloud secrets create MY_API_KEY --replication-policy="automatic"
echo -n "api-key-value" | gcloud secrets versions add MY_API_KEY --data-file=-

複数の環境(開発/本番)を区別するために、シークレット名に接頭辞をつける方法も有効です。

# 開発環境用
gcloud secrets create DEV_API_KEY --replication-policy="automatic"
echo -n "dev-api-key" | gcloud secrets versions add DEV_API_KEY --data-file=-

# 本番環境用
gcloud secrets create PROD_API_KEY --replication-policy="automatic"
echo -n "prod-api-key" | gcloud secrets versions add PROD_API_KEY --data-file=-

GCPコンソールから登録する場合は、以下の手順です。

  • GCPコンソール→上部検索窓で「Secret Manager」検索
  • シークレットを作成」をクリック。
  • 例:
    • 名前:OPENAI_API_KEY
    • 値:実際のAPIキー(sk-xxxxxなど)
    • シークレットを作成 → 完了

4. Firebase Functionsにアクセス権を付与

Firebase Functionsがシークレットにアクセスするための権限を設定します。

gcloud secrets add-iam-policy-binding API_KEY \
  --member="serviceAccount:your-project-id@appspot.gserviceaccount.com" \
  --role="roles/secretmanager.secretAccessor"

your-project-id は実際の Firebase/GCP プロジェクトIDに置き換えてください。複数のシークレットを使う場合は、それぞれに同様のコマンドを実行します。

5. Firebase Functionsコードでの設定

Functionsのコードでシークレットを利用する方法は2つあります。

方法1: SDK経由でシークレットを直接読み込む

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

exports.myFunction = functions.https.onCall({
  secrets: ['MY_API_KEY'],
  handler: (req, res) => {
    const apiKey = process.env.MY_API_KEY;
    // apiKeyを使った処理
  }
});

方法2: 環境全体でシークレットを利用する

Firebase Functions全体で同じシークレットを使いたい場合は、firebase.jsonを編集します:

{
  "functions": {
    "source": "functions",
    "runtime": "nodejs18",
    "secrets": ["MY_API_KEY"]
  }
}

こうすることで、すべてのFunctionsでprocess.env.MY_API_KEYとしてシークレットの値にアクセスできます。

CI/CD で環境変数を扱う際の注意点

自動デプロイ環境で環境変数を扱う場合、特に注意が必要です。CI/CD環境では、Secret Managerとの連携が推奨されますが、従来の方法も一部活用できます。

GitHub Actions との連携例

GitHub Actionsでデプロイを自動化する場合の設定例です。

name: Deploy Firebase Functions

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'
      
      - name: Install Dependencies
        run: cd functions && npm install
      
      - name: Authenticate to Google Cloud
        uses: google-github-actions/auth@v1
        with:
          credentials_json: ${{ secrets.GCP_SA_KEY }}
      
      - name: Deploy to Firebase
        uses: w9jds/firebase-action@master
        with:
          args: deploy --only functions
        env:
          GCP_SA_KEY: ${{ secrets.GCP_SA_KEY }}

このとき、GitHub SecretsにGCP_SA_KEYとしてサービスアカウントのJSONキーを設定しておく必要があります。このサービスアカウントには、Secret Managerへのアクセス権限も付与しておくことが重要です。

.runtimeconfig.json を手動で用意する方法

v1互換性のために、CI/CD環境で.runtimeconfig.jsonを手動で作成して利用することも可能です:

{
  "api": {
    "key": "your-api-key"
  },
  "database": {
    "url": "your-database-url"
  }
}

このファイルをfunctionsディレクトリに配置してデプロイすると、functions.config()で値を取得できます。ただし、この方法はv2では完全にサポートされなくなる可能性があるため、新規開発では避けるべきですね。

Firebase Functions 環境変数のまとめ

Firebase Functions v2での環境変数管理について重要なポイントをまとめます:

  1. セキュリティ第一:機密情報はSecret Managerで管理するのが最も安全
  2. アクセス制御:必要最小限の権限設定を心がける
  3. 環境分離:開発環境と本番環境で異なる値を設定できる仕組みを整える
  4. CI/CD対応:自動デプロイ環境でも安全に環境変数を扱える方法を選択する

まとめ

Firebase Functions v2以降では、従来のfunctions:config:setによる環境変数管理が非推奨となり、代わりにSecret Managerの利用が推奨されています。

重要なポイントは以下の通りです:

  1. Firebase Functions環境変数はSecret Managerで管理する:特に機密情報は必ずSecret Managerを使用しましょう。
  2. 最小権限の原則を適用する:各関数が必要とするシークレットのみにアクセスできるよう設計します。
  3. 環境別に設定を分ける:開発環境と本番環境で異なるシークレットを用意し、誤った設定のデプロイを防ぎます。
  4. CI/CD環境での安全な自動化:デプロイ自動化においても、シークレットが安全に扱われる仕組みを整える。

Firebase Functionsでの環境変数管理は、アプリケーションの安全性と保守性に直結する重要な要素です。本記事で紹介した方法を参考に、セキュアで管理しやすい環境構築を実現してください。