

# Amazon S3 オブジェクトに命名する
<a name="object-keys"></a>

*オブジェクトキー* (またはキー名) によって、Amazon S3 バケット内のオブジェクトは一意に識別されます。オブジェクトの作成時にキー名を指定できます。例えば、[Amazon S3 コンソール](https://console.aws.amazon.com/s3/home)では、バケットを選択すると、そのバケットに含まれるオブジェクトのリストが表示されます。表示される名前が*オブジェクトキー*です。

オブジェクトキー名は、UTF-8 でエンコードされた一連の Unicode 文字で構成され、最大長は 1,024 バイト、または約 1,024 個のラテン文字です。ロケールによっては、1 文字でエンコードに 2 バイトが必要になる場合があります。オブジェクトに名前を付けるときは、次の点に注意してください。
+ オブジェクトキー名では大文字と小文字が区別されます。
+ オブジェクトキー名には、プレフィックス (コンソールでは*フォルダ*と呼ばれます) が含まれます。例えば、`Development/Projects.xls` は `Development` プレフィックス (またはフォルダ) 内にある `Projects.xls` オブジェクトのフルオブジェクトキー名です。プレフィックス、区切り記号 (`/`)、およびオブジェクトの名前は、オブジェクトキー名の 1,024 バイトの制限に含まれます。プレフィックスとフォルダの詳細については、「[オブジェクトキー名の選択](#object-key-choose)」を参照してください。
+ 特定の文字をオブジェクトキー名で使用する際には、特別な処理が必要になる場合があります。詳細については、「[オブジェクトキーの命名のガイドライン](#object-key-guidelines)」を参照してください。

**注記**  
値 `"soap"` を持つオブジェクトキー名は、[仮想ホスト形式のリクエスト](https://docs.aws.amazon.com/AmazonS3/latest/userguide/VirtualHosting.html#virtual-hosted-style-access)ではサポートされていません。`"soap"` が使用されるオブジェクトキー名値の場合、代わりに[パス形式の URL](https://docs.aws.amazon.com//AmazonS3/latest/userguide/VirtualHosting.html#path-style-access) を使用する必要があります。

## オブジェクトキー名の選択
<a name="object-key-choose"></a>

Amazon S3 のデータモデルはフラットな構造をしています。バケットを作成し、バケットにオブジェクトを保存します。サブバケットやサブフォルダの階層はありません。ただし、Amazon S3 コンソールで使用されているようなキー名のプレフィックスや区切り記号を使用して論理的な階層を暗示できます。Amazon S3 コンソールでは、フォルダの概念をサポートしています。Amazon S3 コンソールからメタデータを編集する方法の詳細については、[Amazon S3 コンソールでのオブジェクトメタデータの編集](add-object-metadata.md) を参照してください。

バケット (`admin-created`) に、次のようなオブジェクトキーを持つ 4 つのオブジェクトがあるとします。

`Development/Projects.xls`

`Finance/statement1.pdf`

`Private/taxdocument.pdf`

`s3-dg.pdf`

コンソールでは、キー名のプレフィックス (`Development/`、`Finance/`、`Private/`) および区切り記号 (`/`) を使用して、フォルダ構造を表します。`s3-dg.pdf` キーにはスラッシュで区切られたプレフィックスが含まれていないため、そのオブジェクトはバケットのルートレベルに直接表示されます。`Development/` フォルダを開くと、`Projects.xlsx` オブジェクトが表示されます。
+ Amazon S3 ではバケットとオブジェクトをサポートしており、階層はありません。ただし、オブジェクトキー名のプレフィックスと区切り記号により、Amazon S3 コンソールや AWS SDK で階層を暗示し、フォルダの概念を導入できます。
+ Amazon S3 コンソールは、フォルダの*プレフィックスと区切り記号*の値をキーとしてゼロバイトのオブジェクトを作成することにより、フォルダオブジェクトの作成を実装します。これらのフォルダオブジェクトはコンソールに表示されません。それ以外の場合は、他のオブジェクトと同様に動作し、REST API、AWS CLI、および AWS SDK を使用して表示および操作できます。

## オブジェクトキーの命名のガイドライン
<a name="object-key-guidelines"></a>

オブジェクトキー名には UTF−8 文字を使用できます。ただし、キー名に特定の文字を使用すると、一部のアプリケーションやプロトコルで問題が発生することがあります。以下のガイドラインは、DNS、ウェブセーフ文字、XML パーサー、その他の API とのコンプライアンスを最大化するのに役立ちます。

### セーフ文字
<a name="object-key-guidelines-safe-characters"></a>

以下の文字セットは、一般的にキー名で使用しても安全です。


|  |  | 
| --- |--- |
| Alphanumeric characters |    0-9   a～z   A～Z    | 
| Special characters |    感嘆符 (`!`)   ハイフン (`-`)   下線 (`_`)   ピリオド (`.`)   アスタリスク (`*`)   一重引用符 (`'`)   左丸括弧 (`(`)   右丸括弧 (`)`)    | 

有効なオブジェクトキー名の例を次に示します。
+ `4my-organization`
+ `my.great_photos-2014/jan/myvacation.jpg`
+ `videos/2014/birthday/video1.wmv`

**注記**  
Amazon S3 コンソールを使用して、キー名がピリオド (`.`) で終わるオブジェクトをダウンロードすると、ダウンロードしたオブジェクトのキー名の末尾からピリオドが削除されます。ダウンロードしたオブジェクトのキー名の末尾のピリオドを保持するには、AWS Command Line Interface (AWS CLI)、AWS SDK、または Amazon S3 REST API を使用する必要があります。  
また、以下のプレフィックスの制約についても注意してください。  
プレフィックスが `./` のオブジェクトは、AWS CLI、AWS SDK、または REST API を使用してアップロードまたはダウンロードします。Amazon S3 コンソールを使用してこれらのオブジェクトをアップロードすることはできません。
相対パス要素を含むオブジェクトキー (例: `../`) は、左から右に解析したときに、相対パスセグメントの累積数が、検出された非相対パス要素の数を超えない場合に有効です。このルールは、Amazon S3 コンソール、Amazon S3 REST API、AWS CLI、および AWS SDK を使用して行われたすべてのリクエストに適用されます。  
例えば、次のようになります。  
`videos/2014/../../video1.wmv` は有効です。
`videos/../../video1.wmv` は無効です。
`videos/../../2014/video1.wmv` は無効です。

### ピリオドのみのパスセグメント
<a name="object-key-guidelines-period-only-segments"></a>

ピリオドのみのパスセグメント (`.` または `..`) を含むオブジェクトキーは、相対パス参照として解釈するアプリケーション、SDK、またはツールによって処理されると、予期しない動作を引き起こす可能性があります。

次のパターンは問題を引き起こす可能性があります。
+ `folder/./file.txt` - 現在のディレクトリ参照が含まれます
+ `folder/../file.txt` - 親ディレクトリ参照が含まれます
+ `./file.txt` - 現在のディレクトリ参照から開始
+ `../file.txt` - 親ディレクトリ参照から開始

次のパターンは正常に機能します。
+ `folder/.hidden/file.txt` - ピリオドは単体ではなくファイル名の一部です
+ `folder/..backup/file.txt` - ピリオドは単体ではなくファイル名の一部です

アプリケーションがピリオドのみのセグメントでオブジェクトキーを処理すると、以下の動作への影響が発生する可能性があります。
+ *パスの正規化* - 多くのシステムは `.` や `..` などの参照を自動的に解決し、有効なパスが変更される可能性があります (例えば、`folder/./file.txt` は `folder/file.txt` になります)。
+ *アクセスの問題* - パス解決の違いにより、アプリケーションがオブジェクトを見つけられない場合があります
+ *動作に一貫性がない* - ツールと SDK が異なると、これらのパターンの処理が異なる場合があります

**重要**  
これらの問題を回避するには、オブジェクトキー名でピリオドのみのパスセグメントを避けることをお勧めします。組織上の目的のために、別の命名規則を使用します。

### 特殊な処理を必要とする可能性がある文字
<a name="object-key-guidelines-special-handling"></a>

キー名で以下の文字を使用すると、追加のコード処理が必要になる場合があり、ほとんどの場合、16 進数として URL エンコードまたは参照することが必要になります。これらの文字の一部は表示不可能な文字であり、ブラウザで処理されない場合があります。この場合も、特殊な処理が必要です。
+ アンパサンド (`&`) 
+ ドル記号 (`$`) 
+ 16 進数の 00～1F (10 進数の 0～31) の範囲および 7F (10 進数の 127) の ASCII 文字 
+ アットマーク (`@`) 
+ 等号 (`=`) 
+ セミコロン (`;`) 
+ スラッシュ (`/`)
+ コロン (`:`) 
+ プラス記号 (`+`) 
+ スペース – 場合によっては、大幅に連続しているスペースが失われる可能性があります (特に複数のスペース)。
+ カンマ (`,`) 
+ 疑問符 (`?`) 

### 使用しない方がよい文字
<a name="object-key-guidelines-avoid-characters"></a>

すべてのアプリケーションで一貫性を維持するには相当な量の特殊な処理が必要になるため、キー名には以下の文字を使用しないことをお勧めします。
+ バックスラッシュ (`\`) 
+ 左中括弧 (`{`) 
+ 表示不可能な ASCII 文字 (10 進数の 128 ～ 255 の文字)
+ キャレットまたはサーカムフレックス (`^`) 
+ 右中括弧 (`}`) 
+ パーセント記号 (`%`) 
+ 重アクセントまたはバックティック (```) 
+ 右角括弧 (`]`) 
+ 引用符 (`"`)
+ 大なり記号 (`>`) 
+ 左角括弧 (`[`) 
+ チルダ (`~`) 
+ 小なり記号 (`<`) 
+ シャープ記号 (`#`) 
+ 縦棒またはパイプ (`|`) 

### XML 関連のオブジェクトキーの制約
<a name="object-key-xml-related-constraints"></a>

[行末処理に関する XML 標準](https://www.w3.org/TR/REC-xml/#sec-line-ends)で規定されているとおり、すべての XML テキストは正規化され、1 つのキャリッジリターン (ASCII コード 13) および、改行文字とも呼ばれる改行の直後のキャリッジリターン (ASCII コード 10) が単一の改行文字に置き換えられます。XML リクエストでオブジェクトキーを正しく解析するには、キャリッジリターンや[その他の特殊文字を XML タグ内に挿入するときに、同等の XML エンティティコードに置き換える必要があります](https://www.w3.org/TR/xml/#syntax)。

以下では、当該特殊文字とそれに相当する XML エンティティコードのリストを示しています。
+ アポストロフィ (`'`) は `&apos;` に置き換える必要があります
+ 引用符 (`"`) は `&quot;` に置き換える必要があります
+ アンパサンド (`&`) は `&amp;` に置き換える必要があります
+ 小なり記号 (`<`) は `&lt;` に置き換える必要があります
+ 大なり記号 (`>`) は `&gt;` に置き換える必要があります
+ キャリッジリターン (`\r`) は `&#13;` または `&#x0D;` に置き換える必要があります
+ 改行 (`\n`) は `&#10;` または `&#x0A;` に置き換える必要があります

**Example**  
次の例では、キャリッジリターンの代わりに XML エンティティコードを使用する方法を示しています。この `DeleteObjects` リクエストにより、`key` パラメータ `/some/prefix/objectwith\rcarriagereturn` (`\r` はキャリッジリターン) を持つオブジェクトが削除されます。  

```
<Delete xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <Object>
    <Key>/some/prefix/objectwith&#13;carriagereturn</Key>
  </Object>
</Delete>
```

## オブジェクトキーのソート順
<a name="object-key-sort-order"></a>

Amazon S3 は、プレフィックスを含むオブジェクトキーを UTF-8 でエンコードされたバイト値で辞書順にソートします。

ASCII 文字は、次の順序でソートされます。
+ 特殊文字 (`!`、`/` など)
+ 大文字 (A～Z)
+ 小文字 (a～z)

ASCII 以外の文字 (例: é、中 文) はマルチバイト UTF-8 シーケンスとしてエンコードされ、通常、バイト値が高いため (例: é は `0xC3`、中は `0xE4`)、ASCII 文字の後にソートされます。

例えば、`apple/`、`Apple/`、`éclair/`、`中 文/` などのプレフィックスは次のようにソートされます。

1. `Apple/` (`0x41` で始まる)

2. `apple/` (`0x61` で始まる)

3. `éclair/` (`0xC3 0xA9` で始まる)

4. `中 文/` (`0xE4 0xB8 0xAD` `0xE6 0x96 0x87` で始まる) 