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 の画面を見ると以下のようになります。

f:id:dany1468:20191227183718p:plain

最初は何が起こっているかわからず、ストレージ管理者やログ閲覧者など、思いつく権限を付けてみたのですが状況は変わらず。

デフォルトでログが配置される場所は自分たちの管理している Storage ではない

確かにログには storage.objects.get の権限が無いとなっていますが、その後ろについているおそらく storage 名であるものが自分のアカウントには存在しません。

stackoverflow.com

上記の記事にあるように「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 に変更することで問題なくログの閲覧もできました。

参考