App Hosting のデプロイの前に、Firebase Local Emulator Suite の一部である App Hosting エミュレータを使用して、アプリのローカルテストを実行できます。
App Hosting エミュレータを使用する前に、Firebase Local Emulator Suite の全体的なワークフローを理解し、Local Emulator Suite をインストールおよび構成し、CLI コマンドを確認しておいてください。
このトピックの説明は、App Hosting に精通していることを前提としています。必要に応じて、App Hosting の概要などの資料を参照し、App Hosting の仕組みを理解してください。
App Hosting エミュレータでできること
App Hosting エミュレータを使用すると、ウェブ アプリケーションをローカルでテストして絞り込めます。これにより、開発プロセスを効率化し、Firebase を使用して構築され App Hosting にデプロイされたウェブアプリの品質を向上させることができます。
App Hosting エミュレータ:
apphosting.yaml
構成ファイルで定義された環境変数とシークレットを使用して、ローカルでウェブアプリを実行できます。apphosting.emulator.yaml
ファイルを使用して、エミュレータで使用する環境変数とシークレットをオーバーライドできます。- 他の Firebase エミュレータと併用できます。Firestore、Auth、またはその他のエミュレータを使用している場合、Local Emulator Suite により、App Hosting エミュレータの前に、まずこれらのエミュレータが起動されます。
エミュレータの構成
使用を開始するには、Local Emulator Suite のインストール、構成、統合で説明されているように、Local Emulator Suite をインストールして初期化します。設定するほかの Firebase エミュレータに加えて、必ず App Hosting
Emulator
を選択してください。CLI のプロンプトで、次のような App Hosting エミュレータの値の入力を求められます。
- プロジェクトに関連するアプリのルート ディレクトリ。これは、App Hosting を使用した monorepo を使用している場合に重要です。
- ローカル開発で値をオーバーライドするかどうか。
- ローカル開発用にチームメイトにシークレットへのアクセス権を付与するかどうか。
firebase init emulators
=== Emulators Setup
? Which Firebase emulators do you want to set up? Press Space to select emulators, then Enter to confirm your choices. (Press
<space> to select, <a> to toggle all, <i> to invert selection, and <enter> to proceed)
❯◯ App Hosting Emulator
◯ Firestore Emulator
◯ Database Emulator
◯ Hosting Emulator
◯ Pub/Sub Emulator
◯ Storage Emulator
◯ Eventarc Emulator
(Move up and down to reveal more choices)
? Specify your app's root directory relative to your project (./)
? The App Hosting emulator uses a file called apphosting.emulator.yaml to
override values in apphosting.yaml for local testing. This codebase does not
have one, would you like to create it? (Y/n)
? Which environment variables would you like to override? (Press <space> to
select, <a> to toggle all, <i> to invert selection, and <enter> to proceed)
❯◯ MEMCACHE_ADDR
◯ API_KEY
? What new value would you like for plaintext MEMCACHE_ADDR?
? What would you like to name the secret reference for API_KEY? (test-api-key)
? What new value would you like for secret TESTKEY [input is hidden]? [input is hidden]
? Your config has secret values. Please provide a comma-separated list of users
or groups who should have access to secrets for local development:
✔ Successfully set IAM bindings on secret test-api-key.
この設定フローで指定した値は、firebase.json
の App Hosting エミュレータの構成の更新に使用されます。firebase.json
を直接更新して、App Hosting エミュレータを構成することもできます。App Hosting エミュレータのスキーマは次のとおりです。
{
...
"emulators": {
"apphosting": {
"startCommand": <command> [optional]
"rootDirectory": <path> [optional]
}
}
}
startCommand
は、エミュレータの初期化時に自動的に生成され、設定されます。指定しない場合、エミュレータはパッケージ管理システムの dev コマンドを検出して実行します。rootDirectory
は、monorepo プロジェクトの設定をサポートするために使用されます。ウェブアプリがサブディレクトリにある場合は、ルート(firebase.json
の場所)に関連するそのディレクトリのパスを提供する必要があります。
エミュレーションの管理
エミュレータが初期化されると、アプリのルート ディレクトリに apphosting.emulator.yaml
ファイルが作成されます。この構成ファイルは、本番環境で使用される apphosting.yaml
ファイルと同じスキーマを持ちますが、むしろローカル開発専用です。デフォルトでは、エミュレータは apphosting.yaml
ファイルから構成を読み取りますが、apphosting.emulator.yaml
ファイルが存在する場合は、そのファイル内の構成が優先されます。
apphosting.emulator.yaml
ファイルは、安全に commit して同僚と共有できるように設計されています。センシティブ データをソース リポジトリに誤って commit しないようにするには、apphosting.yaml
でシークレットである環境変数は apphosting.emulator.yaml
でもシークレットである必要があります。本番環境とローカル開発間でシークレットを変更する必要がない場合は(Gemini API キーなど)、apphosting.emulator.yaml
に追加する必要はありません。代わりに、チームにシークレットへのアクセス権を付与します。
アプリケーションで多くのシークレット(本番環境、ステージング、ローカル開発のそれぞれに異なる値を持つ 3 つの異なるサービスの API キーなど)を使用する場合、Cloud Secret Manager の無料枠を超え、追加のシークレットあたり月額 $0.06 の料金が発生することがあります。この料金を回避するためにソース管理の外部でローカル構成を管理する場合は、以前の apphosting.local.yaml
ファイルを使用できます。apphosting.emulator.yaml
とは異なり、このファイルでは、apphosting.yaml
のシークレットの値である環境変数に平文値を指定できます。
ユーザーまたはグループにシークレットへのアクセス権を付与する
apphosting.emulator.yaml
に保存されているシークレットは、エミュレータの起動時に読み取られます。つまり、開発チームはシークレットにアクセスする必要があります。apphosting:secrets:grantaccess
コマンドを使用して、メールでユーザーまたはグループにシークレットへのアクセス権を付与できます。
firebase apphosting:secrets:grantaccess test-api-key --emails my-team@my-company.com
必要に応じて、本番環境データにアクセスできない、グローバルな副作用(メールの送信、クレジット カードの請求)を引き起こさない、または割り当てが少ない apphosting.emulator.yaml
で、テスト専用の鍵を使用することを検討してください。これにより、レビューされていないコードが実世界に与える影響を軽減できます。
個々のユーザーにアクセス権を付与するのではなく、Google グループを使用してシークレットへのアクセスを管理することを検討してください。新しいメンバーはグループに追加されると必要なすべてのシークレットにアクセスできるため、デベロッパー チームへの新しいメンバーのオンボーディングが簡素化されます。デベロッパーが相互にコミュニケーションを取る適切なグループがすでに存在する場合もあります。Google グループによってアクセスを制御すると、チームを離れたデベロッパーがメール グループから削除されたときに、すべてのシークレットにアクセスできなくなるようにすることもできます。シークレットが本番環境データにアクセスする、または現実世界に副作用がある場合でも、鍵をローテーションして firebase apphosting:secrets:set
で新しい値を指定することは適切です。
エミュレータを実行する
firebase emulators:start
これにより、App Hosting エミュレータを含む、firebase.json
ファイルで定義されたすべてのエミュレータが起動します。