TerraformでAmazon S3のアカウントリージョナル名前空間バケットを作成してみた

TerraformでAmazon S3のアカウントリージョナル名前空間バケットを作成してみた

2026.03.19

Terraform AWS Provider v6.37.0で、Amazon S3のアカウントリージョナル名前空間バケットをサポートするbucket_namespace引数が追加されました。

Terraform経由でもアカウントリージョナル名前空間バケットが作成できるようになりました。

今回は、Terraformでアカウントリージョナル名前空間バケットを作成してみます。

アカウントリージョナル名前空間バケットとは

バケット名にAWSアカウントIDとリージョンを含めることで、名前の衝突を避けやすくする機能です。詳細は以下をご参照ください。

https://dev.classmethod.jp/articles/update-amazon-s3-account-regional-namespaces/

Terraform AWS Provider v6.37.0での対応

Terraform AWS Provider v6.37.0で、aws_s3_bucketリソースにbucket_namespace引数が追加されました。

https://github.com/hashicorp/terraform-provider-aws/releases/tag/v6.37.0

やってみた

Terraformコード

以下のコードでアカウントリージョナル名前空間バケットを作成します。

main.tf
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 6.37"
    }
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

data "aws_caller_identity" "current" {}
data "aws_region" "current" {}

resource "aws_s3_bucket" "example" {
  bucket           = format("my-bucket-%s-%s-an", data.aws_caller_identity.current.account_id, data.aws_region.current.id)
  bucket_namespace = "account-regional"
}

output "bucket_name" {
  value = aws_s3_bucket.example.bucket
}

bucketにはアカウントリージョナル形式の完全なバケット名({プレフィックス}-{AWSアカウントID}-{リージョン}-an)を指定します。data.aws_caller_identitydata.aws_regionでアカウントIDとリージョンを動的に取得し、format()で組み立てることで、コードを環境に依存しない形で記述できます。

bucket_namespace = "account-regional"を指定しないと、バケット名がアカウントリージョナル形式であってもバリデーションエラーになるため、忘れずに設定します。

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket.html#bucket-in-account-regional-namespace

bucket_prefixを使う場合はプレフィックス長に注意

bucketの代わりにbucket_prefixを使うこともできますが、注意が必要です。

bucket_prefixを指定すると、Terraformが独自の26文字のランダムサフィックスを付与した上に、アカウントリージョナルのサフィックスも付きます。東京リージョン(ap-northeast-1)の場合、ランダムサフィックス以降の固定部分だけで57文字となるため、bucket_prefixに指定できるのは最大6文字です。

{bucket_prefix(最大6文字)}{26文字のランダム文字列}-{アカウントID}-{リージョン}-an
例: test20260319063449180600000001-123456789012-ap-northeast-1-an(61文字)

プレフィックスが7文字以上になると63文字を超えてエラーになります。

Error: validating S3 Bucket (my-bucket20260319062107978900000001-123456789012-ap-northeast-1-an) name:
"my-bucket20260319062107978900000001-123456789012-ap-northeast-1-an" must contain from 3 to 63 characters

プレフィックスの制約が厳しいため、bucket + format()で完全なバケット名を組み立てる方法を推奨します。

Terraform実行

terraform init
terraform apply

実行結果:

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Outputs:

bucket_name = "my-bucket-123456789012-ap-northeast-1-an"

{プレフィックス}-{AWSアカウントID}-{リージョン}-anの形式でバケットが作成されていることを確認できます。

バケットの確認

マネジメントコンソールのS3画面でも確認できます。バケット一覧に名前空間の列が追加されており、Account regionalと表示されます。

まとめ

Terraform AWS Provider v6.37.0で追加されたbucket_namespace引数を使って、アカウントリージョナル名前空間バケットを作成しました。

bucketにはアカウントリージョナル形式の完全なバケット名を指定する必要があります。data.aws_caller_identityでアカウントIDを動的に取得して組み立てることで、環境に依存しない形で記述できます。

S3バケット名の競合が気になる場面で活用できそうです。

この記事をシェアする

FacebookHatena blogX

関連記事