インスタンスの NFS ボリューム マウントを構成する

このページでは、Cloud Run で NFS ファイル共有をボリュームとしてマウントする方法について説明します。オンプレミスまたは Compute Engine VM でホストされている独自の NFS サーバーなど、任意の NFS サーバーを使用できます。NFS サーバーをまだ使用していない場合は、 Google Cloudのフルマネージド NFS サービスである Filestore をおすすめします。

Cloud Run で NFS ファイル共有をボリュームとしてマウントすると、ファイル共有がコンテナ ファイル システム内のファイルとして提示されます。ファイル共有をボリュームとしてマウントした後、プログラミング言語のファイル システム オペレーションとライブラリを使用して、ローカル ファイル システム上のディレクトリと同じようにアクセスします。

制限事項

  • Cloud Run は NFS ロックをサポートしていません。NFS ボリュームは、ロックなしモードで自動的にマウントされます。
  • 許可されていないパス: Cloud Run では、/dev/proc/sys、またはそのサブディレクトリにボリュームをマウントすることはできません。

始める前に

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 にアクセスできるようにします。
  • リモート NFS ファイル共有の権限を設定して、コンテナのユーザーがアクセスできるようにします。デフォルトでは、Filestore はすべてのユーザーに読み取りアクセス権を付与しますが、書き込みアクセス権は root ユーザー(uid 0)に制限します。コンテナに書き込みアクセス権が必要で、root ユーザーとして実行されない場合は、接続クライアント(root として実行)を使用して共有権限を変更する必要があります。たとえば、chown コマンドを使用して、ファイルまたはディレクトリの所有権をコンテナが実行される特定のユーザー ID に変更できます。

必要なロール

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

NFS ボリュームをマウントする

複数の NFS サーバー、Filestore インスタンス、または他のボリューム タイプを異なるマウントパスにマウントできます。

複数のコンテナを使用している場合は、まずボリュームを指定してから、各コンテナのボリューム マウントを指定します。

Google Cloud CLI または YAML を使用して NFS ボリューム マウントを構成する。

gcloud

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

    gcloud beta run instances update INSTANCE \
    --add-volume mount-path=MOUNT_PATH,type=nfs,location=IP_ADDRESS:NFS_PATH,readonly=READ_ONLY

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

    • INSTANCE: インスタンスの名前。
    • MOUNT_PATH: ボリュームをマウントする相対パス(/mnt/my-volume など)。
    • IP_ADDRESS: NFS ファイル共有の場所。
    • NFS_PATH: NFS ファイル共有のパス(スラッシュで始まるパス、例: /example-directory)。
    • READ_ONLY: ボリュームを読み取り専用にする場合は true、書き込み可能にする場合は false
  • 複数のコンテナを使用している場合は、まずボリュームを指定してから、各コンテナのボリューム マウントを指定します。

    gcloud beta run instances update INSTANCE \
      --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

YAML

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

    gcloud beta run instances describe INSTANCE --format export > instance.yaml
  2. 次の例には、YAML 構成が含まれています。

    apiVersion: run.googleapis.com/v1
    kind: Instance
    metadata:
      name: INSTANCE
      annotations:
        run.googleapis.com/launch-stage: BETA
    spec:
      containers:
      - name: CONTAINER_NAME
        image: IMAGE_URL
        volumeMounts:
        - name: VOLUME_NAME
          mountPath: MOUNT_PATH
      volumes:
      - name: VOLUME_NAME
        nfs:
          server: IP_ADDRESS
          path: NFS_PATH
          readOnly: IS_READ_ONLY

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

    • INSTANCE: Cloud Run インスタンスの名前。
    • CONTAINER_NAME: コンテナの名前。
    • IMAGE_URL: コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/hello:latest など)。
    • VOLUME_NAME: ボリュームに付ける名前。VOLUME_NAME 値は、ボリュームをボリューム マウントにマッピングするために使用されます。
    • MOUNT_PATH: ボリュームをマウントする相対パス(/mnt/my-volume など)。
    • IP_ADDRESS: NFS ファイル共有のアドレス。
    • NFS_PATH: NFS ファイル共有のパス(スラッシュで始まるパス、例: /example-directory)。
    • IS_READ_ONLY: ボリュームを読み取り専用にする場合は True、書き込み可能にする場合は False
  3. 次のコマンドを使用して、インスタンスを作成または更新します。

    gcloud beta run instances replace instance.yaml

NFS のトラブルシューティング

問題が発生した場合は、次の点を確認してください。

  • Cloud Run インスタンスが、NFS サーバーのある VPC ネットワークに接続されている。
  • Cloud Run が NFS サーバーにアクセスすることを妨げるファイアウォール ルールがない。
  • コンテナでデータを書き込む必要がある場合は、コンテナのユーザーからの書き込みを許可するように NFS 共有の権限が構成されていることを確認します。

コンテナの起動時間と 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 instances update INSTANCE \
    --clear-volumes \
    --clear-volume-mounts

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

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

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

gcloud beta run instances update INSTANCE \
    --remove-volume VOLUME_NAME \
    --container=container1 \
    --remove-volume-mount MOUNT_PATH \
    --container=container2 \
    --remove-volume-mount MOUNT_PATH