Cloud Storage FUSE

このページでは、Cloud Storage FUSE の概要について説明します。Cloud Storage FUSE は、Cloud Storage バケットをローカル ファイル システムとしてマウントしてアクセスできるようにする FUSE アダプタです。これにより、アプリケーションは、標準のファイル システムのセマンティクスを使用して、バケット内のオブジェクトの読み取りと書き込みを行うことができます。Cloud Storage FUSE は、Google がサポートするオープンソース プロダクトです。

Cloud Storage FUSE の使用方法については、次のドキュメントをご覧ください。

このドキュメントには、常に Cloud Storage FUSE の最新バージョンが反映されています。最新バージョンの詳細については、GitHub の Cloud Storage FUSE のリリースをご覧ください。

Cloud Storage FUSE の仕組み

Cloud Storage FUSE は、FUSE と Cloud Storage API を使用して、ファイル システムのローカルにマウントされたフォルダのようにバケットを透過的に公開します。

Cloud Storage FUSE は、オブジェクト ストレージの名前をファイルとディレクトリに変換し、オブジェクト名の中のスラッシュ(/)をディレクトリの区切りとして扱うことで、共通の接頭辞を持つオブジェクトが同じディレクトリ内のファイルとして扱われるようにします。アプリケーションは、ファイル システムなどのマウントされたバケットと通信し、クラウドでほぼ無制限なファイル ストレージを実行できます。Cloud Storage FUSE は、Google Kubernetes Engine、Compute Engine VM、オンプレミスのシステムなど、Cloud Storage に接続されたあらゆる場所から実行できます。

Cloud Storage FUSE は、ファイル システムのセマンティクスを必要とするアプリケーションに対して、Cloud Storage に適切なパフォーマンス特性とスケーラビリティ特性のあるユースケースに最適です。たとえば、Cloud Storage FUSE は、データ、モデル、チェックポイント、ログを Cloud Storage に直接格納できるので、機械学習(ML)プロジェクトに役立ちます。詳細については、ML ワークロード用の Cloud Storage FUSE をご覧ください。

Cloud Storage FUSE は、他の Google Cloud サービスと統合されています。たとえば、Cloud Storage FUSE CSI ドライバを使用すると、Google Kubernetes Engine(GKE)API を使用してバケットをボリュームとして使用できるため、Cloud Storage からの読み取りと Cloud Storage への書き込みを Kubernetes Pod 内から行うことができます。他の統合の詳細については、統合をご覧ください。

キャッシュ

Cloud Storage FUSE には、パフォーマンスの向上とコスト削減に役立つ 4 種類のキャッシュがあります。ファイル キャッシュ、統計情報キャッシュ、型キャッシュ、リスト キャッシュです。これらのキャッシュの詳細については、キャッシュの概要をご覧ください。

制限事項

Cloud Storage FUSE は、ファイル システム インターフェースを備えていますが、バックエンドの NFS や CIFS などのファイル システムとは異なります。また、Cloud Storage FUSE は POSIX に準拠していません。Google Cloud の POSIX ファイル システム プロダクトについては、Filestore をご覧ください。

Cloud Storage FUSE を使用する場合は、POSIX ファイル システムとは異なる制限とセマンティクスに注意してください。Cloud Storage FUSE は、その機能内でのみ使用してください。

POSIX ファイル システムの制限事項と相違点

