LoginSignup
5
3

More than 1 year has passed since last update.

CloudBuildからCloudRunデプロイ時に出た権限エラーと解決策

Last updated at Posted at 2023-01-21

背景

GitHub Actionsを使いCloudBuild経由でCloudRunへ継続的デプロイさせようとした時に、想定外の権限エラーが出てつまづいたので、同じことに遭遇した人の助けになればと思い書きました。

エラー内容

デプロイステップで下記のエラーが出た。(CloudLoggingから抜粋)

ERROR: (gcloud.run.deploy) PERMISSION_DENIED: Permission 'iam.serviceaccounts.actAs' 
denied on service account {CloudRunサービスアカウント名}@{GCPプロジェクト名}.iam.gserviceaccount.com

一見すると、CloudRunのサービスアカウントにiam.serviceaccounts.actAsの権限が足りていないように見えたので、この権限が含まれているサービスアカウントユーザー(roles/iam.serviceAccountUser) ロールを追加してみたが、再度デプロイしてもエラー。。

解決策

CloudRunのサービスアカウント自体に権限が足りていないのではなく、CloudRunサービスアカウントをCloudBuildが借用する権限が無いのが原因だった。

  • 誤:CloudRunサービスアカウントにroles/iam.serviceAccountUserを追加
  • 正:CloudRunサービスアカウントへのアクセス権限roles/iam.serviceAccountUserロールでCloudBuildプリンシパルを追加

ドキュメントでは、下記のように書かれている

Cloud Run にデプロイするには、Cloud Run 管理者とサービス アカウント ユーザーのロールを Cloud Build サービス アカウントに付与します。

権限付与の手順

GCPコンソール画面からの場合

この権限を付与する場合であれば、下記ドキュメントに沿って簡単に設定可能。

terraformからの場合

下記でOK

resource "google_service_account" "cloud_run_sa" {
  project      = var.project-name
  account_id   = "sample-sa"
  display_name = "sample-sa"
  description  = "CloudRunに紐づけるサービスアカウント"
}

# CloudBuild が Cloud Runサービスアカウントの権限借用するのを許可する設定
resource "google_service_account_iam_member" "by_cloudbuild" {
  service_account_id = google_service_account.cloud_run_sa.name
  role               = "roles/iam.serviceAccountUser"
  member             = "serviceAccount:${var.project-number}@cloudbuild.gserviceaccount.com"
}

しかしながら、「これをapplyするとCloudRunサービスアカウントへの既存のアクセス権限が失われるんじゃないか」と思い、検証してみましたが、apply後も既存は削除されずcloudbuild分だけ追加されるだけでした。
よかったよかった

(下記どうしてもマスクだらけになり、すみません)

  • apply前
    image.png

  • apply後
    image.png

参考

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3