本記事では、Cloud StorageバケットをコンテナのボリュームとしてマウントできるようになったCloud Runの新機能について解説します。
はじめに
静的Webサイトの配信にCloud Runのようなサーバーレスサービスを使う場合、バケットに保存したファイルを活用したいケースは多いはずです。Google Cloud Platformの新機能により、これがこれまで以上に手軽になりました。Cloud Runをご存じない方のために補足すると、Googleのスケーラブルなインフラ上でコンテナ化されたworkloadsを実行できるマネージドサービスです。本記事では静的Webサイトを例に取り上げますが、この機能の活用シーンは多岐にわたります。
課題
これまでCloud Runからオブジェクトストレージにアクセスするには、サードパーティ製ツールを使うか、アプリケーション内にクラウドクライアントライブラリを組み込む必要がありました。これでも目的は果たせるものの、アプリケーションのデリバリープロセスにスケーラビリティや運用面のオーバーヘッドが生じがちでした。
しかし先日リリースされたCloud RunのCloud Storageマウント機能により、追加のライブラリを使わずに、Cloud StorageバケットをCloud Runコンテナのボリュームとして直接マウントできるようになりました。
改善点とメリットを押さえたところで、実際のユースケースである「Cloud RunとCloud Storageのボリュームマウントによる静的Webサイトのホスティング」に進みましょう。
ソリューション
まずはアプリケーションとストレージバケットをホストするプロジェクトを作成します。お好みのコマンドラインツールで、ターミナルに環境変数を設定し、gcloudを構成しておきましょう。
export GCP_PROJECT=my-cloud-run-static-site
export REGION=us-east4
gcloud projects create $GCP_PROJECT
gcloud config set project $GCP_PROJECT
次に、これから利用するCloud Run、Cloud Build、Artifact RegistryのAPIを有効化します。
gcloud services enable run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com
続いて、静的サイトのコードをクローンします。
git clone https://github.com/waymanls/my-cloud-run-static-site.git
index.htmlの中身を見ると、画像が/imagesパス配下に配置されていることがわかります。このパスは後ほど使用するので覚えておいてください。まずは静的アセットを格納するCloud Storageバケットを作成し、JPEG画像をアップロードします。
gcloud storage buckets create gs://$GCP_PROJECT-bucket --location=$REGION
gcloud storage cp beach.jpeg gs://$GCP_PROJECT-bucket/beach.jpeg
続いて、Artifact Registryのリポジトリを作成します。
gcloud artifacts repositories create $GCP_PROJECT-repo \
--repository-format=docker \
--location=$GCP_REGION
Artifact Registryのリポジトリができたら、Cloud Buildでコンテナイメージをビルドしてプッシュします。
gcloud builds submit --tag $REGION-docker.pkg.dev/$GCP_PROJECT/$GCP_PROJECT-repo/$GCP_PROJECT-svc
イメージがリポジトリにプッシュされたら、それをもとに第2世代のCloud Runアプリケーションを作成します。
gcloud run deploy $GCP_PROJECT-svc --image $REGION-docker.pkg.dev/$GCP_PROJECT/$GCP_PROJECT-repo/$GCP_PROJECT-svc \
--execution-environment=gen2 --allow-unauthenticated
いよいよ仕上げの工程です。Cloud Storageバケットをコンテナのボリュームとしてアタッチします。これはCloud Runサービスを「更新」する形で行います。今回はgcloudコマンドのオプションで設定値を渡していますが、YAMLのサービスファイルで指定することもできます。下記コマンドのとおり、先ほどindex.htmlで指定した「images」パスを、コンテナボリュームのベースパスおよび名前として使用します。
gcloud run services update $GCP_PROJECT-svc \
--execution-environment=gen2 \
--add-volume=name=images,type=cloud-storage,bucket=$GCP_PROJECT-bucket \
--add-volume-mount=volume=images,mount-path=/usr/share/nginx/html/images
以上の手順を完了すると、Cloud StorageバケットをCloud Runサービス内のボリュームとしてマウントし、そこからオブジェクトを参照できるCloud Runアプリケーションが完成します。

後片付け
作業が終わったら、以下のコマンドでプロジェクトを削除しておくことをおすすめします。
gcloud projects delete $GCP_PROJECT
この方法のメリットは、サーバーレスのCloud Run workloadsをオブジェクトストレージ内の静的アセットへネイティブに直接接続できる点です。これまで必要だったクラウドクライアントライブラリやサードパーティサービスが不要になります。