はじめに
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が推奨される理由は以下の通りです:
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.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コンソールから登録する場合は、以下の手順です。
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での環境変数管理について重要なポイントをまとめます:
まとめ
Firebase Functions v2以降では、従来のfunctions:config:set
による環境変数管理が非推奨となり、代わりにSecret Managerの利用が推奨されています。
重要なポイントは以下の通りです:
- Firebase Functions環境変数はSecret Managerで管理する:特に機密情報は必ずSecret Managerを使用しましょう。
- 最小権限の原則を適用する:各関数が必要とするシークレットのみにアクセスできるよう設計します。
- 環境別に設定を分ける:開発環境と本番環境で異なるシークレットを用意し、誤った設定のデプロイを防ぎます。
- CI/CD環境での安全な自動化:デプロイ自動化においても、シークレットが安全に扱われる仕組みを整える。
Firebase Functionsでの環境変数管理は、アプリケーションの安全性と保守性に直結する重要な要素です。本記事で紹介した方法を参考に、セキュアで管理しやすい環境構築を実現してください。