ジョブのインメモリ ボリュームのマウント

このページでは、Cloud Run のボリューム マウントを使用したファイルの読み取りと書き込みで使用可能な専用のインメモリ ボリュームを構成する方法について説明します。この機能は、Cloud Run が提供する組み込みのインメモリ ファイル システムとは異なります。

インメモリ ボリュームを使用すると、次のことができます。

  • インメモリ ボリュームのサイズを制限します。ボリュームのサイズを制限すると、ボリューム全体への書き込みが失敗します。これは、ボリュームが大量のメモリを消費したときに Cloud Run でインスタンスを終了するのではなく、この方法を使用することをおすすめします。
  • 1 つの Cloud Run インスタンスの異なるコンテナ間でインメモリ ボリュームを共有します。

動作

インメモリ ボリュームを作成する場合は、サイズの上限を指定することをおすすめします。ボリュームがサイズの上限に達すると、それ以上の書き込みはメモリ不足エラーで失敗します。インスタンスは、このエラーを処理して実行を継続できます。

サイズの上限はあくまでも上限です。インメモリ ボリュームに追加容量を割り当てることはありません。インメモリ ボリュームは、コンテナ用に構成したメモリを消費します。複数のコンテナをデプロイした場合、ボリュームへの書き込みごとに使用されるメモリは、データを書き込んだコンテナのメモリ使用量としてカウントされます。

サイズの上限を指定しないと、上限は、ジョブまたはサービス内のすべてのコンテナの合計サイズの半分に自動的に設定されます。たとえば、emptyDir ボリューム サイズ = [メモリ(コンテナ A) + メモリ(コンテナ B) + メモリ(コンテナ N)] ÷ 2 となります。このデフォルトの動作では、インメモリ ボリュームのサイズの上限が、一部のコンテナに割り当てられたメモリよりも大きくなる可能性があります。この状況で、コンテナがメモリの内容をボリュームに書き込み続けると、割り当てられたメモリを超え、ボリューム サイズの上限に達する前にクラッシュします。

サイズの上限の設定は任意ですが、コンテナのメモリ不足やクラッシュを防ぐため、設定することをおすすめします。

ボリュームの所有権は実行環境とデプロイタイプによって異なる

ボリュームをマウントする場合、ファイルとディレクトリを所有する ID は、ワークロードの実行環境や、デプロイが 1 つまたは複数のコンテナで構成されているかどうかによって異なります。

単一のコンテナをデプロイする第 1 世代の実行環境の場合、コンテナに使用されている ID がボリュームを所有します。それ以外の場合はすべて、root がボリュームを所有します。以下に例を示します。

  • 複数のコンテナをデプロイする第 1 世代の実行環境
  • 第 2 世代の環境

インメモリ ボリュームを構成する

構成を変更すると、新しいリビジョンが作成されます。明示的に更新しない限り、以降のリビジョンでも、この構成が自動的に設定されます。

Cloud Run サービスのインメモリ ボリュームを構成すると、起動した Cloud Run インスタンスごとに空のボリュームが作成されます。このボリュームは、そのインスタンスが実行されている間、存続します。インスタンスの実行が停止すると、ボリューム内のデータは完全に削除されます。

コマンドライン

  • ボリュームを追加してマウントするには:

    gcloud beta run jobs update JOB \
    --add-volume=name=VOLUME_NAME,type=in-memory,size-limit=SIZE_LIMIT \
    --add-volume-mount=volume=VOLUME_NAME,mount-path=MOUNT_PATH

    次のように置き換えます。

    • JOB: ジョブの名前。
    • VOLUME_NAME は、ボリュームに付ける名前に置き換えます。VOLUME_NAME 値は、ボリュームをボリューム マウントにマッピングするために使用されます。
    • MOUNT_PATH は、このボリュームをマウントするコンテナ ファイル システム内の相対パス(/cache など)に置き換えます。
    • SIZE_LIMIT は、ボリュームに割り当てるメモリ上限を MiB または GiB 単位(Mi または Gi などで指定)に置き換えます(例: 500Mi)。この上限は、コンテナに指定された合計メモリより小さくする必要があります。
  • 複数のコンテナを使用している場合は、まずボリュームを指定してから、各コンテナのボリューム マウントを指定します。

    gcloud beta run jobs update JOB \
    --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

  1. 新しいジョブを作成する場合は、この手順をスキップします。既存のジョブを更新する場合は、その YAML 構成をダウンロードします。

    gcloud run jobs describe JOB_NAME --format export > job.yaml
  2. 次に示すように、volumeMounts 属性と volumes 属性を構成します。

    apiVersion: run.googleapis.com/v1
    kind: Job
    metadata:
      name: JOB_NAME
    metadata:
     annotations:
      run.googleapis.com/launch-stage: BETA
    spec:
      template:
        metadata:
        spec:
          containers:
          - image: IMAGE_URL
            volumeMounts:
            - mountPath: MOUNT_PATH
              name: VOLUME_NAME
          volumes:
          - name: VOLUME_NAME
            emptyDir:
              sizeLimit: SIZE_LIMIT
              medium: Memory
    

    次のように置き換えます。

    • IMAGE_URL: コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/hello:latest など)。Artifact Registry を使用する場合は、リポジトリ REPO_NAME がすでに作成されている必要があります。URL の形式は LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG です。
    • VOLUME_NAME は、ボリュームに付ける名前に置き換えます。VOLUME_NAME 値は、ボリュームをボリューム マウントにマッピングするために使用されます。
    • MOUNT_PATH は、このボリュームをマウントするコンテナ ファイル システム内の相対パス(/cache など)に置き換えます。
    • SIZE_LIMIT は、ボリュームに割り当てるメモリ上限を MiB または GiB 単位(Mi または Gi などで指定)に置き換えます(例: 500Mi)。この上限は、コンテナに指定された合計メモリより小さくする必要があります。
  3. 次のコマンドを使用して、サービスを新しい構成に置き換えます。

    gcloud beta run jobs replace job.yaml