GCP Cloud Build でのログが閲覧できない場合
状況
Cloud Build をサービスアカウントではなく、ローカルからユーザアカウントで実行するケースです。
ユーザアカウントには以下だけを付与しました。
- 事前定義の役割
- Cloud Build 編集者
- Cloud Build 閲覧者
- カスタムの役割
- serviceusage.services.use
- storage.buckets.get
- storage.buckets.list
- storage.objects.create
- storage.objects.get
参考: アクセス制御の構成 Cloud Build - Google Cloud
これでローカルから gcloud builds submit
を実行します。cloudbuild.yaml
はいたってシンプルで以下のようなものでした。
steps: - name: mcr.microsoft.com/dotnet/core/sdk:3.1 entrypoint: dotnet args: ['test']
何が起こったか?
コンソールは機嫌よく流れていたのですが、最後に予期しないメッセージが出ました。
Uploading tarball of [.] to [gs://project_name_cloudbuild/source/1577437549.75-bdc6a9c4b39f41149b4100a7182845ad.tgz] Created [https://cloudbuild.googleapis.com/v1/projects/project_name/builds/fcab81a7-9fd7-499f-95b5-8c30b9873810]. Logs are available at [https://console.cloud.google.com/gcr/builds/fcab81a7-9fd7-499f-95b5-8c30b9873810?project=737792630319]. ERROR: (gcloud.builds.submit) HTTPError 403: <?xml version='1.0' encoding='UTF-8'?><Error><Code>AccessDenied</Code><Message>Access denied.</Message><Details><メールアドレス> does not have storage.objects.get access to xxxxxxx.cloudbuild-logs.googleusercontent.com/log-fcab81a7-9fd7-499f-95b5-8c30b9873810.txt.</Details></Error>
この状態で Cloud Build の画面を見ると以下のようになります。
最初は何が起こっているかわからず、ストレージ管理者やログ閲覧者など、思いつく権限を付けてみたのですが状況は変わらず。
デフォルトでログが配置される場所は自分たちの管理している Storage ではない
確かにログには storage.objects.get
の権限が無いとなっていますが、その後ろについているおそらく storage 名であるものが自分のアカウントには存在しません。
上記の記事にあるように「Project 閲覧」という強い権限を付けるか、ログの保存先を自分たちの storage にすることが対処になります。
cloudbuild.yaml の修正
steps: - name: mcr.microsoft.com/dotnet/core/sdk:3.1 entrypoint: dotnet args: ['test'] logsBucket: 'gs://xxxxx-cloud-build-log-dev'
上記のように自分たちの管理している storage に変更することで問題なくログの閲覧もできました。
参考
- Google Cloud Build - View logs permissions - Stack Overflow
- アクセス制御ガイド | Stackdriver Logging ドキュメント | Google Cloud
- Missing permissions on cloud container builder role · Issue #120 · GoogleCloudPlatform/cloud-builders · GitHub
- Google Cloud Platform Console に適用される Cloud IAM 権限 | Cloud Storage | Google Cloud
- 請求が発生するプロジェクトには
serviceusage.services.use
が必要というのは知らなかったのでした
- 請求が発生するプロジェクトには