バージニア北部(us-east-1)リージョンのS3バケット命名規則が2018年3月から変わります

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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ドキュメントの仕様変更記載

この仕様変更に伴う次のドキュメントの変更履歴を確認します。日本語ドキュメントのアップデートが追いついていないため、英語で比較します。

AWS Documentation » Amazon Simple Storage Service (S3) » Developer Guide » Working with Amazon S3 Buckets » Bucket Restrictions and Limitations

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バケットを作成している場合は、バケット名が新しい規則の影響を受けないことをご確認下さい。

参照