はじめに
こんにちは、DX開発事業部の田村です。
2024年11月12日、Cloud Runサービスでインメモリボリュームのマウントが一般公開(GA)されました。
Cloud Runでインメモリボリュームを構成するとプログラミング言語のファイル操作によって、ローカルディレクトリのようにインメモリでファイルを扱うことができます。
Google Cloudのドキュメントに手順が記載されていますので実際にコンソールで設定しながら試してみたいと思います。
Cloud Runでインメモリボリュームを設定する手順
大きく2ステップで簡単に設定することができます。
1. インメモリボリュームを作成する
ボリュームのタイプで「インメモリ」を選択し、「ボリューム名」には任意の名前を設定します。
サイズ制限では使用可能なメモリの最大量を設定することができ、ボリュームがいっぱいになると書き込みが失敗します。
※サイズ制限を指定しない場合、デフォルトではジョブやサービス内のコンテナ合計サイズの半分に設定されます。
2. ボリュームをマウントする
コンテナタブにて「+ボリュームをマウント」を押下して事前に作成したボリュームを選択し、マウント先の任意のパスを設定します。
インメモリ操作を試す
Cloud Runでインメモリボリュームを設定し、Pythonでファイル操作を試します。
実行すると年月日時分秒とともにメッセージをログファイルに書き込み、標準出力して動作確認をします。
以下、サンプルのソースコードです。
import logging logging.basicConfig( filename='/mnt/my-volume/example.log', encoding='utf-8', level=logging.DEBUG, format="%(asctime)s - %(levelname)s - %(message)s", datefmt='%Y/%m/%d %H:%M:%S' ) logging.debug("サンプルメッセージ") with open('/mnt/my-volume/example.log', 'r') as f: print(f.read())
何度か実行してみると、インメモリ内でログ出力を行いファイルの読み書きができていることが確認できます。(下図参照)
Cloud Runインスタンスが完全に停止するまで15分ほど待って再度実行してみます。
新しいインスタンスが構成されたため直前まで作成されていたデータは消えていることが確認できました。
Cloud Runのインメモリボリュームを活用するユースケース
- 高速な一時データ処理
- 例: APIリクエストで受け取った画像を一時的に保存してリサイズやフォーマット変換を実施
- データのキャッシュ
- 例: データベースや外部APIで取得したデータを一時保存、セッションデータの一時保存
- ETL処理やバッチ処理での中間データの保存
- 例: データベースから取得したデータをフィルタリングしてから次のステージに渡す際の一時的な保存
インメモリボリューム利用時の注意点
スケールアウト時のデータ
- 1つのインスタンス内:複数コンテナ間でインメモリボリュームを共有可能
- スケールアウト時:各インスタンスごとに個別のボリュームが作成される
注意: インスタンスごとのボリュームは完全に独立しているため、他のインスタンスのデータにアクセスできません。例えば:
- インスタンスA:
/mnt/in-memory-volume/data.txt
に一時ファイルを書き込み - インスタンスB: 同じパスにアクセスしてもファイルは存在しない
インスタンスにIDをつけて、ログ出力した内容を確認してみるとインスタンスごとにデータをインメモリボリュームに保持していることがわかります。(下図参照)
データを長期的に保存する必要がある場合は、Cloud Storageなどの永続ストレージを使用してください。
メモリ使用量のモニタリング
設定したボリュームのサイズより大きいファイルを書き込もうとするとエラーが発生します。エラーをしっかりと返してくれるため、アプリケーションでのメモリ管理が容易になると感じました。
ボリュームに格納したデータはデータを書き込んだコンテナによって予約されているメモリから消費されるようなので、無駄に大量のメモリを消費してCloud Runのインスタンスが終了するよりもしきい値としてメモリサイズを設定しておいて処理全体を制御する方が望ましいと思います。
インメモリボリュームでCloud Runをさらに活用しよう
今回のアップデートにより、Cloud Runで分析処理やリアルタイム処理が一層容易になりました。
これまでCloud Storageをボリュームマウントしていたユースケースも、この機能を使うことでさらなる効率化が期待できます。
ぜひご自身のプロジェクトでもこの機能を試し、インメモリボリュームを活用した効率的なアプリケーション設計に活用してみてください!