Rails × Cloud Run で Cloud Storage をマウントする方法

こんにちは。デザイン・システム室の永野です。

今回は、Rails × Cloud Run で Cloud Storage をマウントする方法についてまとめてみました。

今後、Cloud Run のマウント先として Google Cloud Storage を選択したときの参考になれば幸いです。

構成について

Cloud Run にデプロイする Rails アプリケーションと Cloud Storage の構成は以下の通りです。

なお、データベースについては、PostgreSQL や MySQL ではなく、コストを抑えるために sqlite3 を採用しました。

ローカル環境で作成した Rails アプリケーションを Cloud Run にデプロイする手順については、こちらの記事を参考に行いました。

つまずいたポイント:マウントパスの設定

Cloud Storage をマウントした状態で Rails アプリケーションを Cloud Run 上で起動したところ、アプリ起動時に生成される SQLite ファイルが Cloud Storage に保存されないという問題に直面しました。

原因を調べたところ、Cloud Run におけるマウント先のパスと、config/database.yml に記載した SQLite ファイルのパスが一致していなかったことが原因でした。

つまり、Cloud Storage 上に SQLite ファイルを保存するには、マウントパスと database.yml に設定するパスを一致させる必要があるようです。

database.yml の設定

作成した database.yml ファイルは下記の通りです。

# config/database.yml
default: &default
  adapter: sqlite3
  pool: 5
  timeout: 5000

development:
  <<: *default
  database: /storage/production.sqlite3

production:
  <<: *default
  database: /storage/production.sqlite3

Cloud Run のマウント設定

また、Cloud Run にデプロイする際、Cloud Storage をボリュームとしてマウントすることができます。その際、適切なマウントパス(例:/storage)を指定すれば、database.yml に設定した SQLite ファイルの保存先として機能します。

今回指定したマウントパスは /storage でした(下記画像参照)。

このように設定することで、Cloud Run にデプロイした Rails アプリケーションが起動時に生成する SQLite ファイルが、Cloud Storage 上のバケットに保存されるようになりました。

まとめ

今回は、Rails × Cloud Run 環境で Cloud Storage をマウントする方法についてご紹介しました。

もともと、Cloud Run でコンテナを起動する際にストレージをマウントするという発想はあまりありませんでした。

しかし、今回の取り組みを通じて、Cloud Storage のような外部ストレージをマウントしておくことで、コンテナが停止しても再起動時にデータを永続化できる仕組みを構築できることを学びました。

今後は、より柔軟で信頼性の高いアプリケーション構成を目指して、このようなストレージの活用方法も積極的に取り入れていきたいと思います。

現在デザイン・システム室では、新しいメンバーを募集しています。
少しでも興味を持たれた方は、ぜひご応募ください。
皆様からのご応募、心よりお待ちしております。

参考

https://cloud.google.com/ruby/rails/run

https://cloud.google.com/run/docs/configuring/services/cloud-storage-volume-mounts?hl=ja