Cloud Storage FUSE は、オープンソースの FUSE アダプタです。これにより、Linux または macOS システムに Cloud Storage バケットをファイル システムとしてマウントできます。標準のファイル システム動作を使用して Cloud Storage オブジェクトをアップロード / ダウンロードするためのアプリケーションとして使用できます。Cloud Storage FUSE は、Google Compute Engine VM やオンプレミスのシステムなど、Cloud Storage に接続されたあらゆる場所で実行できます 1。
Google Cloud で完全にサポートされているファイル システム プロダクトについては、Filestore をご覧ください。
技術概要
Cloud Storage FUSE は、オブジェクト ストレージの名前をファイルとディレクトリに変換し、オブジェクト名の中の「/」の文字をディレクトリの区切りとして扱うことで、共通の接頭辞を持つオブジェクトが同じディレクトリ内のファイルとして扱われるようにします。アプリケーションは、シンプル ファイル システムなどのマウントされたバケットと通信し、クラウドでほぼ無制限なファイル ストレージを実行できます。
Cloud Storage FUSE は、ファイル システム インターフェースを備えていますが、バックエンドの NFS や CIFS などのファイル システムとは異なります。Cloud Storage FUSE は、Cloud Storage と同じ基本的特徴を持ち、同じレイテンシや単独オブジェクトのパフォーマンスを維持しながら、サイズや全体的なパフォーマンスに関して Cloud Storage のスケーラビリティを保持しています。他のアクセス方法と同様、Cloud Storage は同時実行やロックをサポートしません。たとえば、複数の Cloud Storage FUSE クライアントが同じファイルに書き込んでいる場合は最後のフラッシュが有効となります。
Cloud Storage FUSE の使用や、問題の提出の詳細については、Google Cloud の GitHub リポジトリをご覧ください。リポジトリでは、README、セマンティクス、インストール、マウントを確認することをおすすめします。
POSIX ファイル システムとの主な違い
Cloud Storage FUSE により、ファイルベースのアプリケーションが I/O コードを再書き込みすることなく Cloud Storage を使用できるようになり、ユーザーは Cloud Storage をより効果的かつ素早く使用できるようになります。使用例としては、Cloud Storage のパフォーマンスとスケーラビリティがアプリケーションに適していて、ファイル システムのセマンティクスのみが不足している場合に理想的です。Cloud Storage FUSE が適切なソリューションであるかどうかを判断する際は、次のようなローカル ファイル システムとの違いをいくつか考慮する必要があります。
料金: Cloud Storage FUSE のアクセスは、最終的には Cloud Storage のアクセスとなります。Cloud Storage FUSE によって実行されるすべてのデータ転送とオペレーションは、Cloud Storage による転送とオペレーションにマッピングされ、状況に応じて課金されます。Cloud Storage FUSE を使用する際は、事前に下記の料金セクションで詳細を確認してください。
パフォーマンス: Cloud Storage FUSE のレイテンシは、ローカル ファイル システムよりもはるかに高くなっています。そのため、サイズの小さなファイルを 1 つずつ読み取る / 書き込むと、スループットが低下することがあります。サイズの大きなファイルを使用するか複数のファイルを一括転送することで、スループットは上がりやすくなります。
- 各 I/O ストリームは、gsutil とほぼ同じ速さで実行されます。
gsutil rsync
コマンドは、特にレイテンシの影響を受ける可能性があります。このコマンドは、一度に 1 つのファイルで読み取り、書き込みを行うためです。多くの場合、このコマンドでグローバルの -m フラグを使用するほうが時間を短縮できます。- 小規模でランダムな読み取りは、最初のバイトまでのレイテンシによって遅くなります(Cloud Storage FUSE でデータベースを実行することはしないでください)。
ランダムな書き込みは、blob 全体の読み込み、ローカルでの blob の編集、変更された blob 全体の Cloud Storage への書き込みによって実行されます。サイズの大きなファイルへの小規模な読み取りは、想定通りに機能しますが、速度が遅く、また高額になります。
メタデータ: Cloud Storage FUSE は、Cloud Storage へのアップロードを行う際に、ファイルとともにメタデータを転送しません。これは、Cloud Storage FUSE をアップロード ツールとして使用する場合、他のアップロード方法では可能なコンテンツ タイプや ACL などのメタデータの設定ができないことを意味しています。メタデータのプロパティが重要な場合は、gsutil、JSON API、または Google Cloud Console を使用することを検討してください。
- Cloud Storage FUSE が mtime ターゲットや symlink ターゲットを保存する場合は例外です。
同時実行: ファイルへの複数書き込みのための同時実行制御はありません。複数の書き込みによってファイルの置き換えが試みられた場合は、最後の書き込みが有効となり、それ以前の書き込みはすべて失われます。統合、バージョン コントロール、上書きの通知は行われません。
リンク: Cloud Storage FUSE はハードリンクをサポートしていません。
動作: 一部の動作は、従来型のファイル システムとまったく同じにはなりません。例外についてはこちらをご覧ください。たとえば、最終アクセス時間などのメタデータはサポートされておらず、ディレクトリの名前変更などの一部のメタデータ オペレーションはアトミックではありません。
アクセス: ファイルの認証は、Cloud Storage の権限によって管理されます。POSIX 形式のアクセス コントロールは機能しません。
可用性: Cloud Storage などの分散型システムでは一時エラーが発生して可用性が 100% を下回ることがあります。この場合は、切り捨て型指数バックオフのガイドラインに従って再試行することをおすすめします。
ローカル ストレージ: 新しいまたは変更されたオブジェクトは、閉じるか同期されるまで、ローカルの一時ファイルにその全体が保存されます。サイズの大きいファイルを扱う場合には、ファイルの一時ファイルがコピーできる容量をローカルに用意してください。特に、Google Compute Engine インスタンスの場合は、十分な容量を確保してください。詳細については、readme ドキュメントをご覧ください。
ディレクトリ: デフォルトでは、明示的に定義されたディレクトリ(Cloud Storage に固有のオブジェクト)のみがファイル システムに表示されます。暗示的なディレクトリ(他のファイルやディレクトリのパス名の一部でしかないディレクトリ)はデフォルトでは表示されません。パス名に暗示的ディレクトリが含まれるファイルがある場合、それらのファイルはディレクトリ ツリー全体にわたって表示されません(ファイルを含む暗示的ディレクトリが表示されないため)。フラグを使用すると、この動作を変更できます。詳細については、セマンティクスのドキュメントを参照してください。
Cloud Storage FUSE で発生する料金
Cloud Storage FUSE は無料で利用できますが、Cloud Storage に関連して生成されるストレージ、メタデータ、ネットワーク I/O は、他の Cloud Storage と同様に課金されます。予想以上に請求額が上がることを防ぐため、Cloud Storage FUSE の使用によってどの程度の Cloud Storage の料金が発生するかを見積もっておく必要があります。たとえば、Cloud Storage FUSE でログファイルを保存する場合、ログが数百または数千のマシンで同時に積極的にフラッシュされると、直ちに料金が発生することがあります。
Cloud Storage FUSE に関連して、次の料金カテゴリを把握しておいてください。
標準的なオブジェクト オペレーション(作成、削除、一覧表示)は、Cloud Storage の料金ページのオペレーション セクションの説明に従って課金されます。
Nearline ストレージ オブジェクト、Coldline ストレージ オブジェクト、Archive ストレージ オブジェクトには、取得と早期削除に関する料金が設定されています。
ロケーション間のネットワーク下り(外向き)とデータ転送では、料金が発生します。Cloud Storage の料金ページのネットワーク セクションをご覧ください。
料金構成の例
Cloud Storage FUSE の使用によってどの程度の Cloud Storage の料金が発生するかを把握するため、次のコマンド シーケンスと関連する JSON API オペレーションを検討してください。--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/") |
JSON API のオペレーション料金を使用して、クラス A のオペレーション 8 つ、クラス B のオペレーション 4 つ、無料のオペレーション 2 つからなる 14 のオペレーションの料金を計算できます。local.txt
ファイルのストレージでも料金が発生します。ファイルを作成後すぐに削除すれば、料金は少額になります。12 の有料オペレーションで、コマンド シーケンスの料金は $0.000084 になります。
トラブルシューティング
エラー | 推奨される対処方法 |
---|---|
daemonize.Run: readFromProcess: sub-process: mountWithArgs: mountWithConn: fs.NewServer: create file system: SetUpBucket: OpenBucket: Bad credentials for bucket BUCKET_NAME: permission denied |
バケット名を確認します。それがプロジェクト内にあることを確認します。適切なアクセス権があることを確認します。 |
daemonize.Run: readFromProcess: sub-process: mountWithArgs: mountWithConn: fs.NewServer: create file system: SetUpBucket: OpenBucket: Unknown bucket BUCKET_NAME: no such file or directory |
バケット名を確認します。サービス アカウントにファイルへのアクセス権があることを確認します。少なくとも Storage Object Viewer ロールの権限が必要です。 |
daemonize.Run: readFromProcess: sub-process: mountWithArgs: getConn: GetTokenSource: DefaultTokenSource: google: could not find default credentials. See https://developers.google.com/accounts/docs/application-default-credentials for more information. |
ローカルで実行する場合は、アプリケーションのデフォルト認証情報(ADC)が必要になり、これをコンテナに追加しておく必要があります。環境変数で認証情報を渡すを参照し、GCP にアクセスする Docker の手順に沿って操作します。 |
daemonize.Run: readFromProcess: sub-process: mountWithArgs: mountWithConn: Mount: mount: running fusermount: exit status 1 stderr: /bin/fusermount: fuse device not found, try 'modprobe fuse' first |
コンテナをローカルで実行するには、docker run コマンドに --privilege フラグを追加します。docker run --privileged gcr.io/PROJECT/my-fs-app
|
Cloud Storage FUSE のインストールがビルド時にエラーで失敗します。 | 現時点では、特定の OS ディストリビューションでのみサポートされています。詳細については、Cloud Storage FUSE のインストールをご覧ください。 |
1 Cloud Storage FUSE は、Linux カーネル バージョン 3.10 以降でサポートされています。カーネル バージョンは uname -a
で確認できます。