背景
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分だけ追加されるだけでした。
よかったよかった
(下記どうしてもマスクだらけになり、すみません)