🙌

Cloud Runで複数のGCSバケットをマウントする際の落とし穴と解決策

に公開

データとかログとか、用途別にバケットを分けたいってなると、複数のバケットをCloud Runにマウントしたくなる。

gcloud run deploy でハマりました。


❌ 試してみたけどダメだったコマンド

gcloud run deploy my-service \
  --region us-central1 \
  --source . \
  --add-volume=name=bucket1-vol,type=cloud-storage,bucket=my-bucket-1,name=bucket2-vol,type=cloud-storage,bucket=my-bucket-2 \
  --add-volume-mount=volume=bucket1-vol,mount-path=/mnt/bucket1,volume=bucket2-vol,mount-path=/mnt/bucket2

一部のバケットしかマウントされなかったり、マウントパスが変なことになったりした。原因は、--add-volume--add-volume-mount のパラメータが、1つの引数で複数の設定を受け付けてくれない。カンマで区切って色々書くと、最初の設定以外は無視されるか、変に解釈されるっぽい。


✅ うまくいったコマンド

複数のバケットをマウントするには、--add-volume--add-volume-mountそれぞれのバケットごとに分けて指定する

gcloud run deploy my-service \
  --region us-central1 \
  --source . \
  \
  --add-volume=name=bucket1-vol,type=cloud-storage,bucket=my-bucket-1 \
  --add-volume-mount=volume=bucket1-vol,mount-path=/mnt/bucket1 \
  \
  --add-volume=name=bucket2-vol,type=cloud-storage,bucket=my-bucket-2 \
  --add-volume-mount=volume=bucket2-vol,mount-path=/mnt/bucket2

これで狙い通りに全てのバケットが指定したパスにマウントされて、アプリからアクセスできるようになった。

ポイント

  • 1ボリューム1パラメータ: name, type, bucket を含んだ --add-volume と、volume, mount-path を含んだ --add-volume-mount は、それぞれ1つのバケットにつき1組ずつ書く

備考

  • サービスアカウントの権限: Cloud Runサービスが使うサービスアカウントに、マウントするGCSバケットへの適切なアクセス権限(例えば Storage オブジェクト閲覧者 とか)がちゃんと付いてるかも忘れずにチェック。

Discussion