[アップデート] Amazon S3がアカウントリージョナル名前空間をサポートしました

[アップデート] Amazon S3がアカウントリージョナル名前空間をサポートしました

2026.03.13

はじめに

皆様こんにちは、あかいけです。

S3バケットを作成するとき、「このバケット名もう使われてるのか...っ」となったことはありますか?
私はあります。何度もあります。

S3のバケット名はグローバルで一意である必要があり、
シンプルな名前をつけようとすると大体すでに誰かに取られている、というのはS3あるあるですよね。

そんな中、アカウントリージョナル名前空間(Account Regional namespace) という機能が追加されました。

https://aws.amazon.com/jp/about-aws/whats-new/2026/03/amazon-s3-account-regional-namespaces/

今回はこの新機能について、概要からAWS CLI・CloudFormationでの作成方法、IAMポリシーによる強制まで、まとめてみました。

アップデートの概要

まず誤解しやすいポイントを先にお伝えしておきます。
この機能は 「バケット名がグローバルに一意でなくてもよくなった」というわけではありません。
S3のバケット名は引き続きグローバルで一意である必要があります。

私は冒頭の以下文章で完全に勘違いしました…。

You can now create Amazon S3 general purpose buckets in your own reserved namespace, eliminating the need to find globally unique bucket names and making it easier to build workloads that utilize a bucket per customer, team, or dataset.

では何が変わったのかというと、バケット名に-{AWSアカウントID}-{リージョン}-anというサフィックスを付与する命名規則が導入され、グローバル名前空間の中で 自分のアカウント専用の予約済み領域(=アカウントリージョナル名前空間)を利用できる ようになりました。

物理的に別の名前空間が用意されるわけではなく、グローバル名前空間の中でアカウントIDとリージョンを含む命名規則を強制することで、他のアカウントとの競合を防ぐ仕組みです。

バケット名の命名規則

アカウントリージョナル名前空間のバケット名は、以下の形式に従います。

{バケット名プレフィックス}-{AWSアカウントID}-{リージョン}-an

具体例はこんな感じです。

test-XXXXXXXXXXXX-ap-northeast-1-an

なお、S3バケット名の最大文字数は63文字のままなので、サフィックス部分を差し引いた残りがプレフィックスに使える文字数になります。
例えば東京リージョン(ap-northeast-1)の場合、サフィックスが31文字(-XXXXXXXXXXXX-ap-northeast-1-an)なので、プレフィックスは32文字までです。
(リージョンコードの長さによって変わるので注意してください)

バケットの作成方法

https://docs.aws.amazon.com/AmazonS3/latest/userguide/gpbucketnamespaces.html
https://aws.amazon.com/jp/blogs/aws/introducing-account-regional-namespaces-for-amazon-s3-general-purpose-buckets/

マネジメントコンソール

コンソールからの作成は最もシンプルです。
バケット作成画面のBucket namespaceで「Account Regional namespace (recommended)」を選択すると、AWSアカウントIDとリージョンのサフィックスが自動的に付与されます。
あとは「Bucket name prefix」を入力すればOKです。

スクリーンショット 2026-03-13 8.57.57

ちなみに従来の名前空間(Global namespace)で-anで終わるバケット名を作成しようとすると、以下のエラーが出ました。

General purpose buckets created in the global namespace must not include an account Regional namespace suffix in their names. If you meant to create a general purpose bucket in your account Regional namespace, choose Account Regional namespace under Bucket namespace. Otherwise, provide a new name for your general purpose bucket, and then try again.

スクリーンショット 2026-03-13 12.46.10

ドキュメントを見た限り、今回のアップデートで-anサフィックスがアカウントリージョナル名前空間専用に予約されたため、グローバル名前空間では-anで終わるバケット名が作成できなくなったようです。
つまり今後はグローバル名前空間側で同名のバケットが先に作成され競合してしまう、といったことはできなそうです。

Bucket names can only end with the suffix -an when you are creating buckets in your account regional namespace.
https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html

またおそらくアップデート前はこの制限はなかったはずなので、今回の機能追加で新たに入った制限だと思われます。
そのため逆に言うと、アップデート前に-anで終わるバケットが作成されていた場合は競合する可能性があるかも?しれません。

AWS CLI

AWS CLIでは--bucket-namespaceオプションにaccount-regionalを指定します。

aws s3api create-bucket \
    --bucket test-XXXXXXXXXXXX-ap-northeast-1-an \
    --bucket-namespace account-regional \
    --region ap-northeast-1 \
    --create-bucket-configuration LocationConstraint=ap-northeast-1

バケット名にはアカウントIDとリージョン、-anサフィックスを含めた完全な名前を指定する必要があります。
コンソールと違って自動補完はされないので、手動でフルネームを組み立てる形になります。

