Cloud BuildのビルドログをCloud Storageの指定バケットに保存してみた

Cloud Buildで構成ファイルに設定できるlogging設定で、指定のCloud Storageバケットへ保存されるように設定して検証をしてみました。
2024.05.09

データアナリティクス事業本部の根本です。Cloud Buildトリガーを作成するときに、ビルドのログ出力先はあまり気にしていませんでした。リファレンスをよく見ると、指定バケットにも出せる機能があることを知ったので試してみました。

この記事の対象者

  • Cloud Buildでログ出力先を指定バケットにしたいひと

前提条件

  • Cloud Build,Cloud Storage APIが使えること、Cloud BuildとGitgHubリポジトリが連携していること

検証の全体像

  • Cloud Buildトリガーを作成して動かしてみて、ビルドログが指定のCloud Storageバケットに保存されるか確認する
    以下のようなイメージです。

やってみる

Cloud Buildのログ設定に関して確認する

Cloud Buildでトリガー作成する際に、Cloud Build構成ファイル(cloudbuild.yamlのような)を作成しますが、この構成ファイル内でlogging設定が可能です。以下に設定可能オプションをリファレンスをもとに記載しました。

設定値 概要
LOGGING_UNSPECIFIED ログ設定を省略した場合。デフォルトはLEGACYとなるが将来動作が変更される可能性もあるとのこと(※注)
LEGACY Cloud LoggingとCloud Storageに保存
GCS_ONLY Cloud Storageに保存
STACKDRIVER_ONLY 非推奨。CLOUD_LOGGING_ONLYと同じとのこと
CLOUD_LOGGING_ONLY Cloud Loggingに保存。ログのストリーミングはされない
NONE ログを保存しない

※注

The service determines the logging mode. The default is LEGACY. Do not rely on the default logging behavior as it may change in the future.

引用:公式リファレンス

今回は、上記のオプションの中でもGCS_ONLYを設定して指定のCloud Storageバケットへログが出力されるようにしてみます。

Cloud Build構成ファイルの準備

以下のBuild構成ファイルを作成しました。トリガー作成に関してはこちらの記事をご参照ください。

cloudbuild.yaml

steps:
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
    echo "Hello Cloud Build!"
logsBucket: 'gs://バケット名'
options:
      logging: GCS_ONLY

とても簡素なBuild構成ファイルで、実行するとログにHello Cloud Build!と出力されます。リソース作成などはしません。
大事なところを説明しますと、 logsBucketにてログを保存するバケットを指定します。
optionsはCloud Storageのみにログ保存するのでGCS_ONLYを指定します。

上記のビルド構成ファイルをGitHUBリポジトリにPUSHして、トリガーを起動します。注意点として、ビルドトリガーに設定しているサービスアカウントにストレージ管理者ロールが付与されていないと、Cloud Buildトリガーが起動に失敗してしまい、以下のメッセージが画面に出力されます。

ビルドを実行できませんでした: invalid bucket "バケット名"; default Cloud Build service account or user-specified service account does not have access to the bucket

Build構成ファイルの準備ができたらトリガーを実行しましょう!

トリガー実行してみる

トリガーを実行したら、ログを確認してみます。 無事ログが出ていました。
下の方にこっそりとHello Cloud Buildしているのが確認できました。
今回初めてCloud Storageのみにログ記録、という設定にしてみたのですが、ログ内容は同じでも表示のレイアウトがCloud Loggingだけにした場合とで異なっているなと感じました。せっかくなので比較してみます。
画像左はCloud Storage、右はCloud Loggingです。右側、Cloud Loggingの方は、当たり前ですがCloud Loggingそのものですよね。
左のCloud Storageの方は、テキストデータをそのまま出力したようなログになっています。
それではCloud Storageにログファイルが出力されているかと、その中身も見てみます。
Cloud Storageのバケットにログファイルが出力されていました。以下が内容抜粋です。

00826eea143f: Pull complete
1da149176f2b: Verifying Checksum
1da149176f2b: Download complete
d4c3349d0186: Pull complete
487266b545b9: Pull complete
5971bf96c54f: Verifying Checksum
5971bf96c54f: Download complete
5971bf96c54f: Pull complete
1da149176f2b: Pull complete
4a81acf976a0: Pull complete
Digest: sha256:d136dc36b6703c25755706eb7e2bc1eaf18d16963f72b48197cd3f1e7727a411
Status: Downloaded newer image for gcr.io/google.com/cloudsdktool/cloud-sdk:latest
gcr.io/google.com/cloudsdktool/cloud-sdk:latest
Hello Cloud Build!
PUSH
DONE

当然ですが、テキストファイルの内容はCloud Buildのログ画面で確認した内容と同一でした。
Cloud Buildのログ確認画面でCloud Storageのみにログ記録した方は、ログのテキストファイルをそのまま画面に表示しただけのように見えます。ログの行ごとのタイムスタンプもついていませんでした。てっきりどちらのオプションもログを画面で見た時の見た目は変わらないと思っていたので意外でした。
とりあえず、今回の検証目的である指定バケットへのログの出力が確認できたのでよしとします。

おわりに

今までCloud Buildのログ出力先を意識していなかったのですが、調べてやってみると意外と違いや注意点もあるものだなと思いました。これからビルド構成ファイルにログ出力設定をするときはワークロードを踏まえ最適なオプションを選びたいと思います。この記事がどなたかのお役に立てば幸いです。それではまた。

参考

ユーザが作成したバケットへのビルドログの保存