サービスのインメモリ ボリュームのマウントを構成する

このページでは、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 Build サービス アカウントに追加のロールが付与されている必要があります。

Cloud Run に関連付けられている IAM ロールと権限のリストについては、Cloud Run IAM ロールCloud Run IAM 権限をご覧ください。Cloud Run サービスがGoogle Cloud APIs(Cloud クライアント ライブラリなど)と連携している場合は、サービス ID の構成ガイドをご覧ください。ロールの付与の詳細については、デプロイ権限アクセスの管理をご覧ください。

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

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

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

コンソール

  1. Google Cloud コンソールで Cloud Run に移動します。

    Cloud Run に移動

  2. メニューから [サービス] を選択し、[コンテナをデプロイ] をクリックして新しいサービスを構成します。既存のサービスを構成する場合は、サービスをクリックし、[新しいリビジョンの編集とデプロイ] をクリックします。

  3. 新しいサービスを構成する場合は、最初のサービス設定のページに入力してから、[コンテナ、ボリューム、ネットワーキング、セキュリティ] をクリックしてサービス構成ページを開きます。

  4. [ボリューム] タブをクリックします。

    イメージ

    • [ボリューム] で、次の操作を行います。
      • [ボリュームを追加] をクリックします。
      • [ボリュームのタイプ] プルダウンで、ボリューム タイプとして [インメモリ] を選択します。
      • [ボリューム名] フィールドに、ボリュームに使用する名前を入力します。
      • [完了] をクリックします。
    • [コンテナ] タブをクリックします。
    • [ボリュームのマウント] タブをクリックします。
      • [ボリュームをマウント] をクリックします。
      • メニューからインメモリ ボリュームを選択します。
      • ボリュームをマウントするパスを指定します。
      • [ボリュームをマウント] をクリックします。
  5. [作成] または [デプロイ] をクリックします。

gcloud

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

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

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

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

    gcloud run services update SERVICE \
      --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 services describe SERVICE --format export > service.yaml
  2. 次に示すように、volumeMounts 属性と volumes 属性を構成します。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE_NAME
    spec:
      template:
        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: このボリュームをマウントするコンテナ ファイル システム内の相対パス(/mnt/my-volume など)。
    • SIZE_LIMIT: ボリュームに割り当てるメモリ上限。MiB または GiB 単位(Mi または Gi で指定、例: 500Mi)。この上限は、コンテナに指定された合計メモリより小さくする必要があります。
  3. 次のコマンドを使用して、サービスを作成または更新します。

    gcloud run services replace service.yaml

Terraform

Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。

Terraform 構成の google_cloud_run_v2_service リソースに次の内容を追加します。

resource "google_cloud_run_v2_service" "default" {
  name     = "SERVICE_NAME"
  location = "REGION"

  template {
    containers {
      image = "IMAGE_URL"
      volume_mounts {
        name = "VOLUME_NAME"
        mount_path = "MOUNT_PATH"
      }
    }
    volumes {
      name = "VOLUME_NAME"
      empty_dir {
        medium = "MEMORY"
        size_limit = "SIZE_LIMIT"
      }
    }
  }
}

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

  • SERVICE_NAME: Cloud Run サービスの名前。
  • REGION: Google Cloud のリージョン。例: europe-west1
  • 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: このボリュームをマウントするコンテナ ファイル システム内の相対パス(/mnt/my-volume など)。
  • SIZE_LIMIT: ボリュームに割り当てるメモリ上限。MiB または GiB 単位(Mi または Gi で指定、例: 500Mi)。この上限は、コンテナに指定された合計メモリより小さくする必要があります。

ボリュームの読み取りと書き込み

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 run services update SERVICE \
    --clear-volumes
    --clear-volume-mounts

複数のコンテナがある場合は、サイドカー CLI 規則に沿ってボリュームとボリューム マウントを消去します。

gcloud run services update SERVICE \
    --container=container1 \
    --clear-volumes
    -–clear-volume-mounts \
    --container=container2 \
    --clear-volumes \
    -–clear-volume-mounts

個々のボリュームとボリューム マウントを削除する

ボリュームを削除するには、そのボリュームを使用するすべてのボリューム マウントも削除する必要があります。

個々のボリュームまたはボリューム マウントを削除するには、remove-volume フラグと remove-volume-mount フラグを使用します。

gcloud run services update SERVICE \
    --remove-volume VOLUME_NAME \
    --container=container1 \
    --remove-volume-mount MOUNT_PATH \
    --container=container2 \
    --remove-volume-mount MOUNT_PATH