このページでは、Cloud Run のボリューム マウントを使用したファイルの読み取りと書き込みで使用可能な専用のインメモリ ボリュームを構成する方法について説明します。この機能は、Cloud Run が提供する組み込みのインメモリ ファイル システムとは異なります。
Cloud Run でインメモリ ボリュームをマウントすると、インメモリ ボリュームがコンテナ ファイル システム内のファイルとして表示されます。インメモリ ボリュームをマウントしたら、プログラミング言語のファイル システム オペレーションとライブラリを使用して、ローカル ファイル システム上のディレクトリと同じようにアクセスします。
インメモリ ボリュームを使用すると、次のことができます。
- インメモリ ボリュームのサイズを制限します。ボリュームのサイズを制限すると、ボリューム全体への書き込みが失敗します。これは、ボリュームが大量のメモリを消費したときに Cloud Run でインスタンスを終了するのではなく、この方法を使用することをおすすめします。
- 1 つの Cloud Run インスタンスの異なるコンテナ間でインメモリ ボリュームを共有します。Cloud Run がワーカープールの複数のインスタンスにスケールアウトすると、各ワーカープールには、そのワーカープール上のすべてのコンテナで共有される独自のインメモリ ボリュームが存在します。このボリュームは、Cloud Run がトラフィックを処理するためにスケールアウトするときに、すべてのコンテナで使用できます。
動作
インメモリ ボリュームを作成する場合は、サイズの上限を指定することをおすすめします。ボリュームがサイズの上限に達すると、それ以上の書き込みはメモリ不足エラーで失敗します。インスタンスは、このエラーを処理して実行を継続できます。
サイズの上限はあくまでも上限です。インメモリ ボリュームに追加容量を割り当てることはありません。インメモリ ボリュームは、コンテナ用に構成したメモリを消費します。複数のコンテナをデプロイした場合、ボリュームへの書き込みごとに使用されるメモリは、データを書き込んだコンテナのメモリ使用量としてカウントされます。
サイズの上限を指定しないと、ジョブまたはサービス内のすべてのコンテナの合計サイズの半分が上限として自動的に設定されます。たとえば、emptyDir
ボリューム サイズ = [メモリ(コンテナ A) + メモリ(コンテナ B) + メモリ(コンテナ N)] ÷ 2 となります。このデフォルトの動作では、インメモリ ボリュームのサイズの上限が、一部のコンテナに割り当てられたメモリよりも大きくなる可能性があります。これにより、ボリューム サイズの上限に達していなくても、単一コンテナが割り当てられたメモリを超えてボリュームにデータを書き込もうとすると、予期しないクラッシュが発生する可能性があります。
サイズの上限の設定は任意ですが、コンテナのメモリ不足やクラッシュを防ぐため、設定することをおすすめします。
使用できないパス
Cloud Run では、/dev
、/proc
、/sys
、またはそのサブディレクトリにボリュームをマウントすることはできません。
必要なロール
Cloud Run に関連付けられている IAM ロールと権限のリストについては、Cloud Run IAM ロールと Cloud Run IAM 権限をご覧ください。Cloud Run ワーカープールがGoogle Cloud API(Cloud クライアント ライブラリなど)と連携している場合は、サービス ID の構成ガイドをご覧ください。ロールの付与の詳細については、デプロイ権限とアクセスの管理をご覧ください。
インメモリ ボリュームを構成する
構成を変更すると、新しいリビジョンが作成されます。明示的に更新しない限り、以降のリビジョンでも、この構成が自動的に設定されます。
Cloud Run サービスのインメモリ ボリュームを構成すると、起動した Cloud Run インスタンスごとに空のボリュームが作成されます。このボリュームは、そのインスタンスが実行されている間、存続します。インスタンスの実行が停止すると、ボリューム内のデータは完全に削除されます。
新しいワーカープールを作成するとき、または新しいリビジョンをデプロイするときに、Google Cloud CLI を使用してインメモリ ボリューム マウントを構成します。
gcloud
ボリュームを追加してマウントするには:
gcloud beta run worker-pools update WORKER_POOL \ --add-volume=name=VOLUME_NAME,type=in-memory,size-limit=SIZE_LIMIT \ --add-volume-mount volume=VOLUME_NAME,mount-path=MOUNT_PATH
次のように置き換えます。
- WORKER_POOL は、ワーカープールの名前に置き換えます。
- VOLUME_NAME は、ボリュームに付ける名前に置き換えます。VOLUME_NAME 値は、ボリュームをボリューム マウントにマッピングするために使用されます。
- MOUNT_PATH は、このボリュームをマウントするコンテナ ファイル システム内の相対パス(
/mnt/my-volume
など)に置き換えます。 - SIZE_LIMIT は、ボリュームに割り当てるメモリ上限を MiB または GiB 単位(Mi または Gi などで指定)に置き換えます(例:
500Mi
)。この上限は、コンテナに指定された合計メモリより小さくする必要があります。
複数のコンテナを使用している場合は、まずボリュームを指定してから、各コンテナのボリューム マウントを指定します。
gcloud beta run worker-pools update WORKER_POOL \ --add-volume=name=VOLUME_NAME,type=in-memory,size-limit=SIZE_LIMIT \ --container=CONTAINER_1 \ --add-volume-mount=volume=VOLUME_NAME,mount-path=MOUNT_PATH \ --container=CONTAINER_2 \ --add-volume-mount volume=VOLUME_NAME,mount-path=MOUNT_PATH2
ワーカープールの環境変数構成を確認する
Google Cloud コンソールで Cloud Run に移動します。
[ワーカープール] をクリックして、デプロイされたワーカープールのリストを確認します。
調べるワーカープールをクリックして、詳細ウィンドウを表示します。
[コンテナ] タブをクリックして、ワーカープールのコンテナ構成を確認します。
ボリュームの読み取りと書き込み
Cloud Run のボリューム マウント機能を使用する場合、ローカル ファイル システムでファイルの読み取りと書き込みに使用するプログラミング言語のライブラリを使用して、マウントされたボリュームにアクセスします。
これは、ローカル ファイル システムにデータが保存されることを想定し、通常のファイル システム オペレーションを使用してデータにアクセスする既存のコンテナを使用している場合に特に便利です。
次のスニペットは、mountPath
が /mnt/my-volume
に設定されたボリューム マウントを前提としています。
Node.js
ファイル システム モジュールを使用して、ボリューム /mnt/my-volume
に新しいファイルを作成するか、既存のファイルに追加します。
var fs = require('fs'); fs.appendFileSync('/mnt/my-volume/sample-logfile.txt', 'Hello logs!', { flag: 'a+' });
Python
ボリューム /mnt/my-volume
に保存されているファイルに書き込みます。
f = open("/mnt/my-volume/sample-logfile.txt", "a")
Go
os
パッケージを使用して、ボリューム /mnt/my-volume
に新しいファイルを作成します。
f, err := os.Create("/mnt/my-volume/sample-logfile.txt")
Java
Java.io.File
クラスを使用して、ボリューム /mnt/my-volume
にログファイルを作成します。
import java.io.File; File f = new File("/mnt/my-volume/sample-logfile.txt");
ボリュームとボリューム マウントを消去して削除する
すべてのボリュームとマウントを消去できます。または、個々のボリュームとボリューム マウントを削除することもできます。
すべてのボリュームとボリューム マウントを消去する
単一コンテナのワーカープールからすべてのボリュームとボリューム マウントを消去するには、次のコマンドを実行します。
gcloud beta run worker-pools update WORKER_POOL \ --clear-volumes --clear-volume-mounts
複数のコンテナがある場合は、サイドカー CLI 規則に沿ってボリュームとボリューム マウントを消去します。
gcloud beta run worker-pools update WORKER_POOL \ --container=container1 \ --clear-volumes -–clear-volume-mounts \ --container=container2 \ --clear-volumes \ -–clear-volume-mounts
個々のボリュームとボリューム マウントを削除する
ボリュームを削除するには、そのボリュームを使用するすべてのボリューム マウントも削除する必要があります。
個々のボリュームまたはボリューム マウントを削除するには、remove-volume
フラグと remove-volume-mount
フラグを使用します。
gcloud beta run worker-pools update WORKER_POOL \ --remove-volume VOLUME_NAME \ --container=container1 \ --remove-volume-mount MOUNT_PATH \ --container=container2 \ --remove-volume-mount MOUNT_PATH