このページでは、Cloud Run のボリューム マウントを使用したファイルの読み取りと書き込みで使用可能な専用のインメモリ ボリュームを構成する方法について説明します。この機能は、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 または YAML を使用します。
gcloud
ボリュームをマウントするには:
gcloud beta run instances update INSTANCE \ --add-volume mount-path=MOUNT_PATH,type=in-memory,size-limit=SIZE_LIMIT
次のように置き換えます。
- INSTANCE: インスタンスの名前。
- MOUNT_PATH: このボリュームをマウントするコンテナ
ファイル システム内の相対パス(
/mnt/my-volumeなど)。 - SIZE_LIMIT: ボリュームに割り当てるメモリ上限。MiB または GiB 単位(Mi または Gi として指定、例:
500Mi)。この上限は、コンテナに指定された合計メモリより小さくする必要があります。
複数のコンテナを使用している場合は、まずボリュームを指定してから、 各コンテナのボリューム マウントを指定します。
gcloud beta run instances update INSTANCE \ --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
YAML
新しいインスタンスを作成する場合は、この手順をスキップしてください。 既存のインスタンスを更新する場合は、その YAML 構成をダウンロードします。
gcloud beta run instances describe INSTANCE --format export > instance.yaml
次の例には、YAML 構成が含まれています。
apiVersion: run.googleapis.com/v1 kind: Instance metadata: name: INSTANCE annotations: run.googleapis.com/launch-stage: BETA spec: containers: - name: CONTAINER_NAME image: IMAGE_URL volumeMounts: - name: VOLUME_NAME mountPath: MOUNT_PATH volumes: - name: VOLUME_NAME emptyDir: medium: Memory sizeLimit: SIZE_LIMIT
次のように置き換えます。
- INSTANCE: Cloud Run インスタンスの名前。
- CONTAINER_NAME: コンテナの名前。
IMAGE_URL: コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/hello:latestなど)。- VOLUME_NAME: ボリュームに付ける名前。VOLUME_NAME 値は、ボリュームをボリューム マウントにマッピングするために使用されます。
- MOUNT_PATH: ボリュームをマウントする相対パス(
/mnt/my-volumeなど)。 - SIZE_LIMIT: ボリュームに割り当てるメモリ上限。MiB または GiB 単位(Mi または Gi で指定、例:
500Mi)。この上限 は、コンテナに指定された 合計メモリより小さくする必要があります。
次のコマンドを使用して、インスタンスを作成または更新します。
gcloud beta run instances replace instance.yaml
ボリュームの読み取りと書き込み
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 instances update INSTANCE \ --clear-volumes \ --clear-volume-mounts
個々のボリュームとボリューム マウントを削除する
ボリュームを削除するには、そのボリュームを使用するすべてのボリューム マウントも削除する必要があります。
個々のボリュームまたはボリューム マウントを削除するには、remove-volume フラグと remove-volume-mount フラグを使用します。
gcloud beta run instances update INSTANCE \ --remove-volume VOLUME_NAME \ --container=container1 \ --remove-volume-mount MOUNT_PATH \ --container=container2 \ --remove-volume-mount MOUNT_PATH