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 では、/dev、/proc、/sys、またはそのサブディレクトリにボリュームをマウントすることはできません。
サポートされるリージョン
エフェメラル ディスク機能は、次のリージョンで利用できます。
- GPU 以外のワークロードの場合、エフェメラル ディスクは次のリージョンで利用できます。
- GPU を使用する場合、エフェメラル ディスクは GPU をサポートするすべての リージョンで利用できます。
始める前に
- アカウントにログインします。 Google Cloud を初めて使用する場合は、 アカウントを作成して、実際のシナリオで Google プロダクトのパフォーマンスを評価してください。 Google Cloud新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
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.
-
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
- Cloud Run の料金 ページで、CPU、メモリ、ネットワークの下り(外向き)を確認します。プロビジョニングされた ディスクのサイズ全体と、それを使用するインスタンスの存続期間が費用に影響します。
必要なロール
エフェメラル ディスクを構成するために必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。
- Cloud Run デベロッパー (
roles/run.developer) Cloud Run サービスに対するロール - サービス 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 beta 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:ディスクサイズ(
100Giなど)。ephemeral-diskボリュームの場合、サイズは10Gi以上にする必要があります。 - 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 annotations: run.googleapis.com/launch-stage: BETA 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:ディスクサイズ(
100Giなど)。ephemeral-diskボリュームの場合、サイズは10Gi以上にする必要があります。
次のコマンドを使用して、サービスを作成または更新します。
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"
launch_stage = "BETA"
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:ディスクサイズ(
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 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
ベスト プラクティス
エフェメラル データを効果的に管理し、ストレージ パフォーマンスを最適化するには、次のベスト プラクティスに従ってください。
永続ストレージにコピーする
エフェメラル ディスクの内容を Cloud Storage バケットなどの永続ストレージにコピーする場合は、10 秒間の SIGTERM から SIGKILL までの猶予期間に依存するのではなく、増分コピーすることをおすすめします。
インスタンスのシャットダウンの詳細については、コンテナ ランタイムの契約
をご覧ください。
Cloud Run は、追加のネットワーク設定なしで Cloud Storage との間で読み取りと書き込みを行うことができます。最適なパフォーマンスを実現するには、ダイレクト VPC を使用して VPC ネットワーク経由で Cloud Storage との間でトラフィックをルーティングすることをおすすめします。
この方法は、Cloud Run リソースがインターネットにアクセスする必要がない場合に有効です。インターネット アクセスが必要な場合は、Cloud NAT を設定するか、 Google API への内部トラフィックをご覧ください。
サービスでダイレクト VPC 下り(外向き)を構成する手順は次のとおりです。
コンソールで、[Cloud Run] ページに移動します。 Google Cloud
デプロイ先の新しいサービスを構成する場合は、[サービスを作成] をクリックします。既存のサービスを構成してデプロイする場合は、サービスをクリックし、[新しいリビジョンの編集とデプロイ] をクリックします。
新しいサービスを構成する場合は、必要に応じて最初のサービス設定ページに入力し、[コンテナ、ネットワーキング、セキュリティ] をクリックしてサービス構成ページを開きます。
[ネットワーキング] タブをクリックします。
[アウトバウンド トラフィック用の VPC に接続する] をクリックします。
[VPC に直接トラフィックを送信] をクリックします。
[ネットワーク] フィールドで、トラフィックを送信する VPC ネットワークを選択します。
[サブネット] フィールドで、サービスが IP アドレスを受信するサブネットを選択します。 同じサブネットに複数のサービスをデプロイできます。
[**トラフィック ルーティング**] で [**すべてのトラフィックを VPC にルーティングする**] を選択して、すべてのアウトバウンド トラフィックを VPC ネットワーク経由で送信します。
[作成] または [デプロイ] をクリックします。
サービスが VPC ネットワーク上にあることを確認するには、サービスをクリックして、[ネットワーキング] タブをクリックします。ネットワークとサブネットが [VPC] カードに一覧表示されます。
これで、ファイアウォール ルールで許可されるように、Cloud Run サービスから VPC ネットワーク上の任意のリソースにリクエストを送信できます。
接続したサブネットでプライベート Google アクセスを有効にします。
トラブルシューティング
問題が発生した場合は、次の点を確認してください。- コンテナのメモリが不足しているときに、 Google Cloud コンソールを使用して
エフェメラル ディスクが接続されたサービスの新しいリビジョンをデプロイした場合、 Google Cloud コンソール
によってディスク ボリュームがインメモリ ボリュームに変換されている可能性があります。これにより、ディスクへの書き込みがメモリに書き込まれ、コンテナのメモリが不足します。
この問題を解決するには、gcloud CLI を使用してサービスを再デプロイし、YAML ファイルの
volumesでmedium: Diskが指定されていることを確認します。 - 大量のデータをエフェメラル ディスクにダウンロードするときにネットワーク速度が遅い場合は、 ダイレクト VPC を有効にする手順に沿って操作してください。 ダイレクト VPC が有効になっていない場合、ネットワーク転送速度が遅くなります。