拡張機能が指定されたアクションを実行するため、Firebase はサービス アカウントを介して、インストールされた拡張機能のインスタンスごとにプロジェクトとそのデータへの制限付きアクセス権を付与します。
サービス アカウントとは
サービス アカウントは、特殊なタイプの Google ユーザー アカウントです。Google サービスに対して承認済みの API 呼び出しを行うことができる、人間以外のユーザーを表します。
拡張機能のインストール中に、Firebase によってプロジェクト内に拡張機能のサービス アカウントが作成されます。インストールされた拡張機能のインスタンスごとに、固有のサービス アカウントがあります。拡張機能のインスタンスがアンインストールされると、Firebase は拡張機能のサービス アカウントを削除します。
拡張機能用に作成されるサービス アカウントは次の形式になります。
ext-extension-instance-id@project-id.iam.gserviceaccount.com
Firebase は、拡張機能のサービス アカウントに特定のロール(一連の権限)を割り当てることで、プロジェクトとそのデータへの拡張機能のアクセスを制限します。拡張機能を作成する際は、拡張機能が動作するために必要なロールを決定してから、そのロールと拡張機能がそれを必要とする理由を extension.yaml ファイルにリストします(このページの下部にある例をご覧ください)。
拡張機能に必要なロールを決定する
拡張機能を作成する際は、拡張機能が動作するために必要なアクセスレベルを決定します。
拡張機能のインストールで、Firebase CLI からユーザー対して、各ロールで付与されるアクセスレベルの承認を求めるプロンプトが表示されます。拡張機能が実際に必要とする以上のロールをリクエストすると、ユーザーが拡張機能をインストールできる可能性が低くなります。
- 拡張機能がプロダクトとやり取りしているかどうかを確認します。 - 拡張機能がプロダクトとやり取りしている場合、拡張機能にそのプロダクトへのアクセス権を付与する必要があります。 - たとえば、拡張機能が Realtime Database インスタンスにデータを書き込む場合、拡張機能には Realtime Database のロール(特に - firebasedatabase.admin)が必要です。
- 拡張機能がプロダクトからトリガーとなるイベントをリッスンするだけであれば、拡張機能はそのプロダクトに関連付けられているロールを必要としません。 - たとえば、拡張機能が Realtime Database インスタンスへの書き込みによってトリガーされる(ただしデータベースには何も書きこまない)場合、拡張機能には Realtime Database ロールは必要ありません。 
 
- 拡張機能がやり取りするプロダクトが確認されると、その特定のインタラクションに必要なロールを決定する必要があります。一部のプロダクトでは、実行するアクションまたは一連のアクションに応じて別々のロールが提供されます。 - たとえば、拡張機能が Cloud Storage バケットとやり取りしているとします。 - storage.objectCreatorのロールでは、拡張機能が Cloud Storage バケットにオブジェクトを作成することはできますが、オブジェクトの表示、削除、上書きはできません。拡張機能がこの追加アクションを実行できるようにするには、- storage.objectAdminロールを割り当てる必要があります。
このページの下部のセクションで、拡張機能のサービス アカウントに割り当てることのできるサポートされているロールをすべて紹介しています。各ロールの説明と付与される権限については、Firebase のドキュメントまたはGoogle Cloud のドキュメントをご覧ください。Google Cloud コンソールの [IAM と管理] パネルでもロールの検索が可能です。
拡張機能へのロールの割り当て方
拡張機能が動作するために必要な IAM ロールを extension.yaml ファイルの roles セクションにリストします。
指定された Firebase Realtime Database パスをリッスンする拡張機能の例を次に示します。拡張機能がトリガーされると、ユーザー アカウントのメール(Firebase Authentication とのインタラクション)が更新され、通知(Firebase Cloud Messaging とのインタラクション)が送信されます。次の点に注意してください。
- Realtime Databaseイベントから拡張機能がトリガーされても、firebasedatabase.adminロールはリストされません(リッスンはインタラクションとはみなされません)。
- この拡張機能は Authentication と Cloud Messaging とやり取りするため、このようなプロダクトにアクセスするためのロール(それぞれ firebaseauth.adminとfirebasenotifications.admin)が必要です。
# extension.yaml
...
# Roles assigned to the extension's service account by Firebase during installation
roles:
  - role: firebaseauth.admin
    reason: Required to update the email address of the user account
  - role: firebasenotifications.admin
    reason: Required to send a notification that the email address has been updated
...
extension.yaml ファイルで、次のフィールドを使用して拡張機能のサービス アカウントにロールを割り当てます。
| フィールド | 型 | 説明 | 
|---|---|---|
| role(必須) | 文字列 | 拡張機能が動作するために必要な IAM ロールの名前 | 
| reason(必須) | 文字列 | ロールによって付与されたアクセス権が拡張機能に必要な理由の簡単な説明 拡張機能がロールをどのように使用するかをユーザーが理解できるように、十分な詳細情報を提供してください。 | 
| resource(省略可) | 文字列 | このロールを追加するリソースの IAM ポリシー。省略された場合、デフォルトの  サポートされる値は  | 
ロールの範囲を縮小する
拡張機能では、最小権限の原則に従い、必要なリソースへのアクセス権のみをリクエストする必要があります。拡張機能のアクセス範囲を制限するには、role.resource フィールドを使用します。たとえば、拡張機能でオブジェクトを Cloud Storage バケットに書き込む必要がある場合は、次のロールを使用できます。
roles:
  - role: storage.objectCreator
    reason: Needed in order to write
    resource: projects/${PROJECT_ID}/buckets/${STORAGE_BUCKET}
