バージニア北部(us-east-1)リージョンのS3バケット命名規則が2018年3月から変わります
AWSが最初に開設したリージョンであるバージニア北部(N.Virginia/US East/us-east-1)は他のリージョンと仕様が異なる面が多々あります。その代表的なものがS3バケットの命名規則です。
バージニア北部リージョンだけは大文字やアンダースコアが使えるなど、独自のユルイ命名規則が許可されています。 ただし、API から操作した場合のみこの独自規則が適用され、管理コンソールから操作する場合は、バージニア北部であっても他のリージョンと同じ規則が適用されているため、リージョンによる仕様の違いを意識する機会は少なかったかもしれません。
この度、2018年3月1日よりこの「※ただしバージニア北部に限る」が撤廃され、全リージョンの命名規則が統一されます。 API を使ってバージニア北部にバケットを作成している場合は、作成するバケット名がこの仕様変更の影響を受けないことをご確認くだださい。
なお、作成済みバケットへの影響はありません。
仕様変更のメリット
この変更により、新規に作成されるバケット名はDNS準拠(ドメイン名のラベル)するようになります。
例として、大文字を含んだS3バケットに対して仮想ホスト形式のリクエスト(http://MyAWSBucket.s3.amazonaws.com/yourobject)することを考えます。
URLに含まれるバケット名(MyAWSBucket
)は小文字の myawsbucket
で解決され、Amazon S3 に myawsbucket
のバケット名で検索するため、Amazon S3 は "bucket not found" エラーを返します。
S3ドキュメントの仕様変更記載
この仕様変更に伴う次のドキュメントの変更履歴を確認します。日本語ドキュメントのアップデートが追いついていないため、英語で比較します。
2017年10月11日には以下のような仕様変更予告のアナウンスがありました(internet archiveで確認)。
"coming months(数か月以内)" にバージニア北部リージョンの仕様が変わる予告があります。
2018年2月3日時点の同じ箇所です。
Information のブロックが用意され、切替日(On March 1, 2018)とともに、影響を確認する具体的な記載も含まれています。
命名規則の違い
バケット名に関する箇所を抜粋して比較します。
リージョン | 北部バージニア固有 | 残りのリージョン |
バケット名の最大長 | 255文字 | 63文字 |
大文字 | ◯ | ☓ |
小文字 | ◯ | ◯ |
ハイフン | ◯ | ◯ |
アンダースコア | ◯ | ☓ |
ピリオド | ◯(非推奨) | ◯(非推奨) |
DNS非準拠なバケットを作成してみる
現時点の挙動を確認するために、北部バージニアリージョンでDNS非準拠なバケット名を作成してみます。 作成するバケット名は禁止文字である大文字("C")を含んだ「876abC」です。
管理コンソールから作成
ドキュメントに"If you use the AWS Management Console, bucket names must be DNS-compliant in all Regions." と記載があるとおり、北部バージニアであっても、DNS非準拠なバケット名は作成できません。
API から作成
次に AWS CLI をつかって API 経由で作成します。
まずは、東京リージョン(ap-northeast-1)で作成してみます。
$ aws s3 mb s3://876abC --region ap-northeast-1 --debug ... 2018-02-03 09:50:56,930 - MainThread - botocore.vendored.requests.packages.urllib3.connectionpool - DEBUG - "PUT /876abC HTTP/1.1" 400 None 2018-02-03 09:50:56,934 - MainThread - botocore.parsers - DEBUG - Response headers: {'x-amz-id-2': 'DUMMY', 'server': 'AmazonS3', 'transfer-encoding': 'chunked', 'connection': 'close', 'x-amz-request-id': 'DUMMY', 'date': 'Sat, 03 Feb 2018 08:50:56 GMT', 'content-type': 'application/xml'} 2018-02-03 09:50:56,935 - MainThread - botocore.parsers - DEBUG - Response body: <?xml version="1.0" encoding="UTF-8"?> <Error><Code>InvalidBucketName</Code><Message>The specified bucket is not valid.</Message><BucketName>876abC</BucketName><RequestId>DUMMY</RequestId><HostId>DUMMY</HostId></Error> ... make_bucket failed: s3://876abC An error occurred (InvalidBucketName) when calling the CreateBucket operation: The specified bucket is not valid.
期待通り、HTTPステータスコード400でエラー(InvalidBucketName)が発生しました。
次に、北部バージニアリージョン(us-west-1)で作成してみます。
$ aws s3 mb s3://876abC --region us-east-1 --debug ... 2018-02-03 09:53:07,757 - MainThread - botocore.vendored.requests.packages.urllib3.connectionpool - DEBUG - "PUT /876abC HTTP/1.1" 200 0 2018-02-03 09:53:07,758 - MainThread - botocore.parsers - DEBUG - Response headers: {'content-length': '0', 'x-amz-id-2': 'DUMMY', 'server': 'AmazonS3', 'x-amz-request-id': 'DUMMY', 'location': '/876abC', 'date': 'Sat, 03 Feb 2018 08:53:08 GMT'} 2018-02-03 09:53:07,758 - MainThread - botocore.parsers - DEBUG - Response body: ... make_bucket: 876abC
期待通り、HTTPステータスコード200で大文字を含んだS3バケットを作成できました。 なお、レスポンスヘッダー含めて、警告メッセージは見当たりませんでした。
まとめ
きたる2018年3月の仕様変更により、北部バージニアリージョンで作成可能なS3バケットの命名規則が厳しくなり、他のリージョンと同じ規則になります。 管理コンソールからS3バケットを作成している場合は、すでに厳しい規則が適用されているため、変更はありません。
スクリプトなどで北部バージニアにS3バケットを作成している場合は、バケット名が新しい規則の影響を受けないことをご確認下さい。