Cloud Storage FUSE の制限事項は次のとおりです。

  • メタデータ: Cloud Storage にファイルをアップロードする際に、Cloud Storage FUSE がオブジェクトのメタデータを転送することはありません。ただし、mtime ターゲットや symlink ターゲットは例外です。つまり、Cloud Storage FUSE を使用してファイルをアップロードする際に、オブジェクトのメタデータを設定することはできません。オブジェクトのメタデータを保持する必要がある場合は、Google Cloud CLIJSON API、または Google Cloud コンソールでファイルをアップロードすることを検討してください。
  • 同時実行: Cloud Storage FUSE では、同じファイルへの複数の書き込みに対して同時実行制御を行うことはできません。複数の書き込みによってファイルの置き換えが試みられた場合は、最後の書き込みが有効となり、それ以前の書き込みはすべて失われます。統合、バージョン コントロール、上書きの通知は行われません。
  • リンク: Cloud Storage FUSE はハードリンクをサポートしていません。
  • ファイルロックとファイルへのパッチ適用: Cloud Storage FUSE は、ファイルのロックやファイルへのパッチ適用をサポートしていません。バージョン管理システムはファイルのロックとパッチ適用に依存しているため、バージョン管理システムのリポジトリを Cloud Storage FUSE のマウント ポイントに保存しないでください。また、Cloud Storage FUSE をファイルの代わりとして使用しないでください。
  • セマンティクス: Cloud Storage FUSE のセマンティクスは、従来のファイル システムのセマンティクスと異なります。たとえば、最終アクセス時間などのメタデータはサポートされておらず、階層名前空間が有効になっているバケットを使用しない限り、ディレクトリの名前変更などの一部のメタデータ オペレーションはアトミックではありません。Cloud Storage FUSE と従来のファイル システムのセマンティクスの違いの一覧については、Cloud Storage FUSE GitHub ドキュメントのセマンティクスをご覧ください。Cloud Storage FUSE が Cloud Storage のディレクトリを推定する方法については、ディレクトリのセマンティクスをご覧ください。
  • ファイルのパッチ適用(またはその場での上書き)を行うワークロード: Cloud Storage FUSE は、オブジェクト全体を一度に Cloud Storage に書き込むため、パッチ適用の仕組みはありません。ファイルにパッチを適用しようとすると、Cloud Storage FUSE はファイル全体を再アップロードします。この動作の唯一の例外は、2 MB 以上のファイルの末尾にコンテンツを追加できることです。この場合、Cloud Storage FUSE は追加されたコンテンツのみを再アップロードします。
  • アクセス: ファイルの承認は、Cloud Storage の権限によって管理されます。POSIX 形式のアクセス制御は機能しません。
  • パフォーマンス: Cloud Storage FUSE のレイテンシはローカル ファイル システムよりもはるかに長いため、データベースを保存するバックエンドとしては使用しないでください。サイズの小さなファイルを 1 つずつ読み取るか書き込むと、スループットが低下することがあります。サイズの大きなファイルを使用するか、複数のファイルを一括転送することで、スループットは上がりやすくなります。
  • 可用性: Cloud Storage FUSE を使用して Cloud Storage にアクセスすると、一時的なエラーが発生することがあります。失敗したオペレーションは再試行方法で再試行することをおすすめします。
  • オブジェクトのバージョニング: Cloud Storage FUSE は、オブジェクトのバージョニングが有効になっているバケットの使用を正式にサポートしていません。オブジェクトのバージョニングが有効になっているバケットで Cloud Storage FUSE を使用しようとすると、予期しない動作が発生する可能性があります。
  • ファイルのコード変換:

    メタデータに content-encoding: gzip を含むオブジェクト: Cloud Storage FUSE でマウントされたディレクトリ内のオブジェクトには、解凍トランスコーディングが実行されません。オブジェクトは、バケットに保存された方法で圧縮されたままになります。

    たとえば、--gzip-local フラグを指定した gcloud storage cp コマンドでバケットにアップロードした 1,000 バイトのファイルは、60 バイトの Cloud Storage オブジェクトとして保存されます(実際の圧縮サイズは、コンテンツと gcloud CLI で使用される gzip 実装によって異なります)。バケットが gcsfuse を使用してマウントされ、対応するファイルがマウント ディレクトリから一覧表示または読み取られると、そのサイズは 60 バイトとして返されます。そのコンテンツは、元の 1,000 バイトのコンテンツの圧縮バージョンになります。

    これは、解凍トランスコーディングを行う gcloud storage cp gs://bucket/path /local/path を使用したダウンロードとは対照的です。gcloud コマンドでは、ダウンロード中にコンテンツが自動的に解凍され、元の非圧縮コンテンツが配信されます。

  • 保持ポリシー: Cloud Storage FUSE では、保持ポリシーが設定されたバケットへの書き込みはサポートされていません。保持ポリシーが設定されたバケットに書き込もうとすると、書き込みが失敗します。

    Cloud Storage FUSE は、保持ポリシーが設定されたバケットからのオブジェクトの読み取りをサポートしていますが、バケットのマウント時に -o RO フラグを渡すことで、Read-Only としてマウントする必要があります。

  • ローカル ストレージ: 新しいまたは変更されたオブジェクトは、閉じるか同期されるまで、ローカルの一時ファイルにその全体が保存されます。サイズの大きいファイルを扱う場合には、ファイルの一時ファイルがコピーできる容量をローカルに用意してください。特に、Compute Engine インスタンスの場合は、十分な容量を確保してください。詳細については、Cloud Storage FUSE GitHub ドキュメントの README をご覧ください。
  • ファイル ハンドルの制限: デフォルトでは、Linux カーネルのオープン ファイル ハンドル数の上限は 1,024 です。複数の同時接続を処理するサーバーとして Cloud Storage FUSE を使用している場合は、この制限を超える可能性があります。問題を回避するには、単一ホストへの同時接続数が制限を下回るようにしてください。また、制限を引き上げることを検討してください。これが重要になるのは、Cloud Storage FUSE マウントを使用してウェブ コンテンツを提供するシナリオ、ネットワーク接続ストレージ(NAS)をホストするシナリオ、ファイル転送プロトコル(FTP)サーバーをホストするシナリオなどです。Cloud Storage FUSE マウントを使用して Cloud Run でウェブ コンテンツを配信する場合、インスタンスあたりの最大同時リクエスト数は 1,000 未満に制限されます。
  • rsync の制限事項: Cloud Storage FUSE のファイル システム レイテンシは rsync に影響します。これにより、ファイルの読み取りと書き込みは一度に 1 つしか行われません。バケット間で複数のファイルを並行して転送するには、gcloud storage rsync を実行して Google Cloud CLI を使用します。詳細については、rsync のドキュメントをご覧ください。
  • リスト オペレーションの制限事項: マウントされたバケット内のすべてのオブジェクトを一覧表示すると(ls の実行など)、Cloud Storage FUSE は Cloud Storage の Objects: list API を呼び出します。この API は結果をページ分けします。つまり、バケット内のオブジェクトの数によっては、Cloud Storage FUSE で複数の呼び出しを発行しなければならない場合があります。これにより、リスト オペレーションに費用がかかり、処理速度が低下する可能性があります。