これにより、拡張機能は必要なバケットにのみアクセスでき、同じプロジェクトの他のバケットにはアクセスできません。
このフィールドは、プロジェクト(projects/{project_id})とストレージ バケット(projects/{project_id}/buckets/{bucket_id})をサポートしています。
拡張機能でサポートされているロール
次の表に、Firebase プロダクトとのやり取りでサポートされている IAM ロールを示します。この表のロールのほとんどは、Firebase プロダクト レベルのロールですが、一部は Google Cloud(具体的には Cloud Firestore と Cloud Storage)によって直接管理されています。
Firebase プロダクト
| 拡張機能がやり取りする対象 | 割り当てられるロール | 
|---|---|
| Cloud Firestore | datastore.importExportAdmin datastore.indexAdmin datastore.owner datastore.user datastore.viewer | 
| Cloud Storage for Firebase | storage.admin storage.objectAdmin storage.objectCreator storage.objectViewer | 
| Firebase App Distribution | firebaseappdistro.admin firebaseappdistro.viewer | 
| Firebase Authentication | firebaseauth.admin firebaseauth.viewer | 
| Firebase A/B Testing | firebaseabt.admin firebaseabt.viewer | 
| Firebase Cloud Messaging | firebasenotifications.admin firebasenotifications.viewer | 
| Firebase Crashlytics | firebasecrashlytics.admin firebasecrashlytics.viewer | 
| Firebase Hosting | firebasehosting.admin firebasehosting.viewer | 
| Firebase In-App Messaging | firebaseinappmessaging.admin firebaseinappmessaging.viewer | 
| Firebase ML | firebaseml.admin firebaseml.viewer | 
| Firebase Performance Monitoring | firebaseperformance.viewer firebaseperformance.reader firebaseperformance.writer | 
| Firebase Realtime Database | firebasedatabase.admin firebasedatabase.viewer | 
| セキュリティ ルール | firebaserules.viewer firebaserules.developer firebaserules.deployer | 
| Google Analytics | firebaseanalytics.admin firebaseanalytics.viewer | 
Google Cloud プロダクト
このようなロールの詳細については、Google Cloud のドキュメントをご覧ください。
| 拡張機能がやり取りする対象 | 割り当てられるロール | 
|---|---|
| アクション | actions.Admin actions.Viewer | 
| Apigee | apigee.analyticsAgent apigee.analyticsEditor apigee.analyticsViewer apigee.apiCreator apigee.deployer apigee.developerAdmin apigee.readOnlyAdmin apigee.synchronizerManager | 
| App Engine | appengine.appAdmin appengine.appViewer appengine.codeViewer appengine.deployer appengine.serviceAdmin | 
| AutoML | automl.editor automl.predictor automl.viewer | 
| BigQuery | bigquery.connectionAdmin bigquery.connectionUser bigquery.dataEditor bigquery.dataOwner bigquery.dataViewer bigquery.jobUser bigquery.metadataViewer bigquery.readSessionUser bigquery.user | 
| Cloud Bigtable | bigtable.reader bigtable.user bigtable.viewer | 
| Billing | billing.viewer | 
| ハングアウト チャット | chat.owner chat.reader | 
| Cloud Asset | cloudasset.owner cloudasset.viewer | 
| Cloud Data Fusion | datafusion.admin datafusion.viewer | 
| Cloud デバッガ | clouddebugger.agent clouddebugger.user | 
| Cloud Functions | cloudfunctions.invoker cloudfunctions.viewer | 
| Cloud IAP | iap.admin iap.httpsResourceAccessor iap.settingsAdmin iap.tunnelResourceAccessor | 
| Cloud IoT | cloudiot.deviceController cloudiot.editor cloudiot.provisioner cloudiot.viewer | 
| Stackdriver Profiler | cloudprofiler.agent cloudprofiler.user | 
| Cloud Scheduler | cloudscheduler.admin cloudscheduler.jobRunner cloudscheduler.viewer | 
| Cloud Security Scanner | cloudsecurityscanner.editor cloudsecurityscanner.runner cloudsecurityscanner.viewer | 
| Cloud SQL | cloudsql.client cloudsql.editor cloudsql.viewer | 
| Cloud Trace | cloudtrace.admin cloudtrace.agent cloudtrace.user | 
| Dataflow | dataflow.developer dataflow.viewer dataflow.worker | 
| Dialogflow | dialogflow.admin dialogflow.client dialogflow.reader | 
| Cloud Data Loss Prevention | dlp.reader dlp.user | 
| Error Reporting | errorreporting.user errorreporting.viewer errorreporting.writer | 
| Eventarc | eventarc.publisher eventarc.eventReceiver | 
| Cloud Filestore | file.editor file.viewer | 
| ロギング | logging.configWriter logging.logWriter logging.privateLogViewer logging.viewer | 
| ML Engine | ml.developer ml.jobOwner ml.modelOwner ml.modelUser ml.operationOwner ml.viewer | 
| モニタリング | monitoring.editor monitoring.metricWriter monitoring.viewer | 
| AI Notebooks | notebooks.admin notebooks.viewer | 
| Pub/Sub | pubsub.editor pubsub.publisher pubsub.subscriber pubsub.viewer | 
| Memorystore Redis | redis.editor redis.viewer | 
| Cloud Run | run.invoker | 
| ソース | source.reader source.writer | 
| Cloud Spanner | spanner.databaseAdmin spanner.databaseReader spanner.databaseUser spanner.viewer | 
| Service Usage | serviceusage.apiKeysMetadataViewer | 
| Cloud Storage Transfer Service | storagetransfer.user storagetransfer.viewer | 
| Cloud Transcoder | transcoder.admin transcoder.viewer | 
| Vertex AI | aiplatform.user | 
| その他 | identitytoolkit.admin identitytoolkit.viewer |