Firebaseへのデプロイのために必要なIAMロール (備忘録)


GitHub ActionsからFirebaseにデプロイしようとして権限周りではまったのでメモ。

そもそも前提条件

サービスアカウント秘密鍵のJSONファイルへのパスをGOOGLE_APPLICATION_CREDENTIALSに指定してfirebase-toolsを呼びます。環境変数から直接渡すことはできないので、一旦ファイルに出力してやる必要があります。

jobs:
  deploy:
    steps:
      - run: echo "$FIREBASE_SERVICE_ACCOUNT" > /tmp/credentials.json
        env:
          FIREBASE_SERVICE_ACCOUNT: ${{ secrets.SERVICE_ACCOUNT }}
      - run: GOOGLE_APPLICATION_CREDENTIALS=/tmp/credentials.json npx firebase-tools deploy

各サービスごとに必要なIAMロール

共通

Cloud RuntimeConfig Adminを指定します。このロールを指定しないとFirebase CLIが利用できません。はまりポイント。

Firebase Hosting

Firebase Hosting Adminを指定します。

Firestore

Cloud Datastore Index AdminFirebase Rules Adminを指定します。名前通りですが前者がインデックスに、後者がセキュリティルールに対応します。どこにもFirestoreの文字はないので注意。

Cloud Functions for Firebase

通常のCloud Functionsと同じくCloud Functions Adminを指定します。

Cloud FunctionsのコンテナイメージがCloud Storageに保存されるので、Storage Object Adminも指定します。

Cloud FunctionsにデプロイするIAMユーザーは、Cloud Functionsを実行するIAMユーザーに「成り代わる」権限を持つ必要があります。実行時に使用されるIAMユーザーへのアクセスを、デプロイ時に使用するユーザーに、Service Account Userロールで許可します。

Cloud PubSubを使用する(定期実行など)場合は、Cloud Scheduler Adminも指定します。

参考資料

なお、前項で示したIAMロールの権限が最小かどうかは検証していません。若干過剰かもしれませんが許容範囲かなと思っています。

Firebaseで自動生成される権限周りはかなりガバガバなので、プロジェクト内にFirebaseを導入する場合は気を付けたほうが良いかもしれません。