🐵

サクッとgsutil(Mac)

2024/01/25に公開

はじめに

  • Mac ユーザ (Apple Silicon)
  • Unity と C# 周辺のことしかやってこなかった
  • Addressables を使い始めた, Google Cloud Storage にアセットバンドルを置きたい

前提

こちらを見て homebrew のインストールを終えていること

https://zenn.dev/gahuto/articles/9b39b0058f3852

gsutil とは

コマンドラインから HTTPS を使用して Cloud Storage にアクセスするツール

Google Cloud CLI の一部としての gsutil のインストール することを推奨されている

インストール

ターミナルを立ち上げて homebrew からインストール

brew install google-cloud-sdk

自分の環境だと次のエラーがでた

python@3.11: the bottle needs the Apple Command Line Tools to be installed.
  You can install them, if desired, with:
    xcode-select --install

...

Apple のコマンドラインツールを先にインストールにしてね、とのこと

どうやら本パッケージのインストールの過程で Python 3.11 もインストールするのだが、そのときに Apple のコマンドラインツールを使用するためらしい

なので次を実行 (インストールに10分ほど要した)

xcode-select --install

その後、改めて次を実行

brew install google-cloud-sdk

インストールの過程で次のような表示がされる

To add gcloud components to your PATH, add this to your profile:

  for bash users
    source "$(brew --prefix)/share/google-cloud-sdk/path.bash.inc"

  for zsh users
    source "$(brew --prefix)/share/google-cloud-sdk/path.zsh.inc"
    source "$(brew --prefix)/share/google-cloud-sdk/completion.zsh.inc"

  for fish users
    source "$(brew --prefix)/share/google-cloud-sdk/path.fish.inc"

インストールが終わったら、環境に応じて上記の3通りから1つを選ぶ

ホームディレクトリ ~/ にある .zshrc をテキストエディタで開く (なければ新規作成)

上記3通りから選んだコマンドを貼り付けて保存する
(下記は zsh の場合)

source "$(brew --prefix)/share/google-cloud-sdk/path.zsh.inc"
source "$(brew --prefix)/share/google-cloud-sdk/completion.zsh.inc"

これで いつでも zsh が起動したら Google Cloud CLI に必要なファイルが読み込まれるようになる

インストール直後の今回は最後に以下を実行して手動で読み込ませる

source ~/.zshrc

最後にバージョン確認コマンドで動作確認

gcloud --version
Google Cloud SDK 461.0.0
bq 2.0.101
core 2024.01.22
gcloud-crc32c 1.0.0
gsutil 5.27

アカウント連携

初期化コマンドを実行する

gcloud init

ログインすることを求められるので Y 押下

You must log in to continue. Would you like to log in (Y/n)?  y

すると、ブラウザが立ち上がり Google アカウントにログインしてアクセスを許可することを求められるので従う

連携を終えると次に最初にアクセスするプロジェクトを選択するに求められるので表示された中から選んで番号を入力する

You are logged in as: [yourname@gmail.com].

Pick cloud project to use: 
 [1] your-project-a
 [2] your-project-b
 [3] your-project-c

...

Please enter numeric choice or text value (must exactly match list item):  2

使い方

代表的なコマンドをいくつか

最上層のバケットの一覧を確認する

gsutil ls
gs://bucket-a/
gs://bucket-b/
gs://bucket-c/

パスを指定すると配下のオブジェクトを確認できる

gsutil ls gs://bucket-b/
gs://bucket-b/object1
gs://bucket-b/object2

バケットのメタ情報を知りたい場合

gsutil ls -L  gs://bucket-b/
Creation time:          Sat, 20 Jan 2024 10:10:31 GMT
Update time:            Thu, 25 Jan 2024 07:37:48 GMT
Storage class:          STANDARD
Cache-Control:          public, max-age=3600
Content-Length:         14904
Content-Type:           application/json
Hash (crc32c):          hogehoge==
Hash (md5):             hogehogehoge==
ETag:                   mogemogemgoe=
Generation:             12345678901234567890
Metageneration:         2
ACL:                    []

オブジェクトの詳細情報を知りたい場合

gsutil ls -l gs://bucket-b/object1
14904  2024-01-20T10:10:31Z  gs://bucket-b/object1 TOTAL: 1 objects, 14904 bytes (14.55 KiB)

本題

そもそもやりたかったこと

  • Unity の Addressables を使い始めた, Google Cloud Storage にアセットバンドルを置きたい
  • バケットを作ってアセットバンドル群をアップロード
  • あるタイミングである同名ファイルをアップロードし直した
  • なぜか更新されない...

原因はオブジェクト(ファイル)のデフォルトキャッシュ時間が3600秒(1時間)だったため

バケット配下の全てのオブジェクトのメタ情報を書き換えてキャッシュ時間を短くしたい

そこで次のコマンドを実行した (0秒はなんか怖かったので30秒に)

gsutil setmeta -r -h 'Cache-Control:public, max-age=30' gs://bucket-a
Setting metadata on gs://bucket-a/AAS-TEST/StandaloneOSX/AssetBundles/catalog_1.0.1.hash...
Setting metadata on gs://bucket-a/AAS-TEST/StandaloneOSX/AssetBundles/catalog_1.0.1.json...
/ [2 objects]                                                                   
==> NOTE: You are performing a sequence of gsutil operations that may
run significantly faster if you instead use gsutil -m setmeta ...
Please see the -m section under "gsutil help options" for further
information about when gsutil -m can be advantageous.

Setting metadata on gs://bucket-a/AAS-TEST/StandaloneOSX/AssetBundles/prefabs_assets_all_6b45ae4ca8398a6adf904fc49f2826aa.bundle...
Setting metadata on gs://bucket-a/AAS-TEST/StandaloneOSX/AssetBundles/sprites_assets_all_3668aae31b55beb93a90767f8a6915d6.bundle...
Setting metadata on gs://bucket-a/AAS-TEST/StandaloneOSX/AssetBundles/sprites_assets_all_57aca74027df5416b1a5dc2222b60eaa.bundle...

/ [3 objects]                                                                  
Operation completed over 3 objects.    

メタデータを覗くと Cache-Control:public, max-age=30 になっていることを確認できる

gsutil ls -L  gs://bucket-a/AAS-TEST/StandaloneOSX/AssetBundles/catalog_1.0.1.hash
Creation time:          Sat, 20 Jan 2024 10:10:31 GMT
Update time:            Thu, 25 Jan 2024 07:37:48 GMT
Storage class:          STANDARD
Cache-Control:          public, max-age=30
Content-Length:         32
Content-Type:           application/octet-stream
Hash (crc32c):          hogehoge==
Hash (md5):             hogehogehoge==
ETag:                   mogemogemgoe=
Generation:             12345678901234567890
Metageneration:         2
ACL:                    []

実際にファイルをアップロードして30秒すぎたら更新された。

めでたし、めでたし

Discussion