Amazon S3のバケット名とオブジェクトキーの命名について

Amazon S3を利用するためには、S3バケットとオブジェクトキーが必要となりますが。
適当に決めるとハマることがあります。

そんなバケット名とオブジェクトキーについて、AWSドキュメントに資料があるので紹介します。

## ドキュメント

[バケットの名前付け](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/bucketnamingrules.html)

[オブジェクトキーの作成](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/object-keys.html)

## バケット名について

[バケットの名前付け](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/bucketnamingrules.html)

2023年2月現在は、下記の10個の制約が記載されています。

- バケット名は 3 (最少)～63 (最大) 文字の長さにする必要があります。
- バケット名は、小文字、数字、ドット (.)、およびハイフン (-) のみで構成できます。
- バケット名は、文字または数字で開始および終了する必要があります。
- バケット名には、連続する 2 つのピリオドを含めることはできません。
- バケット名は IP アドレスの形式 (192.168.5.4 など) にはできません。
- バケット名のプレフィックスは xn-- で始まってはいけません。
- バケット名のサフィックスは -s3alias で終わってはいけません。このサフィックスは、アクセスポイントのエイリアス名用に予約されています。詳細については、「S3 バケットアクセスポイントでのバケット形式のエイリアスの使用」を参照してください。
- バケット名は、パーティション内のすべての AWS リージョン のすべての AWS アカウント にわたって一意である必要があります。パーティションは、リージョンのグループです。AWS には、現在、aws (標準リージョン)、aws-cn (中国リージョン)、および aws-us-gov (AWS GovCloud (US)) の 3 つのパーティションがあります。
- バケットが削除されるまで、バケット名を同じパーティション内の別の AWS アカウント で使用することはできません。
- Amazon S3 Transfer Acceleration で使用されるバケットの名前にドット (.) を付けることはできません。Transfer Acceleration の詳細については、「Amazon S3 Transfer Acceleration を使用した高速かつ安全なファイル転送の設定」を参照してください。

自分の場合、S3のバケットを初めてつくった時に、全リージョン通してユニークなバケット名が必要なの？　と驚いたり。
バケット名でアンダースコアを使おうとして、作成する段階で気づいたり。
大文字使おうとして使えなかったりで、実体験を通して覚えた事柄になりますが。

それ以外にもIPアドレスの形式が使えなかったり、予約されているプレフィックス`xn--`やサフィックス`-s3alias`がある事や。
意識しないと使ってしまいそうな`ドット（.）`が　Amazon S3 Transfer Accelerationを利用するためには制約になったり。
`ドット（.）`を含めるのは静的ウェブサイトホスティング以外の用途では推奨されていなかったり。

ドキュメントをみて初めて気がついたポイントも意外とあるので注意して命名したい所です。

## オブジェクトキーについて

[オブジェクトキーの作成](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/object-keys.html)

### オブジェクトキー名にはUTF-8が利用可能

バケット名に比べると使える文字が一気に増えます。
どう考えても運用が大変になるので、なるべく変な文字は使わないほうが身のためです。

UTF-8が利用可能と聞くと、誰もが絵文字を入れるかと思いますが、実際やったら運用する時に大変そうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/84c83228-e252-752f-28f0-1813821d8167.png)

### ドキュメント上でセーフ文字と規定されている文字

- 0-9
- a～z
- A～Z

- 感嘆符 (!)
- ハイフン (-)
- 下線 (_)
- ピリオド (.)
- アスタリスク (*)
- 一重引用符 (')
- 丸かっこ開き (()
- 丸かっこ閉じ ())

ドキュメントでは上記の文字が一般的なオブジェクトキー名で利用して安全と記載されています。

基本はこの文字の範疇で使うのがよいのですが、ファイル名として日本語を利用すると色々と入ってきてしまいます。

### 特殊な処理を必要とする可能性がある文字

- アンパサンド ("&")
- ドル記号 ("$")
- 16 進数の 00～1F (10 進数の 0～31) の範囲および 7F (10 進数の 127) の ASCII 文字
- アットマーク ("@")
- 等号 ("=")
- セミコロン (";")
- スラッシュ (/)
- コロン (":")
- プラス記号 ("+")
- スペース – いくつかの用途 (特に複数のスペース) では、スペースの重要なシーケンスが失われる可能性があります。
- カンマ (",")
- 疑問符 ("?")

上記は使用すると、特殊な処理が必要になるとドキュメントにあります。

ここらへんの文字は使わないように気をつけたいのですがAWS Backupの標準機能で出力される結果レポートにはコロン（：）が含まれていて、Windows端末ではaws-cliで一括ダウンロードする際は、下記対応になる場合がありました。

[Windows端末のaws-cliでバケットをローカルにダウンロードしようとしたけど、S3オブジェクトキーにコロンがあってエラーになった話](https://qiita.com/SAITO_Keita/items/3645ab1a45074d462e5a)


### 使用しない方がよい文字

- バックスラッシュ ("\")
- 左中括弧 ("{")
- 表示不可能な ASCII 文字 (10 進数の 128 ～ 255 の文字)
- カレット ("^")
- 右中括弧 ("}")
- パーセント記号 ("%")
- アクサングラーブ/バックティック ("`")
- 右角括弧 ("]")
- 引用符
- 大なり記号 (">")
- 左角括弧 ("[")
- チルダ ("~")
- 小なり記号 ("<")
- シャープ記号 ("#")
- 縦棒/パイプ ("|")

中括弧、角括弧、#あたりはファイル名として使われる事はありえるので、ここらへん気をつけたい所です。

### XML 関連のオブジェクトキーの制約

- `' (&apos;)`
- `” (&quot;)`
- `& (&amp;)`
- `< (&lt;)`
- `> (&gt;)`
- `\r (&#13; または &#x0D;)`
- `\n (&#10; または &#x0A;)`

こちらはサンプルをみるに、REST APIでリクエストとしてXMLが絡む時の注意でしょうか。

マネジメントコンソールやSDKを利用している限りはそこまで気にする必要はないかも？

[DeleteObjects](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html)

## 総評

バケット名に比べて、オブジェクトキーはUTF-8の文字が利用できると制約がゆるく。
ある程度利用できる文字については意識しておきたい。

またバケット名ではドットを使った際に制約が強くでるようなので、極力ドットをバケット名に含めないよう気をつけるのが安全なようです。