フレームワーク、オペレーティング システム、アーキテクチャ

Cloud Storage FUSE は、次のフレームワークで検証されています。

  • TensorFlow V2.x

  • TensorFlow V1.x

  • PyTorch V2.x

  • PyTorch V1.x

  • JAX 0.4.x

Cloud Storage FUSE は、次のオペレーティング システムとアーキテクチャをサポートしています。

  • Rocky Linux 8.9 以降

  • Ubuntu 18.04 以降

  • Debian 10 以降

  • CentOS 7.9 以降

  • RHEL 7.9 以降

  • x86_64

  • ARM64

サポートを利用する

Google Cloud の公式サポート チャネルのいずれかで、サポートの利用、一般的な質問の提出、新機能のリクエストを行うことができます。GitHub で問題を報告してサポートを受けることもできます。

よく発生する問題の解決方法については、Cloud Storage FUSE GitHub ドキュメントのトラブルシューティングをご覧ください。

Cloud Storage FUSE の料金

Cloud Storage FUSE は無料で利用できますが、Cloud Storage に関連して生成されるストレージ、メタデータ、ネットワーク I/O は、他の Cloud Storage インターフェースと同様に課金されます。Cloud Storage FUSE によって実行されるすべてのデータ転送とオペレーションは、Cloud Storage による転送とオペレーションにマッピングされ、状況に応じて課金されます。一般的な Cloud Storage FUSE オペレーションと、そのオペレーションを Cloud Storage オペレーションにマッピングする方法については、オペレーション マッピングをご覧ください。

予想以上に請求額が上がることを防ぐため、Cloud Storage FUSE の使用によってどの程度の Cloud Storage の料金が発生するかを見積もっておく必要があります。たとえば、Cloud Storage FUSE でログファイルを保存する場合、ログが数百または数千のマシンで同時に積極的にフラッシュされると、直ちに料金が発生することがあります。

ストレージ、ネットワークの使用、オペレーションなどの料金については、Cloud Storage の料金をご覧ください。

Cloud Storage FUSE オペレーションと Cloud Storage オペレーションのマッピング

Cloud Storage FUSE を使用してオペレーションを行う場合、Cloud Storage FUSE オペレーションに関連付けられた Cloud Storage オペレーションも行います。次の表に、一般的な Cloud Storage FUSE コマンドと、関連する Cloud Storage の JSON API オペレーションを示します。Cloud Storage FUSE オペレーションに関する情報を表示するには、gcsfuse コマンドで --log-severity フラグを TRACE に設定します。

コマンド JSON API 操作
gcsfuse --log-severity=TRACE example-bucket mp Objects.list、認証情報の確認
cd mp 該当なし
ls mp Objects.list("")
mkdir subdir

Objects.get("subdir")

Objects.get("subdir/")

Objects.insert("subdir/")

cp ~/local.txt subdir/

Objects.get("subdir/local.txt")

Objects.get("subdir/local.txt/")

Objects.insert("subdir/local.txt")、空のオブジェクトの作成

Objects.insert("subdir/local.txt")、書き込み後に閉じる場合

rm -rf subdir

Objects.list("subdir")

Objects.list("subdir/")

Objects.delete("subdir/local.txt")

Objects.list("subdir/")

Objects.delete("subdir/")

ディレクトリのセマンティクス

Cloud Storage には、フラットな名前空間のバケットと階層名前空間が有効になっているバケットがあります。デフォルトでは、Cloud Storage FUSE は、階層名前空間が有効になっているバケット内の明示的に定義されたディレクトリ(フォルダ)を推測できますが、フラットな名前空間のバケット内の暗黙的に定義されたディレクトリを推測することはできません。暗黙的に定義されたディレクトリには、シミュレートされたフォルダマネージド フォルダが含まれます。

たとえば、my-directory/my-object.txt という名前のオブジェクトを含む my-bucket という名前のバケットをマウントするとします。ここで、my-directory/ はシミュレートされたフォルダです。バケット マウント ポイントで ls を実行すると、デフォルトでは、Cloud Storage FUSE はシミュレートされたディレクトリの my-bucket/my-directory/ にも、その中のオブジェクトの my-object.txt にもアクセスできません。Cloud Storage FUSE がシミュレートされたフォルダとその中のオブジェクトを推測できるようにするには、フラットな名前空間のバケットをマウントする際、gcsfuse mount コマンドの一部に --implicit-dirs オプションを含めます。--implicit-dirs オプションの詳細については、Cloud Storage FUSE コマンドラインのドキュメントをご覧ください。

ファイル システムを使用してデータを保存およびアクセスする必要がある場合は、階層名前空間が有効になっているバケットを使用します。このようなバケットを作成する方法については、階層型名前空間が有効なバケットの作成と管理をご覧ください。

暗黙的に定義されたディレクトリを使用してバケットをマウントする方法など、ディレクトリ セマンティクスの詳細については、GitHub ドキュメントのファイルとディレクトリをご覧ください。

再試行方法

デフォルトでは、Cloud Storage FUSE から Cloud Storage へのリクエストが失敗した場合、このリクエストは指定された最大バックオフ期間まで指数バックオフで再試行されます。この期間のデフォルト値は 30s(30 秒)です。バックオフ時間が指定の最大時間を超えると、指定された最大時間で再試行が続行されます。--max-retry-sleep オプションを gcsfuse 呼び出しの一部として使用して、バックオフ期間を指定できます。

--max-retry-sleep オプションの詳細については、gcsfuse コマンドラインのドキュメントをご覧ください。

既知の問題

Cloud Storage FUSE の既知の問題の一覧については、GitHub をご覧ください。

次のステップ