フォルダ

このページでは、Cloud Storage のフォルダと、Cloud Storage ツールによるフォルダの処理方法の違いについて説明します。

概要

Cloud Storage はフラットな名前空間で動作します。つまり、Cloud Storage 内にフォルダは存在しません。バケット your-bucketfolder1/file.txt という名前のオブジェクトを作成すると、そのオブジェクトへのパスは your-bucket/folder1/file.txt になりますが、folder1 という名前のフォルダはありません。代わりに、文字列 folder1 がオブジェクト名の一部になります。

ただし、Cloud Console と gsutil では、ファイルツリーが次のような階層構造で表示されます。

  • Cloud Console では、ローカルのファイル ブラウザと同じようにフォルダが表示されます。

  • gsutil は、さまざまなルールを使用して一般的なコマンドライン ディレクトリをシミュレートします。

/storage/images/folders.svg

Cloud Console で空のフォルダを作成すると、Cloud Storage はプレースホルダとしてゼロバイトのオブジェクトを作成します。たとえば、my-bucket というバケットに folder というフォルダを作成すると、gs://my-bucket/folder/ というゼロバイトのオブジェクトが作成されます。gsutil ls を実行すると、このオブジェクトを確認できます。

ツール

以下のタブをクリックすると、各ツールでのフォルダの処理方法を確認できます。

Console

Cloud Console では、バケット内に空のフォルダを作成するか、既存のフォルダをアップロードします。

既存のフォルダをアップロードすると、そのフォルダ内のすべてのオブジェクトのパスにフォルダ名が含まれます。サブフォルダとそこにあるオブジェクトもアップロードに含まれます。

フォルダを作成するには:

  1. Cloud Console で、Cloud Storage ブラウザページに移動します。

    [ブラウザ] に移動

  2. バケットに移動します。

  3. [フォルダを作成] をクリックして空のフォルダを新規に作成するか、[フォルダをアップロード] をクリックして既存のフォルダをアップロードします。

gsutil

疑似的な階層型ファイルツリーを実現するため、gsutil は次のルールを適用して、コマンド内の宛先 URL をオブジェクト名として扱うか、フォルダとして扱うかを決定します。

  1. 宛先 URL の末尾が / 文字の場合、gsutil はこの宛先 URL をフォルダとして扱います。たとえば、次のコマンドを実行するとします。ここで、your-file はファイルの名前です。

    gsutil cp your-file gs://your-bucket/abc/

    これにより、gs://your-bucket/abc/your-file という名前のオブジェクトが作成されます。

  2. 複数のファイルを宛先 URL にコピーする場合、gsutil はこの宛先 URL をフォルダとして扱います。たとえば、次のコマンドを実行するとします。ここで、your-dirfile1file2 などのファイルを含むフォルダです。

    gsutil cp -r your-dir gs://your-bucket/abc

    これにより、gs://your-bucket/abc/your-dir/file1 および gs://your-bucket/abc/your-dir/file2 というオブジェクトが作成されます。

  3. 上記いずれのルールにも該当しない場合、gsutil はバケット内のオブジェクトを確認し、宛先 URL をオブジェクト名とするかフォルダとするかを決定します。たとえば、次のコマンドを実行するとします。ここで、your-file はファイルの名前です。

    gsutil cp your-file gs://your-bucket/abc

    gsutil は、delimiter に /、prefix に abc を指定して、your-bucket に対するオブジェクト一覧表示リクエストを行い、パスが gs://your-bucket/abc/ で始まるオブジェクトがこのバケットにあるかどうかを判断します。ある場合、gsutil は gs://your-bucket/abc をフォルダ名として扱い、上記のコマンドによりオブジェクト gs://your-bucket/abc/your-file が作成されます。ない場合は、オブジェクト gs://your-bucket/abc が作成されます。

このルールベースのアプローチは、他の多くのツールが採用している、フォルダの存在を示すために 0 バイトのマーカー オブジェクトを作成するという方法と異なります。gsutil は、他のツールが使用するいくつかの規則(0 バイト オブジェクトの名前の末尾には _$folder$ を付加するなど)を認識しますが、そのようなマーカー オブジェクトがなくても UNIX コマンドと整合性のある命名を行えるようになっています。

