このページでは、Cloud Run で NFS ファイル共有をボリュームとしてマウントする方法について説明します。オンプレミスまたは Compute Engine VM でホストされている独自の NFS サーバーなど、任意の NFS サーバーを使用できます。NFS サーバーをまだ使用していない場合は、 Google Cloudのフルマネージド NFS サービスである Filestore をおすすめします。
Cloud Run で NFS ファイル共有をボリュームとしてマウントすると、ファイル共有がコンテナ ファイル システム内のファイルとして提示されます。ファイル共有をボリュームとしてマウントした後、プログラミング言語のファイル システム オペレーションとライブラリを使用して、ローカル ファイル システム上のディレクトリと同じようにアクセスします。
使用できないパス
Cloud Run では、/dev
、/proc
、/sys
、またはそのサブディレクトリにボリュームをマウントすることはできません。
制限事項
NFS ボリュームに書き込むには、コンテナを root として実行する必要があります。コンテナでファイル システムからの読み取りを行うだけの場合は、任意のユーザーとして実行できます。
Cloud Run は NFS ロックをサポートしていません。NFS ボリュームは、ロックなしモードで自動的にマウントされます。
始める前に
Cloud Run で NFS サーバーをボリュームとしてマウントするには、次のものが必要です。
- VPC ネットワーク。このネットワークで NFS サーバーまたは Filestore インスタンスが実行されます。
- VPC ネットワークで実行される NFS サーバー。ここで、Cloud Run ワーカープールが VPC ネットワークに接続されます。NFS サーバーがまだない場合は、Filestore インスタンスを作成してサーバーを作成します。
- Cloud Run ワーカープールは、NFS サーバーが実行されている VPC ネットワークに接続されます。最高のパフォーマンスを得るには、VPC コネクタではなくダイレクト VPC を使用します。
- 既存のプロジェクトを使用している場合は、VPC ファイアウォール構成で Cloud Run が NFS サーバーにアクセスできることを確認してください(新しいプロジェクトから開始する場合は、デフォルトで true になります)。NFS サーバーとして Filestore を使用している場合は、Filestore のドキュメントに従って下り(外向き)ファイアウォール ルールを作成し、Cloud Run が Filestore にアクセスできるようにします。
必要なロール
Cloud Run に関連付けられている IAM ロールと権限のリストについては、Cloud Run IAM ロールと Cloud Run IAM 権限をご覧ください。Cloud Run ワーカープールがGoogle Cloud API(Cloud クライアント ライブラリなど)と連携している場合は、サービス ID の構成ガイドをご覧ください。ロールの付与の詳細については、デプロイ権限とアクセスの管理をご覧ください。
NFS ボリュームをマウントする
複数の NFS サーバー、Filestore インスタンス、または他のボリューム タイプを異なるマウントパスにマウントできます。
複数のコンテナを使用している場合は、まずボリュームを指定してから、各コンテナのボリューム マウントを指定します。
Google Cloud コンソール、Google Cloud CLI、Terraform を使用して NFS ボリューム マウントを構成します。
コンソール
Google Cloud コンソールで Cloud Run に移動します。
メニューから [ワーカープール] を選択し、[コンテナをデプロイ] をクリックして新しいワーカープールを構成します。既存のワーカープールを構成する場合は、ワーカープールをクリックし、[新しいリビジョンの編集とデプロイ] をクリックします。
新しいワーカープールを構成する場合は、最初のワーカープール ページに入力してから、[コンテナ、ボリューム、ネットワーキング、セキュリティ] をクリックしてワーカープール構成ページを開きます。
[ボリューム] タブをクリックします。
- [ボリューム] で、[ボリュームを追加] をクリックします。
- [ボリュームのタイプ] プルダウンで、[NFS] を選択します。
- [ボリューム名] フィールドに、ボリュームに使用する名前を入力します。
- [NFS サーバー] フィールドに、NFS ファイル共有のドメイン名または場所(
IP_ADDRESS
形式)を入力します。 - [パス] フィールドに、マウントする NFS サーバー ディレクトリのパスを入力します。
- [完了] をクリックします。
- [コンテナ] タブをクリックし、マウントするコンテナを見つけて、コンテナの詳細を開きます。
- [ボリュームのマウント] タブをクリックします。
- [ボリュームをマウント] をクリックします。
- メニューから NFS ボリュームを選択します。
- ボリュームをマウントするパスを指定します。
- [ボリュームをマウント] をクリックします。
- [完了] をクリックします。
- [ボリューム] で、[ボリュームを追加] をクリックします。
[作成] または [デプロイ] をクリックします。
gcloud
ボリュームを追加してマウントするには:
gcloud beta run worker-pools update WORKER_POOL \ --add-volume name=VOLUME_NAME,type=nfs,location=IP_ADDRESS:NFS_PATH \ --add-volume-mount volume=VOLUME_NAME,mount-path=MOUNT_PATH
次のように置き換えます。
- WORKER_POOL: ワーカープールの名前。
- VOLUME_NAME: ボリュームに付ける名前。
- IP_ADDRESS: NFS ファイル共有の場所。
- NFS_PATH: NFS ファイル共有のパス(スラッシュで始まるパス、例:
/example-directory
)。 - MOUNT_PATH: ボリュームをマウントする相対パス(
/mnt/my-volume
など)。
ボリュームを読み取り専用ボリュームとしてマウントするには:
--add-volume name=VOLUME_NAME,type=nfs,location=IP_ADDRESS:NFS_PATH,readonly=true
複数のコンテナを使用している場合は、まずボリュームを指定してから、各コンテナのボリューム マウントを指定します。
gcloud beta run worker-pools update WORKER_POOL \ --add-volume name=VOLUME_NAME,type=nfs,location=IP_ADDRESS:NFS_PATH \ --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
Terraform
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
resource "google_cloud_run_v2_worker_pool" "default" {
name = "WORKER_POOL"
location = "REGION"
launch_stage = "BETA"
template {
containers {
image = "IMAGE_URL"
volume_mounts {
name = "VOLUME_NAME"
mount_path = "MOUNT_PATH"
}
}
vpc_access {
network_interfaces {
network = "default"
subnetwork = "default"
}
}
volumes {
name = "VOLUME_NAME"
nfs {
server = google_filestore_instance.default.networks[0].ip_addresses[0]
path = "NFS_PATH"
read_only = "IS_READ_ONLY"
}
}
}
}
resource "google_filestore_instance" "default" {
name = "cloudrun-worker-pool"
location = "REGION"
tier = "BASIC_HDD"
file_shares {
capacity_gb = 1024
name = "share1"
}
networks {
network = "default"
modes = ["MODE_IPV4"]
}
}
次のように置き換えます。
- WORKER_POOL: ワーカープールの名前。
- REGION: Google Cloud リージョン(例:
europe-west1
)。 - IMAGE_URL: ワーカープールを含むコンテナ イメージへの参照(
us-docker.pkg.dev/cloudrun/container/worker-pool:latest
など)。 - VOLUME_NAME: ボリュームの名前。VOLUME_NAME 値は、ボリュームをボリューム マウントにマッピングするために使用されます。
- MOUNT_PATH: ボリュームをマウントする相対パス(
/mnt/my-volume
など)。 - NFS_PATH: NFS ファイル共有のパス。
- IS_READ_ONLY: ボリュームを読み取り専用にする場合は
True
、書き込み可能にする場合はFalse
。
ワーカープールの環境変数構成を確認する
Google Cloud コンソールで Cloud Run に移動します。
[ワーカープール] をクリックして、デプロイされたワーカープールのリストを確認します。
調べるワーカープールをクリックして、詳細ウィンドウを表示します。
[コンテナ] タブをクリックして、ワーカープールのコンテナ構成を確認します。
NFS のトラブルシューティング
問題が発生した場合は、次の点を確認してください。
- Cloud Run ワーカープールが、NFS サーバーのある VPC ネットワークに接続されている。
- Cloud Run が NFS サーバーにアクセスすることを妨げるファイアウォール ルールがない。
- コンテナで NFS サーバーに書き込みを行う場合は、root として実行されていること。
コンテナの起動時間と NFS ボリュームのマウント
NFS ボリューム マウントを使用すると、コンテナの起動前にボリューム マウントが開始されるため、Cloud Run コンテナのコールド スタート時間がわずかに長くなる可能性があります。コンテナは、NFS が正常にマウントされた場合にのみ起動します。
NFS は、サーバーとの接続を確立してファイル ハンドルを取得した後にのみ、ボリュームを正常にマウントします。Cloud Run がサーバーに接続できない場合、Cloud Run ワーカープールは起動しません。
また、Cloud Run のすべてのマウントの合計タイムアウトが 30 秒であるため、ネットワークの遅延がコンテナの起動時間に影響する可能性があります。NFS のマウントに 30 秒以上かかると、Cloud Run ワーカープールの起動に失敗します。
NFS のパフォーマンス特性
複数の NFS ボリュームを作成すると、すべてのボリュームが並列でマウントされます。
NFS はネットワーク ファイル システムであるため、帯域幅の制限が適用されるため、帯域幅の制限により、ファイル システムへのアクセスに影響する可能性があります。
NFS ボリュームに書き込むと、データがフラッシュされるまで書き込みは Cloud Run メモリに保存されます。データは、次の状況でフラッシュされます。
- アプリケーションが sync(2)、msync(2)、または fsync(3) を使用してファイルデータを明示的にフラッシュする。
- アプリケーションが close(2) でファイルを閉じる。
- メモリ不足のため、システム メモリ リソースの再利用が強制的に実行される。
詳細については、Linux のドキュメントで NFS の説明をご覧ください。
ボリュームとボリューム マウントを消去して削除する
すべてのボリュームとマウントを消去できます。または、個々のボリュームとボリューム マウントを削除することもできます。
すべてのボリュームとボリューム マウントを消去する
単一コンテナのワーカープールからすべてのボリュームとボリューム マウントを消去するには、次のコマンドを実行します。
gcloud beta run worker-pools update WORKER_POOL \ --clear-volumes --clear-volume-mounts
複数のコンテナがある場合は、サイドカー CLI 規則に沿ってボリュームとボリューム マウントを消去します。
gcloud beta run worker-pools update WORKER_POOL \ --container=container1 \ --clear-volumes -–clear-volume-mounts \ --container=container2 \ --clear-volumes \ -–clear-volume-mounts
個々のボリュームとボリューム マウントを削除する
ボリュームを削除するには、そのボリュームを使用するすべてのボリューム マウントも削除する必要があります。
個々のボリュームまたはボリューム マウントを削除するには、remove-volume
フラグと remove-volume-mount
フラグを使用します。
gcloud beta run worker-pools update WORKER_POOL \ --remove-volume VOLUME_NAME \ --container=container1 \ --remove-volume-mount MOUNT_PATH \ --container=container2 \ --remove-volume-mount MOUNT_PATH