亚马逊AWS官方博客

为 Amazon S3 通用存储桶引入账户区域命名空间

今天,我们宣布推出 Amazon Simple Storage Service(Amazon S3)的一项新功能,您可以使用该功能在自己的账户区域命名空间中创建通用存储桶,从而在数据存储需求规模和范围增长时简化存储桶的创建和管理。您可以跨多个 AWS 区域创建通用存储桶名称,确保所需的存储桶名称始终可供您使用。

借助此功能,您可以通过在请求的存储桶名称中附加账户的唯一后缀,在自己的账户区域命名空间中以可预测的方式命名和创建通用存储桶。例如,我可以在我的账户区域命名空间中创建存储桶 mybucket-123456789012-us-east-1-anmybucket 是我指定的存储桶名称前缀,然后我在请求的存储桶名称中添加我的账户区域后缀:-123456789012-us-east-1-an。如果其他账户尝试使用我的账户后缀创建存储桶,其请求将被自动拒绝。

您的安全团队可以通过 AWS Identity and Access Management(AWS IAM)策略和 AWS Organizations 服务控制策略强制员工仅使用新的 s3:x-amz-bucket-namespace 条件键,在账户区域命名空间内创建存储桶,帮助团队在组织范围内采用账户区域命名空间。

使用账户区域命名空间创建您的 S3 存储桶
首先,在 Amazon S3 控制台选择创建存储桶。要在账户区域命名空间中创建存储桶,请选择账户区域命名空间。选择该选项后,您可以使用对您的账户和区域具有唯一性的任意名称创建存储桶。

该配置支持全局命名空间中通用存储桶的所有功能。唯一区别是,只有您的账户可以使用带有该账户后缀的存储桶名称。存储桶名称前缀和账户区域后缀的组合长度需在 3~63 个字符之间。

使用 AWS 命令行界面(AWS CLI),您可以通过指定 x-amz-bucket-namespace:account-regional 请求标头并提供兼容的存储桶名称来创建具有账户区域命名空间的存储桶。

$ aws s3api create-bucket --bucket mybucket-123456789012-us-east-1-an \
   --bucket-namespace account-regional \
   --region us-east-1

您可以通过 CreateBucket API 请求,使用适用于 Python 的 Amazon SDK(Boto3)来创建具有账户区域命名空间的存储桶。

import boto3

class AccountRegionalBucketCreator:
    """Creates S3 buckets using account-regional namespace feature."""
    
    ACCOUNT_REGIONAL_SUFFIX = "-an"
    
    def __init__(self, s3_client, sts_client):
        self.s3_client = s3_client
        self.sts_client = sts_client
    
    def create_account_regional_bucket(self, prefix):
        """
        Creates an account-regional S3 bucket with the specified prefix.
        Resolves caller AWS account ID using the STS GetCallerIdentity API.
        Format: ---an
        """
        account_id = self.sts_client.get_caller_identity()['Account']
        region = self.s3_client.meta.region_name
        bucket_name = self._generate_account_regional_bucket_name(
            prefix, account_id, region
        )
        
        params = {
            "Bucket": bucket_name,
            "BucketNamespace": "account-regional"
        }
        if region != "us-east-1":
            params["CreateBucketConfiguration"] = {
                "LocationConstraint": region
            }
        
        return self.s3_client.create_bucket(**params)
    
    def _generate_account_regional_bucket_name(self, prefix, account_id, region):
        return f"{prefix}-{account_id}-{region}{self.ACCOUNT_REGIONAL_SUFFIX}"


if __name__ == '__main__':
    s3_client = boto3.client('s3')
    sts_client = boto3.client('sts')
    
    creator = AccountRegionalBucketCreator(s3_client, sts_client)
    response = creator.create_account_regional_bucket('test-python-sdk')
    
    print(f"Bucket created: {response}")

您可以更新基础设施即代码(IaC)工具,例如 AWS CloudFormation,以简化在账户区域命名空间中创建存储桶的过程。AWS CloudFormation 提供伪参数 AWS::AccountIdAWS::Region,便于构建创建账户区域命名空间存储桶的 CloudFormation 模板

以下示例演示了如何更新现有 CloudFormation 模板,以开始在账户区域命名空间中创建存储桶:

BucketName: !Sub "amzn-s3-demo-bucket-${AWS::AccountId}-${AWS::Region}-an"
BucketNamespace: "account-regional"

或者,您也可以使用 BucketNamePrefix 属性来更新 CloudFormation 模板。通过使用 BucketNamePrefix,只需提供存储桶名称中客户定义的部分,它就会根据请求的 AWS 账户和指定的区域自动添加账户区域命名空间后缀。

BucketNamePrefix: 'amzn-s3-demo-bucket'
BucketNamespace: "account-regional"

通过使用这些选项,您可以构建自定义 CloudFormation 模板,以便在账户区域命名空间中轻松创建通用存储桶。

注意事项
您无法将现有的全局命名空间存储桶重命名为账户区域命名空间格式,但可在账户区域命名空间中新建通用存储桶。此外,账户区域命名空间仅支持通用存储桶。S3 表存储桶和向量存储桶已存在于账户级命名空间,S3 目录存储桶则存在于分区级命名空间。

要了解更多信息,请访问《Amazon S3 用户指南》中的通用存储桶命名空间

现已推出
Amazon S3 账户区域命名空间通用存储桶创建功能现已在包括 AWS 中国区域和 AWS GovCloud(美国)区域在内的 37 个 AWS 区域上线。您可以在账户区域命名空间中创建通用存储桶,无需额外付费。

立即在 Amazon S3 控制台中试用该功能,并通过您常用的 AWS Support 联系方式向 AWS re:Post for Amazon S3 发送反馈。

Channy