なので結局のところ、今まで通りアカウントIDやリージョンを変数で組み立てて渡すことになりそうです。

ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
REGION="ap-northeast-1"
BUCKET_PREFIX="test"
BUCKET_NAME="${BUCKET_PREFIX}-${ACCOUNT_ID}-${REGION}-an"

aws s3api create-bucket \
    --bucket "${BUCKET_NAME}" \
    --bucket-namespace account-regional \
    --region "${REGION}" \
    --create-bucket-configuration LocationConstraint="${REGION}"

ちなみに、命名規則に従っていないバケット名を指定した場合はエラーになります。
命名規則に沿っていないバケットの作成を防止できるので、これは良さそうですね。

An error occurred (InvalidNamespaceHeader) when calling the CreateBucket operation:
The requested bucket name did not include the account-regional namespace suffix,
but the provided x-amz-bucket-namespace header value is account-regional.
Specify -[accountId]-[region]-an as the bucket name suffix to create a bucket
in your account-regional namespace, or remove the header.

CloudFormation

CloudFormationではBucketNamespaceプロパティを使用します。
2つの方法があります。

なお本ブログの時点ではAWS::S3::BucketのスキーマにBucketNamespaceプロパティが反映されておらず、デプロイ時に以下のエラーになりました。

VALIDATION_FAILED
Properties validation failed for resource MyBucket with message: [#: extraneous key [BucketNamespace] is not permitted]

AWS::S3::Bucketのドキュメントにも記載がなかったため、今後スキーマが更新され次第、使えるようになると思われます。

https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-s3-bucket.html

方法1: BucketNameとSub関数を使う

!SubでアカウントIDとリージョンを動的に埋め込みます。
ただ正直なところ、この方法はBucketNamespaceプロパティが追加されただけで、名前の組み立て方自体は従来と変わりません。
新機能の恩恵を感じるなら、後述の方法2のほうがおすすめです。

s3-account-regional.yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: S3 Bucket with Account Regional Namespace

Resources:
  MyBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub "test-${AWS::AccountId}-${AWS::Region}-an"
      BucketNamespace: "account-regional"
      BucketEncryption:
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: AES256
      PublicAccessBlockConfiguration:
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true

Outputs:
  BucketName:
    Description: Name of the S3 bucket
    Value: !Ref MyBucket
  BucketArn:
    Description: ARN of the S3 bucket
    Value: !GetAtt MyBucket.Arn

方法2: BucketNamePrefixを使う (おすすめ)

BucketNamePrefixを使うと、サフィックス(-{アカウントID}-{リージョン}-an)が自動的に付与されます。
こちらのほうがシンプルでおすすめです。

s3-account-regional-prefix.yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: S3 Bucket with Account Regional Namespace (using BucketNamePrefix)

Resources:
  MyBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketNamePrefix: "test"
      BucketNamespace: "account-regional"
      BucketEncryption:
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: AES256
      PublicAccessBlockConfiguration:
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true

Outputs:
  BucketName:
    Description: Name of the S3 bucket
    Value: !Ref MyBucket
  BucketArn:
    Description: ARN of the S3 bucket
    Value: !GetAtt MyBucket.Arn

IAMポリシーでアカウントリージョナル名前空間を強制する

組織全体でアカウントリージョナル名前空間の使用を強制したい場合、IAMポリシーやSCPで制御できます。
条件キーs3:x-amz-bucket-namespaceを使用します。

IAMポリシーの例

以下のポリシーは、アカウントリージョナル名前空間以外でのバケット作成を拒否します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "RequireAccountRegionalBucketCreation",
      "Effect": "Deny",
      "Action": "s3:CreateBucket",
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "s3:x-amz-bucket-namespace": "account-regional"
        }
      }
    }
  ]
}

SCP(サービスコントロールポリシー)の例

AWS Organizationsを使用している場合、SCPで組織全体に強制できます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "RequireAccountRegionalBucketCreation",
      "Effect": "Deny",
      "Action": "s3:CreateBucket",
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "s3:x-amz-bucket-namespace": "account-regional"
        }
      }
    }
  ]
}

SCPで組織全体に強制することで、新規バケットの作成が自動的にアカウントリージョナル名前空間に限定されるので、命名規則のばらつきを防げます。

さいごに

以上、Amazon S3のアカウントリージョナル名前空間についてまとめました。

「バケット名が取られていて作成できない」という地味だけど割と厄介な問題が、これでスッキリ解決できるようになったのではないでしょうか。
特にマルチアカウント・マルチリージョン構成の環境では、命名規則の統一とセキュリティ強化の両面で嬉しいアップデートだと思います。

今後のS3の設計の参考になれば幸いです。

この記事をシェアする

FacebookHatena blogX

関連記事