😣

Cloud Run の deploy が突如エラーになるようになった件

2024/01/31に公開

概要

デプロイ用サービスアカウントによる gcloud run deploy コマンドについて(Workload Identity 使用)、サービスアカウントが Cloud Run サービスに対する roles/run.developer だとコマンドが失敗するが、実際にはデプロイは成功する、という謎の状態になった。
project に対して roles/run.admin (roles/run.developer でもOK) を与えたら成功するようになった。

他に同じ状況に陥っている人がいなかったのでメモ。

詳細な状況

Cloud Run サービスに対して roles/run.developer を与えていて、gcloud run deploy できていたのに、突如コマンドが失敗するように。

失敗しているのに実際には正常にデプロイ出来ていて、正常に新しいリビジョンに切り替わる という謎の現象。

そして、なぜか ジョブの方は失敗しない

※ジョブ、サービスの両方とも、特定のサービスに対する roles/run.developer を与えている

GCP 側の設定は変更していないのに突如発生。

2024-01-24 に google-github-actions/deploy-cloudrun でエラーに遭遇。
前回デプロイした 2024-01-20 までは正常だった。

エラー内容は以下の通り:

$ gcloud run deploy SERVICE --quiet --image IMAGE --update-labels managed-by=github-actions,commit-sha=xxxxxxxxxxxxxxxxxxxx --platform managed --format json --region asia-northeast1
Deploying container to Cloud Run service [SERVICE] in project [PROJECT] region [asia-northeast1]
X  Deploying...
  -  Creating Revision...
  .  Routing traffic...  
Deployment failed 
ERROR: (gcloud.run.deploy) PERMISSION_DENIED: Permission 'run.operations.get' denied on resource 'projects/PROJECT/locations/asia-northeast1/operations/417fefd7-3fae-4061-b720-05354fbd680f' (or resource may not exist).

※このコマンドは google-github-actions/deploy-cloudrun と同じコマンドを Cloud Shell 上で叩いたときのエラーのコピペ
action 上のエラーも同じ内容

run.operations.get の権限がないと言われているが、実際には roles/run.developer にこの権限はある。しかも Deployment failed と表示されるものの、実際にはデプロイ成功している。

1/23 に google-github-actions/deploy-cloudrun で変更 が入っており、
action で使われる google-github-actions/deploy-cloudrun のバージョンが 1/20 までは 2.0.1 だったが、失敗するようになってからは 2.1.0 になっていた。

※ここでバージョンと言っているのは action のログに現れる環境変数 CLOUDSDK_METRICS_ENVIRONMENT_VERSION の値のこと

google-github-actions/deploy-cloudrun にバグが入り込んだのかと思ったが、
直接 gcloud コマンドを叩いても失敗した。
(オーナー権限では成功したので、サービスアカウントの権限をなんとかすればなんとかなるだろうと理解)

google-github-actions/deploy-cloudrun の修正と同時期に GCP 側でも何かしらの修正が入ってバグが入り込んだのかなとか考えた。
コマンドが失敗扱いになるだけで、デプロイは成功するのでとりあえず放置。

一週間たっても状況が変わらないので、対応することに。

解決

特定の Cloud Run サービスに対して roles/run.developer を与えていたのを、素直に公式ドキュメント通り project に対して roles/run.admin を付与するように変更すると、すんなり解決した。

Cloud Run サービスに対して roles/run.developer ではなく roles/run.admin にしてもだめだった。

roles/run.admin は強すぎるので roles/run.developer を試すと、これも成功。

Discussion