Cloud Run ジョブのエフェメラル ディスクを構成する

Cloud Run は、インスタンスの存続期間中のみ存続するエフェメラル ディスク ボリュームを提供します。この機能を使用すると、必要なディスク容量とマウントする場所を指定できます。Cloud Run は、その量のディスクをリソースに割り当てます。

ディスクは自動的にプロビジョニングされ、起動時に ext4 に事前フォーマットされ、インスタンス固有の鍵で暗号化されます。エフェメラル ディスクは、すべてのユーザーが読み取りまたは書き込みできるようにボリュームを作成します。ストレージはエフェメラルであるため、インスタンスがシャットダウンすると、すべてのデータが完全に削除されます。これには、次のような原因によるシャットダウンが含まれます。

  • インスタンスのクラッシュ
  • ジョブタスクの完了(成功または失敗)

ディスクは特定のインスタンス専用であり、他のインスタンスと共有されません。各ボリュームに構成可能なマウント ポイントを使用して、ファイル システム構造を制御できます。

インスタンスをシャットダウンする前に、Cloud Run から SIGTERM シグナルがインスタンス内のすべてのコンテナに送信されます。これは、Cloud Run が SIGKILL シグナルを送信してから 10 秒後に実際のシャットダウンが開始することを表しています。この 10 秒間のウィンドウを使用して、ディスク コンテンツの永続ストレージの最終コピーなどのクリーンアップ オペレーションを実行できます。

ユースケース

エフェメラル ディスクは、次の目的で使用できます。

  • データ処理ワークロード: Cloud Run で大きなデータファイルを処理する場合、通常はファイル全体をメモリに保存するか、小さな部分に分割して調整します。エフェメラル ストレージを使用すると、データのローカル一時コピーを作成するために大量のメモリを購入する必要がなくなります。より大きなデータセットを処理することもできます。
  • キャッシュ保存: ウェブサービス ユースケースでは、リモート ストレージから取得するのではなく、ディスクにデータをキャッシュ保存することで、アプリケーションのレイテンシを最適化できます。

ストレージとインスタンスの上限

次の上限が適用されます。

  • インスタンスのストレージの上限: デフォルトでは、各インスタンスの合計容量は 10 GB に制限されています。必要に応じて、割り当ての増加をリクエストします。
  • インスタンスのボリューム上限: 各インスタンスは最大 10 個のボリュームに制限されます。
  • プロジェクトの上限: デフォルトでは、各プロジェクトはリージョンあたり 100 GB に制限されています。必要に応じて、割り当ての増加をリクエストします。

割り当ての増加をリクエストする

リージョンで Cloud Run エフェメラル ディスクを初めて使用するプロジェクトには、インスタンスあたり 10 GB、リージョンあたり 100 GB の上限が自動的に付与されます。

追加の容量が必要な場合は、Cloud Run ジョブの割り当ての増加をリクエストする必要があります。以下のボタンにあるリンクから、必要な割り当てをリクエストしてください。

現在の割り当て 割り当てリンク
インスタンスあたり 10 GB インスタンスあたりの割り当ての増加をリクエストする
プロジェクトあたり 100 GB プロジェクトごとの割り当ての増加をリクエストする

割り当ての増加のリクエストについて詳しくは、割り当てを増やす方法をご覧ください。

制限事項

次の制限が適用されます。

  • エフェメラル ディスクは、第 2 世代の実行環境でのみ使用できます。デフォルトでは、Cloud Run ジョブは第 2 世代の実行環境を使用します。
  • ライブ マイグレーションは対象外です。つまり、Cloud Run ジョブの信頼性が低下します(特に長時間実行されるジョブ)。

使用できないパス

Cloud Run では、/dev/proc/sys、またはそのサブディレクトリにボリュームをマウントすることはできません。

サポートされるリージョン

エフェメラル ディスク機能は、次のリージョンで利用できます。

  • GPU を使用しないワークロードの場合、エフェメラル ディスクは次の場所で使用できます。
    • asia-northeast1(東京)
    • europe-west1(ベルギー) リーフアイコン 低 CO2
    • northamerica-northeast1(モントリオール) リーフアイコン 低 CO2
    • northamerica-northeast2(トロント) リーフアイコン 低 CO2
    • us-central1(アイオワ) リーフアイコン 低 CO2
    • us-east1(サウスカロライナ)
    • us-east4(北バージニア)
    • us-west1(オレゴン) リーフアイコン 低 CO2
  • GPU を使用する場合、エフェメラル ディスクは GPU をサポートするすべてのリージョンで使用できます。

