Firebase Functionのデプロイ時エラー対応

Error: Error generating the service identity for eventarc.googleapis.com. プログラミング

この記事の結論と要点

結論:エラーの正体は、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にする

  1. 「APIとサービス → ライブラリ」を開きます。
  2. 「Eventarc API」 / 「Cloud Run Admin API」 / 「Pub/Sub API」 を検索しそれぞれ「有効化」。(ボタンが「管理」になっていればOK)
  3. 「Cloud Functions API」 / 「Cloud Storage API」も「有効」ならOKです。

IAMの確認と付与

  1. 「IAMと管理 → IAM」でサービスアカウントを検索します。
  2. service-<プロジェクト番号>@gcp-sa-eventarc.iam.gserviceaccount.com を探します。
  3. 見つかったら 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を作り、ロールを付ければ解消します。
  • 動いたら最小権限運用に移し、暫定の強権は外しましょう。

コメント

タイトルとURLをコピーしました