Cloud Run は、インスタンスの存続期間中のみ保持されるエフェメラル ディスク ボリュームを提供します。この機能を使用すると、必要なディスク容量とマウント場所を指定できます。Cloud Run は、その量のディスクをリソースに割り当てます。
ディスクは自動的にプロビジョニングされ、ext4 に事前フォーマットされ、起動時にインスタンス固有の鍵で暗号化されます。エフェメラル ディスクは、すべてのユーザーが読み取りまたは書き込みを行えるようにボリュームを作成します。ストレージはエフェメラルであるため、インスタンスがシャットダウンすると、すべてのデータが完全に削除されます。これには、以下が原因のシャットダウンが含まれます。
- インスタンスのクラッシュ
- サービスのスケーリング
- 新しいリビジョンへのトラフィックの移行
ディスクは特定のインスタンス専用であり、他のインスタンスやリビジョン間で共有されません。ボリュームごとに構成可能なマウント ポイントを使用して、ファイル システムの構造を制御できます。
インスタンスをシャットダウンする前に、Cloud Run から SIGTERM シグナルがインスタンス内のすべてのコンテナに送信されます。これは、Cloud Run が SIGKILL シグナルを送信してから 10 秒後に実際のシャットダウンが開始することを表しています。この 10 秒のウィンドウを使用して、ディスク コンテンツの永続ストレージの最終コピーなどのクリーンアップ オペレーションを実行できます。
ユースケース
エフェメラル ディスクは、次の目的で使用できます。
- データ処理ワークロード: Cloud Run で大きなデータファイルを処理する場合、通常はファイル全体をメモリに保存するか、ファイルを小さな部分に分割してオーケストレートします。エフェメラル ストレージを使用すると、データのローカルコピーを一時的に作成するために大量のメモリに料金を支払う必要がなくなります。また、より大きなデータセットを処理できるようになります。
- キャッシュ保存: ウェブ提供のユースケースでは、リモート ストレージから取得するのではなく、ディスクにデータをキャッシュ保存することで、アプリケーションのレイテンシを最適化できます。
ストレージとインスタンスの上限
次の上限が適用されます。
- ボリューム サイズの上限: 各ボリュームは
1Gi~100Giの範囲にする必要があります。 - インスタンスのストレージ上限: デフォルトでは、各インスタンスの合計容量は 10 GiB に制限されています。インスタンスごとに 10 GiB を超える構成にするには、割り当ての増加をリクエストする必要があります。
- インスタンス ボリュームの上限: 各インスタンスは最大 10 個のエフェメラル ディスク ボリュームに制限されます。
- プロジェクトの上限: 各プロジェクトは、デフォルトでリージョン割り当ての上限が 0 GiB で開始されます。プロジェクトには、エフェメラル ディスクを持つリソースがそのリージョンに初めてデプロイされるときに、リージョンごとに 100 GiB が自動的に付与されます。実行時に、このリージョン割り当ては、リージョン内でアクティブに実行されているすべてのインスタンス間で共有されます。リソースをデプロイする場合、インスタンスあたりのエフェメラル ディスクサイズに最大インスタンス数を掛けた値が、リージョンの割り当て上限を超えることはできません。たとえば、リージョンの上限が 100 GiB の場合、10 GiB のディスクを持つリソースは最大 10 個のインスタンスで構成できます。必要に応じて、割り当ての増加をリクエストします。
割り当ての増加をリクエストする
追加の容量が必要な場合は、Cloud Run サービスの割り当ての増加をリクエストする必要があります。以下のボタンにあるリンクから、必要な割り当てをリクエストしてください。
| 現在の割り当て | 割り当てリンク |
|---|---|
| インスタンスあたり 10 GiB | インスタンスあたりの割り当ての増加をリクエストする |
| プロジェクトあたり 100 GiB | プロジェクトごとの割り当ての増加をリクエストする |
割り当ての増加のリクエストについて詳しくは、割り当てを増やす方法をご覧ください。
制限事項
エフェメラル ディスクは、第 2 世代の実行環境でのみ使用できます。使用できないパス
Cloud Run では、/dev、/proc、/sys、またはそのサブディレクトリにボリュームをマウントすることはできません。
サポートされるリージョン
エフェメラル ディスクは、すべての Cloud Run のロケーションで使用できます。
始める前に
-
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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
- gcloud CLI をインストールして初期化します。
-
コンポーネントを更新します。
gcloud components update
- CPU、メモリ、下り(外向き)ネットワークについては、Cloud Run の料金ページをご覧ください。プロビジョニングされたディスクの合計サイズと、それを使用しているインスタンスの存続期間が費用に影響します。
必要なロール
エフェメラル ディスクの構成に必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。
- Cloud Run サービスに対する Cloud Run デベロッパー(
roles/run.developer)ロール - サービス ID に対するサービス アカウント ユーザー(
roles/iam.serviceAccountUser)ロール
Cloud Run に関連付けられている IAM ロールと権限のリストについては、Cloud Run IAM ロールと Cloud Run IAM 権限をご覧ください。Cloud Run サービスがGoogle Cloud APIs(Cloud クライアント ライブラリなど)と連携している場合は、サービス ID の構成ガイドをご覧ください。ロールの付与の詳細については、デプロイ権限とアクセスの管理をご覧ください。
エフェメラル ディスクを作成してマウントする
エフェメラル ディスクは、 Google Cloud コンソール、Google Cloud CLI、YAML、または Terraform を使用して作成してマウントできます。
コンソール
Google Cloud コンソールで Cloud Run に移動します。
Cloud Run ナビゲーション メニューから [サービス] を選択し、[コンテナをデプロイ] をクリックして新しいサービスを構成します。既存のサービスを構成する場合は、サービスをクリックし、[コンテナ] タブをクリックします。
新しいサービスを構成する場合は、最初のサービス設定のページに入力してから、[コンテナ、ネットワーキング、セキュリティ] をクリックします。
[エフェメラル ディスク] を選択します。
メニューからサイズを選択し、[マウントパス] フィールドにマウントパスを入力します。
新しいサービスの場合は [作成] をクリックします。[差分を表示して再デプロイ] をクリックし、既存のサービスの [変更をデプロイ] をクリックします。
gcloud
ボリュームを追加してマウントするには:
gcloud run services update SERVICE \
--execution-environment=gen2 \
--add-volume=name=VOLUME_NAME,type=ephemeral-disk,size=SIZE \
--add-volume-mount=volume=VOLUME_NAME,mount-path=MOUNT_PATH
次のように置き換えます。
- SERVICE: サービスの名前。
- VOLUME_NAME: ボリュームに付ける名前。
- SIZE: ディスクサイズ(例:
10Gi)。サイズは、ephemeral-diskボリュームの場合、1Gi~100Giにする必要があります。 - MOUNT_PATH: ボリュームをマウントする相対パス(
/mnt/my-volumeなど)。
YAML
新しいサービスを作成する場合は、この手順をスキップします。既存のサービスを更新する場合は、その YAML 構成をダウンロードします。
gcloud run services describe SERVICE --format export > service.yaml
YAML ファイルを構成します。
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: SERVICE labels: cloud.googleapis.com/location: REGION spec: template: spec: containers: - name: CONTAINER_NAME image: IMAGE_URL volumeMounts: - name: VOLUME_NAME mountPath: MOUNT_PATH volumes: - name: VOLUME_NAME emptyDir: medium: Disk sizeLimit: SIZE次のように置き換えます。
- SERVICE: サービスの名前。
- REGION: Google Cloud のリージョン。
- CONTAINER_NAME: コンテナに付ける名前。
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: ボリュームに付ける名前。
- MOUNT_PATH: ボリュームをマウントする相対パス(
/mnt/my-volumeなど)。 - SIZE: ディスクサイズ(例:
10Gi)。サイズは、ephemeral-diskボリュームの場合、1Gi~100Giにする必要があります。
次のコマンドを使用して、サービスを作成または更新します。
gcloud run services replace service.yaml
gcloud run services replaceコマンドは、service.yamlファイルが存在する場合、デフォルトでこのファイルを使用します。
Terraform
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
Terraform 構成のgoogle_cloud_run_v2_service リソースに次の内容を追加します。 resource "google_cloud_run_v2_service" "default" {
name = "SERVICE"
location = "REGION"
deletion_protection = "true"
ingress = "INGRESS_TRAFFIC_ALL"
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,
]
}
}
次のように置き換えます。
- SERVICE: サービスの名前。
- REGION: Google Cloud のリージョン。
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: ボリュームに付ける名前。
- MOUNT_PATH: ボリュームをマウントする相対パス(
/mnt/my-volumeなど)。 - SIZE: ディスクサイズ(例:
10Gi)。サイズは、ephemeral-diskボリュームの場合、1Gi~100Giにする必要があります。
ボリュームの読み取りと書き込み
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
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
ベスト プラクティス
エフェメラル データを効果的に管理し、ストレージ パフォーマンスを最適化するには、次のベスト プラクティスに従ってください。
永続ストレージにコピーする
エフェメラル ディスクのコンテンツを Cloud Storage バケットなどの永続ストレージにコピーする場合は、SIGTERM から SIGKILL への 10 秒間の猶予期間に依存するのではなく、増分コピーを行うことをおすすめします。インスタンスのシャットダウンの詳細については、コンテナ ランタイムの契約をご覧ください。
Cloud Run は、追加のネットワーク設定なしで Cloud Storage から読み取りと書き込みを行うことができます。最適なパフォーマンスを実現するには、ダイレクト VPC を使用して VPC ネットワーク経由で Cloud Storage との間でトラフィックをルーティングすることをおすすめします。
この方法は、Cloud Run リソースがインターネットにアクセスする必要がない場合に有効です。インターネット アクセスが必要な場合は、Cloud NAT を設定するか、Google API への内部トラフィックをご覧ください。
サービスでダイレクト VPC 下り(外向き)を構成する手順は次のとおりです。
Google Cloud コンソールで、[Cloud Run] ページに移動します。
デプロイ先の新しいサービスを構成する場合は、[サービスを作成] をクリックします。既存のサービスを構成してデプロイする場合は、サービスをクリックします。
新しいサービスを構成する場合は、必要に応じて最初のサービス設定のページに入力してから、[コンテナ、ネットワーキング、セキュリティ] をクリックしてサービス構成ページを開きます。
[ネットワーキング] タブをクリックします。
[アウトバウンド トラフィック用の VPC に接続する] をクリックします。
[VPC に直接トラフィックを送信] をクリックします。
[ネットワーク] フィールドで、トラフィックを送信する VPC ネットワークを選択します。
[サブネット] フィールドで、サービスが IP アドレスを受信するサブネットを選択します。 同じサブネットに複数のサービスをデプロイできます。
[トラフィック ルーティング] で、[すべてのトラフィックを VPC にルーティングする] を選択して、すべてのアウトバウンド トラフィックを VPC ネットワーク経由で送信します。
新しいサービスの場合は [作成] をクリックします。[差分を表示して再デプロイ] をクリックし、既存のサービスの [変更をデプロイ] をクリックします。
サービスが VPC ネットワーク上にあることを確認するには、サービスをクリックして、[ネットワーキング] タブをクリックします。ネットワークとサブネットが [VPC] カードに一覧表示されます。
これで、ファイアウォール ルールで許可されるように、Cloud Run サービスから VPC ネットワーク上の任意のリソースにリクエストを送信できます。
接続したサブネットでプライベート Google アクセスを有効にします。
トラブルシューティング
問題が発生した場合は、次の点を確認してください。- コンテナのメモリが不足していて、 Google Cloud コンソールを使用してエフェメラル ディスクがアタッチされたサービスの新しいリビジョンをデプロイした場合、 Google Cloud コンソールによってディスク ボリュームがインメモリ ボリュームに変換された可能性があります。これにより、ディスク書き込みがメモリに書き込まれ、コンテナのメモリ不足が発生します。この問題を解決するには、gcloud CLI を使用してサービスを再デプロイし、YAML ファイルの
volumesでmedium: Diskが指定されていることを確認します。 - エフェメラル ディスクに大量のデータをダウンロードする際にネットワーク速度が遅い場合は、ダイレクト VPC を有効にする手順に沿って操作します。ダイレクト VPC が有効になっていない場合、ネットワーク転送速度が低下します。