始める前に

  1. Google Cloud アカウントにログインします。 Google Cloudを初めて使用する場合は、 アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. gcloud CLI をインストールして初期化します
  7. コンポーネントを更新します。
    gcloud components update
  8. CPU、メモリ、ネットワーク下り(外向き)については、Cloud Run の料金ページをご覧ください。プロビジョニングされたディスクのサイズ全体と、それを使用しているインスタンスの存続期間が、費用に影響します。

必要なロール

エフェメラル ディスクの構成に必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。

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

エフェメラル ディスクを作成してマウントする

エフェメラル ディスクは、 Google Cloud コンソール、Google Cloud CLI、YAML、または Terraform を使用して作成してマウントできます。

コンソール

  1. Google Cloud コンソールで、Cloud Run の [ジョブ] ページに移動します。

    Cloud Run に移動

  2. [コンテナをデプロイ] をクリックして、ジョブの初期設定ページに入力します。既存のジョブを構成する場合は、ジョブを選択して [ジョブ構成の表示と編集] をクリックします。

  3. [コンテナ、接続、セキュリティ] をクリックして、ジョブのプロパティ ページを開きます。

  4. [コンテナ] タブをクリックします。

    画像

    • [リソース] で次の操作を行います。
      • [エフェメラル ディスク] を選択します。
      • メニューからエフェメラル ディスクのサイズを指定します。
      • マウントパスを入力します。
  5. [作成] または [更新] をクリックします。

gcloud

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

gcloud beta run jobs update JOB \
    --add-volume=name=VOLUME_NAME,type=ephemeral-disk,size=SIZE \
    --add-volume-mount=volume=VOLUME_NAME,mount-path=MOUNT_PATH

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

  • JOB: ジョブの名前。
  • VOLUME_NAME: ボリュームに付ける名前。
  • SIZE: ディスクサイズ(例: 100Gi)。ephemeral-disk ボリュームの場合、サイズは 10Gi 以上にする必要があります。
  • MOUNT_PATH: ボリュームをマウントする相対パス(/mnt/my-volume など)。

YAML

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

    gcloud run jobs describe JOB_NAME --format export > job.yaml
  2. YAML ファイルを構成します。

    apiVersion: run.googleapis.com/v1
    kind: Job
    metadata:
      name: JOB
      labels:
        cloud.googleapis.com/location: REGION
      annotations:
        run.googleapis.com/launch-stage: BETA
    spec:
      template:
        spec:
          template:
            spec:
              volumes:
              - name: VOLUME_NAME
                emptyDir:
                  medium: Disk
                  sizeLimit: SIZE
              containers:
              - image: IMAGE_URL
                volumeMounts:
                - name: VOLUME_NAME
                  mountPath: MOUNT_PATH
    

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

    • JOB: ジョブの名前。
    • REGION: Google Cloud のリージョン。
    • IMAGE_URL: コンテナ イメージへの参照(例: us-docker.pkg.dev/cloudrun/container/job:latest)。
    • VOLUME_NAME: ボリュームに付ける名前。
    • MOUNT_PATH: ボリュームをマウントする相対パス(/mnt/my-volume など)。
    • SIZE: ディスクサイズ(例: 100Gi)。ephemeral-disk ボリュームの場合、サイズは 10Gi 以上にする必要があります。
  3. 次のコマンドを使用して、ジョブを作成または更新します。

    gcloud run jobs replace job.yaml

Terraform

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

Terraform 構成の google_cloud_run_v2_job リソースに次の内容を追加します。
  resource "google_cloud_run_v2_job" "default" {
    name     = "JOB"
    location = "REGION"
    deletion_protection = "true"
    launch_stage = "BETA"
    template {
      template {
        containers {
          image = "IMAGE_URL"
      volume_mounts {
        name = "VOLUME_NAME"
        mount_path = "MOUNT_PATH"
      }
        }
        volumes {
          name = "VOLUME_NAME"
      empty_dir {
        medium = "DISK"
        size_limit = "SIZE"
      }
        }
      }
    }
    lifecycle {
      ignore_changes = [
        launch_stage,
      ]
    }
  }

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

  • JOB: ジョブの名前。
  • REGION: Google Cloud のリージョン。
  • IMAGE_URL: コンテナ イメージへの参照(例: us-docker.pkg.dev/cloudrun/container/job:latest)。
  • VOLUME_NAME: ボリュームに付ける名前。
  • MOUNT_PATH: ボリュームをマウントする相対パス(/mnt/my-volume など)。
  • SIZE: ディスクサイズ(例: 100Gi)。ephemeral-disk ボリュームの場合、サイズは 10Gi 以上にする必要があります。

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

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 jobs update JOB \
    --clear-volumes
    --clear-volume-mounts

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

gcloud run jobs update JOB \
    --clear-volumes \
    --clear-volume-mounts \
    --container=container1 \
    --clear-volumes \
    -–clear-volume-mounts \
    --container=container2 \
    --clear-volumes \
    -–clear-volume-mounts

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

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

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

gcloud run jobs update JOB \
    --remove-volume VOLUME_NAME
    --container=container1 \
    --remove-volume-mount MOUNT_PATH \
    --container=container2 \
    --remove-volume-mount MOUNT_PATH

ベスト プラクティス

エフェメラル データを効果的に管理し、ストレージ パフォーマンスを最適化するには、次のベスト プラクティスを遵守してください。

永続ストレージにコピーする

エフェメラル ディスクの内容を Cloud Storage バケットなどの永続ストレージにコピーする場合は、10 秒間の SIGTERM から SIGKILL への猶予期間に依存するのではなく、増分コピーすることをおすすめします。強制シャットダウンの詳細については、コンテナ ランタイムの契約をご覧ください。

Cloud Run は、追加のネットワーク設定なしで Cloud Storage から読み取りと書き込みを行うことができます。最適なパフォーマンスを実現するには、ダイレクト VPC を使用して、Cloud Storage との間で VPC ネットワーク経由でトラフィックをルーティングすることをおすすめします。

この方法は、Cloud Run リソースがインターネットにアクセスする必要がない場合に有効です。インターネット アクセスが必要な場合は、Cloud NAT を設定するか、Google API への内部トラフィックをご覧ください。

ジョブでダイレクト VPC 下りを構成する手順は次のとおりです。

  1. Google Cloud コンソールで、[Cloud Run] ページに移動します。

    Cloud Run に移動

  2. 新しいジョブを構成する場合は、[ジョブ] タブをクリックし、[コンテナをデプロイ] を選択します。必要に応じて、ジョブの初期設定ページに入力します。既存のジョブを構成する場合は、ジョブをクリックして [ジョブ構成の表示と編集] をクリックします。

  3. [コンテナ、接続、セキュリティ] をクリックして、ジョブのプロパティ ページを開きます。

  4. [接続] タブをクリックします。

  5. [アウトバウンド トラフィック用の VPC に接続する] をクリックします。

  6. [VPC に直接トラフィックを送信] をクリックします。

  7. [ネットワーク] フィールドで、トラフィックを送信する VPC ネットワークを選択します。

  8. [サブネット] フィールドで、ジョブが IP アドレスを受信するサブネットを選択します。同じサブネットで複数のジョブを実行できます。

  9. [トラフィック ルーティング] で、[すべてのトラフィックを VPC にルーティングする] を選択して、すべてのアウトバウンド トラフィックを VPC ネットワーク経由で送信します。

  10. [作成] または [更新] をクリックします。

  11. ジョブが VPC ネットワーク上にあることを確認するには、ジョブをクリックして [構成] タブをクリックします。ネットワークとサブネットが [VPC] カードに一覧表示されます。

  12. 接続したサブネットで限定公開の Google アクセスを有効にします。

トラブルシューティング

大量のデータをエフェメラル ディスクにダウンロードするときにネットワーク速度が遅い場合は、Direct VPC を有効にする手順に沿って操作します。ダイレクト VPC が有効になっていない場合、ネットワーク転送速度が遅くなります。