再試行と命名

gsutil で自動再試行を有効にすると、最初の試行で一部のファイルのみがコピーされ、その後の試行では宛先フォルダがすでに存在するためオブジェクトの命名が適切に行われない、という問題が生じる可能性があります。

たとえば、次のコマンドを実行するとします。ここで、your-dir/ には dir1dir2 というサブフォルダが存在し、両サブフォルダにはファイル abc が含まれています。

gsutil cp -r ./your-dir gs://your-bucket/new

gs://your-bucket/new がまだ存在しない場合、最初の試行が正常に終了すると次のオブジェクトが作成されます。

gs://your-bucket/new/dir1/abc
gs://your-bucket/new/dir2/abc

2 回目の試行が正常に終了すると、次のオブジェクトが作成されます。

gs://your-bucket/new/your-dir/dir1/abc
gs://your-bucket/new/your-dir/dir2/abc

毎回の試行で gsutil が一貫した命名を行うようにするには、次のようにします。

  1. 宛先 URL の末尾にスラッシュを付加することで、gsutil がフォルダと見なすようにします。

  2. gsutil rsync を使用します。rsync は Unix cp で定義されるフォルダの命名規則を使用しません。宛先サブフォルダが存在するかどうかにかかわらず、一貫した命名を行います。

  3. gsutil rsync で問題が解決しない場合は、プレースホルダ オブジェクトを作成して、宛先をフォルダとして設定します。次に例を示します。

    gsutil cp some-file gs://your-bucket/new/placeholder

    プレースホルダ オブジェクトが存在する場合、上記の gsutil cp -r コマンドを実行すると、gs://your-bucket/new は常にフォルダとして扱われます。gs://your-bucket/new にオブジェクトが 1 つでも作成されたら、プレースホルダ オブジェクトを削除してアップロードを継続できます。

名前の構成方法について詳しくは、gsutil help cp をご覧ください。

その他の情報

  • gsutil を使用して、疑似的な空フォルダを実現するゼロバイトのオブジェクトを作成することはできません。

  • / はオブジェクト名の中の 1 文字にすぎない場合もあるため、gsutil は gs://my-bucket/folder/gs://my-bucket//folder は異なるものと解釈します。スクリプト内でサブパスを組み合わせてファイルパスを作成する場合には注意してください。

料金に関する考慮事項

gsutil の命名方法の欠点は、cp コマンドや mv コマンド(クラウドへのフォルダの再帰コピーなど)を実行する前に、追加でオブジェクトの一覧表示が必要になることです。ただし、この一覧表示は、delimiter パラメータと prefix パラメータで結果データを絞り込むため、コストはそれほどかかりません。また、gsutil によるオブジェクト一覧表示リクエストは、1 回の cp コマンドまたは mv コマンドにつき 1 回のため、転送対象オブジェクト 1 個当たりのコストはさらに少額になります。

REST API

JSON API

JSON API にフォルダは存在しませんが、prefixdelimiter クエリ パラメータを使用すると、オブジェクト リストを絞り込むことができます。

たとえば、接頭辞 folder/subfolder/ を使用してバケット my-bucket 内のすべてのオブジェクトを一覧表示するには、次の URL を使用してオブジェクトの一覧表示リクエストを行います。

"https://storage.googleapis.com/storage/v1/b/my-bucket/o?prefix=folder/subfolder/"

XML API

XML API にフォルダは存在しませんが、prefixdelimiter クエリ パラメータを使用すると、オブジェクト リストを絞り込むことができます。

たとえば、接頭辞 folder/subfolder/ を使用してバケット my-bucket 内のすべてのオブジェクトを一覧表示するには、次の URL を使用してオブジェクトの一覧表示リクエストを行います。

"https://storage.googleapis.com/my-bucket?prefix=folder/subfolder/"

次のステップ