Skip to content

Auto-detect account regional namespace buckets in s3 mb#10212

Open
AndrewAsseily wants to merge 4 commits intov2from
s3-mb-account-regional-namespace
Open

Auto-detect account regional namespace buckets in s3 mb#10212
AndrewAsseily wants to merge 4 commits intov2from
s3-mb-account-regional-namespace

Conversation

@AndrewAsseily
Copy link
Copy Markdown
Contributor

Issue #, if available:

Description of changes:

The s3 mb command now automatically detects account regional namespace bucket names (matching *---an) and sets the x-amz-bucket-namespace: account-regional header on the CreateBucket request. Previously, users had to fall back to s3api create-bucket --bucket-namespace for
this workflow.

By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.

@aemous aemous self-requested a review April 15, 2026 20:52
@aemous aemous self-assigned this Apr 15, 2026
Copy link
Copy Markdown
Contributor

@aemous aemous left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Left some comments.

Also, consider adding ~1 integration test. We are making some assumption on server behavior so it may be worth baking that into tests. Such as, attempt to create a bucket with name xyz-an, and expect s3 to return an error that the formatting is wrong.

@@ -0,0 +1,5 @@
{
"type": "enhancement",
"category": "s3",
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"category": "s3",
"category": "``S3``",

{
"type": "enhancement",
"category": "s3",
"description": "Add support for creating S3 account regional namespace buckets with aws s3 mb. The command now automatically detects bucket names matching the account-regional naming pattern and sets the required x-amz-bucket-namespace header."
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"description": "Add support for creating S3 account regional namespace buckets with aws s3 mb. The command now automatically detects bucket names matching the account-regional naming pattern and sets the required x-amz-bucket-namespace header."
"description": "Add support for creating S3 account regional namespace buckets with ``aws s3 mb``. The command now automatically detects bucket names matching the account-regional naming pattern and sets the required ``x-amz-bucket-namespace`` header."

)

_S3_ACCOUNT_REGIONAL_NAMESPACE_REGEX = re.compile(
r'^.+-\d{12}-[a-z]{2}(-[a-z]+-\d+)?-an$'
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have concerns for this regex.

According to the S3 docs:

Bucket names can only end with the suffix -an when you are creating buckets in your account regional namespace. For more information, see Namespaces for general purpose buckets.

If our mb command is making a best-effort attempt at creating buckets, then I think we should always add the regional namespace header when the suffix is -an. This would match Console behavior, the front-end does client-side validation that if it ends with -an it must be for regional account namespace.

S3 will not allow users to create a bucket that ends with -an unless the header is provided, so I think it is on us to provide the header whenever that suffix is provided.

For example, I pulled down your code and tried this command:

$ aws s3 mb s3://xyz-an     
        
make_bucket failed: s3://xyz-an An error occurred (MissingNamespaceHeader) when calling the CreateBucket operation: The requested bucket is an account-regional namespace bucket, but your request is missing the required x-amz-bucket-namespace header.

I feel this error should not be encountered by our users, since we are in charge of supplying headers.

If the rest of the formatting doesn't match the expected format (e.g user gives bucket name xyz-an), S3 will give an API error that the name doesn't match the format. In my view that's ideal since they should remain the authoritative source of truth on the right format, rather than us trying to duplicate their formatting logic in the client.

This would also match how we handle S3 express buckets, we only check for the -x-s3 suffix, even though S3 requires a zone too.


def test_account_regional_namespace_bucket(self):
bucket = 'amzn-s3-demo-bucket-111122223333-us-west-2-an'
command = self.prefix + 's3://%s --region us-west-2' % bucket
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can we use f-strings on new code instead of formatting operator?

}
self.assert_params_for_cmd(command, expected_params)

def test_regular_bucket_no_namespace(self):
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

worth adding a test for bucket name xyz-an.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants