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 は、ファイル システム インターフェースを備えていますが、バックエンドの 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 はファイル全体を再アップロードします。この動作の唯一の例外は、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 を使用して content-encoding: gzip でオブジェクトを編集または変更しようとすると、予期しない動作が発生する可能性があります。これは、Cloud Storage FUSE が content-encoding: gzip を保持しながらオブジェクト コンテンツをそのまま(圧縮せずに)アップロードするためです。また、このコンテンツが適切に gzip 圧縮されていない場合、gcloud CLI などの他のクライアントでサーバーからの読み取りに失敗することがあります。これは、他のクライアントが読み取り時に解凍トランスコーディングを実行し、不適切な gzip コンテンツがあると失敗するためです。
  • 保持ポリシー: Cloud Storage FUSE では、保持ポリシーが設定されたバケットへの書き込みはサポートされていません。保持ポリシーが設定されたバケットに書き込もうとすると、書き込みが失敗します。

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

  • ローカル ストレージ: 新しいまたは変更されたオブジェクトは、閉じるか同期されるまで、ローカルの一時ファイルにその全体が保存されます。サイズの大きいファイルを扱う場合には、ファイルの一時ファイルがコピーできる容量をローカルに用意してください。特に、Compute Engine インスタンスの場合は、十分な容量を確保してください。詳細については、Cloud Storage FUSE GitHub ドキュメントの README をご覧ください。
  • ディレクトリ: Cloud Storage は、フラットな名前空間で動作します。デフォルトでは、明示的に定義されたディレクトリ(Cloud Storage にオブジェクトとして存在するディレクトリ)のみがマウントされたファイル システムに表示されます。暗示的なディレクトリ(他のファイルやディレクトリのパスの一部でしかないディレクトリ)はデフォルトでは表示されません。暗示的なディレクトリを含むパスにファイルがある場合、そのファイルを含む暗示的なディレクトリは表示されないため、ファイルはディレクトリ ツリーに表示されません。ただし、この動作はフラグを使用して変更できます。詳細については、Cloud Storage FUSE CLI のドキュメント--implicit-dirs フラグをご覧ください。

    Cloud Storage FUSE は、ディレクトリ名の変更をサポートしていません。Cloud Storage では、ディレクトリの名前変更をアトミックに実行できません。ディレクトリ名を変更するには、新しい名前のオブジェクトをコピーして元のオブジェクトを削除する必要があります。

  • ファイル ハンドルの制限: デフォルトでは、Linux カーネルは最大 1,024 個のオープン ファイル ハンドルを許可します。オープン ファイル ハンドルの最大数を超える可能性があるため、外部クライアントからの同時並列接続を処理するサーバーとして Cloud Storage FUSE を使用しないでください。たとえば、Cloud Storage FUSE マウントからのウェブ コンテンツの提供、ファイル共有プロトコル(NFS、SMB など)を使用したネットワーク接続ストレージ(NAS)としての Cloud Storage FUSE マウントの公開、Cloud Storage FUSE マウントを基盤とするファイル転送プロトコル(FTP)サーバーのホスティング、などのユースケースには使用しないでください。

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

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

  • TensorFlow V2.x

  • TensorFlow V1.x

  • PyTorch V2.x

  • PyTorch V1.x

  • JAX 0.4.x

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

  • 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 オペレーションに関する情報を表示するには、--debug_gcs フラグを使用します。

コマンド JSON API 操作
gcsfuse --debug_gcs 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 FUSE の既知の問題の一覧については、GitHub をご覧ください。

次のステップ