この記事の結論と要点
結論:エラーの正体は、Cloud Functions v2 が使う Eventarc の「サービスID(サービス エージェント)」を作れず、権限まわりでつまずいたことです。APIを有効化し、所定のサービスアカウントに正しいロールを与えれば解決します。
理由:初回デプロイや構成変更のタイミングで、Google 管理のサービスアカウントをプロジェクトに作成・設定します。ここで権限不足だと生成に失敗します。
具体策:必要APIのON → サービスIDの作成 → 最小ロール付与 → 再デプロイ、の順に進めればOKです。
何が起きているのかをひと目で(EventarcのサービスID作成失敗)
- Functions v2 は Eventarc を内部利用します。
- 初回セットアップで「service-<プロジェクト番号>@gcp-sa-eventarc.iam.gserviceaccount.com」を自動作成します。
- 権限不足やAPI未有効だと、ここで止まります。
解決の最短手順と推奨手順(最小権限)
- 最短(暫定):
<プロジェクトID>@appspot.gserviceaccount.com
に強い権限を一時付与して通します(非推奨)。 - 推奨(本命):必要APIをON → EventarcのサービスIDを作成 → 最小ロール付与 → 再デプロイ。
この記事で分かること(原因・確認・対処・再発防止)
- 原因:権限不足やAPI未有効でサービスIDが作れない。
- 確認:エラーメッセージとIAM/APIの状態をチェック。
- 対処:API有効化→サービスID作成→ロール付与。
- 再発防止:最小権限設計に移行、暫定強権は外す。
まずは結論
- 原因:EventarcのサービスID作成権限不足。
- 対処:API有効化 → サービスID作成 → ロール付与 → 再デプロイ。
- 補足:
<プロジェクトID>@appspot.gserviceaccount.com
に強権付与でも通りますが、権限が強すぎるため非推奨です。
表示されたエラーと状況
エラー全文
Error: Error generating the service identity for eventarc.googleapis.com.
いつ出るか
- Cloud Functions v2 の初回デプロイや構成変更時。
- Firebase CLI が Eventarc を自動セットアップするタイミング。
原因のカンタン説明
Eventarcとは?
- Functions v2 が使うイベント配信の土台です。
- 最初に Google 管理のサービスアカウント(サービス エージェント)が必要です。
失敗の主な理由
- Eventarc / Cloud Run / Pub/Sub などの APIが未有効。
- サービスIDを作るための 権限が足りない。
- 組織ポリシーでサービスアカウント作成が禁止。
最短の回避策(暫定手段)
appspotのSAに強権付与
Google Cloud コンソール「IAMと管理 → IAM」で、<プロジェクトID>@appspot.gserviceaccount.com
に以下のロールを一時付与します。
- Cloud Functions 管理者(強い権限)
- 編集者(Editor)
メリット:すぐ通ります。
デメリット:権限が広く、セキュリティ上おすすめできません。
暫定は外す前提で
- 成功後は推奨手順へ移行します。
- 付けた強権は削除しましょう。
推奨の解決手順(最小権限)
1. 必要APIを有効化
- 「Eventarc API」 / 「Cloud Run Admin API」 / 「Pub/Sub API」 / 「Cloud Functions API」 / 「Cloud Storage API」をON。
- 例:
eventarc.googleapis.com
など。
Cloud Shell例(任意)
gcloud services enable \
eventarc.googleapis.com run.googleapis.com pubsub.googleapis.com storage.googleapis.com \
--project <プロジェクトID>
2. サービスIDを作成
作られるメール形式:service-<プロジェクト番号>@gcp-sa-eventarc.iam.gserviceaccount.com
Cloud Shell例(任意)
gcloud beta services identity create \
--service=eventarc.googleapis.com \
--project=<プロジェクトID>
3. 必要ロールを付与
上記サービスIDに次を付与します。
roles/eventarc.serviceAgent
Cloud Shell例(任意)
PROJECT_NUMBER=$(gcloud projects describe <プロジェクトID> --format='value(projectNumber)')
gcloud projects add-iam-policy-binding <プロジェクトID> \
--member="serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-eventarc.iam.gserviceaccount.com" \
--role="roles/eventarc.serviceAgent"
4. 再デプロイで確認
firebase deploy --only functions -P <エイリアス>
Google Cloud コンソールだけでやる操作手順
APIをONにする
- 「APIとサービス → ライブラリ」を開きます。
- 「Eventarc API」 / 「Cloud Run Admin API」 / 「Pub/Sub API」 を検索しそれぞれ「有効化」。(ボタンが「管理」になっていればOK)
- 「Cloud Functions API」 / 「Cloud Storage API」も「有効」ならOKです。
IAMの確認と付与
- 「IAMと管理 → IAM」でサービスアカウントを検索します。
service-<プロジェクト番号>@gcp-sa-eventarc.iam.gserviceaccount.com
を探します。- 見つかったら
roles/eventarc.serviceAgent
を付与します。
プロジェクト番号の調べ方
Google Cloud コンソールで確認
- 「ホーム」や「IAMと管理 → 設定」に Project number(数値)が表示されます。
Firebaseで確認
- 歯車 → 「プロジェクトの設定 → 全般」に番号があります。
Cloud Shellで確認
gcloud projects describe <プロジェクトID> --format='value(projectNumber)'
再発防止と最小権限設計
専用サービスアカウント
- 実行用SAを作成し、Functionsで
runWith({ serviceAccount })
を指定します。
付与する最小ロール例
- Secret Manager 読取:
secretmanager.secretAccessor
- Firestore:
datastore.user
- Storage:
storage.objectViewer
(書込ありはobjectAdmin
)
暫定強権は外す
<プロジェクトID>@appspot.gserviceaccount.com
の広い権限は削除します。
ありがちチェックリスト
よくある見落とし
- APIが未有効。
- プロジェクトIDの取り違え。
- 組織ポリシーでサービスアカウント作成が禁止。
ログで確認する
デプロイログや Cloud Run ログに初期化行が出ていればOKです。
admin initialized { storageBucket: '<プロジェクトID>.firebasestorage.app', ... }
まとめ
今日の学び
- 本質は Eventarc のサービスID不足でした。
- APIをONにしてサービスIDを作り、ロールを付ければ解消します。
- 動いたら最小権限運用に移し、暫定の強権は外しましょう。
コメント