

# 在可用区中创建目录存储桶


要开始使用 Amazon S3 Express One Zone 存储类，您需要创建一个目录存储桶。S3 Express One Zone 存储类只能用于目录存储桶。S3 Express One Zone 存储类支持低延迟使用案例，并在单个可用区内提供更快的数据处理速度。如果您的应用程序注重性能，并且受益于个位数毫秒的 `PUT` 和 `GET` 延迟，我们建议您创建一个目录存储桶，以便可以使用 S3 Express One Zone 存储类。

Amazon S3 存储桶有两种类型：通用存储桶和目录存储桶。您应该选择适合您应用程序和性能要求的存储桶类型。通用存储桶是最初的 S3 存储桶类型。对于大多数使用案例和访问模式，建议使用通用桶，通用桶允许在除 S3 Express One Zone 之外的所有存储类中存储对象。有关通用存储桶的更多信息，请参阅[通用存储桶概述](UsingBucket.md)。

目录存储桶使用 S3 Express One Zone 存储类，该存储类专用于需要一致的个位数毫秒延迟的工作负载或性能关键型应用程序。S3 Express One Zone 是第一种可以在其中选择单个可用区的 S3 存储类，您可以选择将您的对象存储与计算资源联合托管在一个位置，从而提供尽可能高的访问速度。创建目录存储桶时，您可以选择指定 Amazon EC2、Amazon Elastic Kubernetes Service 或 Amazon Elastic Container Service（Amazon ECS）计算实例的本地 Amazon Web Services 区域和可用区，以优化性能。

使用 S3 Express One Zone，您的数据将冗余地存储在单个可用区中的多个设备上。S3 Express One Zone 设计为在单个可用区内提供 99.95% 的可用性，并由 [Amazon S3 服务等级协议](https://www.amazonaws.cn/s3/sla/)提供支持。有关更多信息，请参阅 [可用区](directory-bucket-high-performance.md#s3-express-overview-az)。

目录桶将数据按层次结构组织到目录中，而不是通用桶的扁平存储结构。目录存储桶没有前缀限制，单个目录可以横向扩展。

有关目录存储桶的更多信息，请参阅[使用目录存储桶](directory-buckets-overview.md)。

**目录存储桶名称**  
目录存储桶名称必须遵循以下格式并遵守目录存储桶命名规则：

```
bucket-base-name--zone-id--x-s3
```

例如，以下目录存储桶名称包含可用区 ID `usw2-az1`：

```
bucket-base-name--usw2-az1--x-s3
```

有关目录存储桶命名规则的更多信息，请参阅[目录存储桶命名规则](directory-bucket-naming-rules.md)。

## 使用 S3 控制台


1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在页面顶部的导航栏中，选择当前所显示 Amazon Web Services 区域的名称。接下来，选择要在其中创建存储桶的区域。
**注意**  
要最大程度地减少延迟和成本以及满足法规要求，请选择一个靠近您的区域。在某一区域存储的对象将一直留在该区域，除非您特意将其转移到其他区域。有关 Amazon S3 Amazon Web Services 区域的列表，请参阅《Amazon Web Services 一般参考》**中的 [Amazon Web Services 服务 端点](https://docs.amazonaws.cn/general/latest/gr/rande.html#s3_region)。

1. 在左侧导航窗格中，选择**目录存储桶**。

1. 选择**创建存储桶**。此时将打开**创建存储桶**页面。

1. 在**常规配置**下，查看将在其中创建存储桶的 Amazon Web Services 区域。

   在**存储桶类型**下，请选择**目录**。
**注意**  
如果您选择的区域不支持目录桶，则**桶类型**选项将消失，桶类型默认为通用桶。要创建目录桶，您必须选择受支持的区域。有关支持目录桶和 Amazon S3 Express One Zone 存储类的区域列表，请参阅[S3 Express One Zone 可用区和区域](s3-express-Endpoints.md)。
在创建存储桶后，便无法更改存储桶类型。
**注意**  
创建存储桶后无法更改可用区。

1. 对于**可用区**，请选择计算服务本地的可用区。有关支持目录桶和 S3 Express One Zone 存储类的可用区列表，请参阅[S3 Express One Zone 可用区和区域](s3-express-Endpoints.md)。

   在**可用区**下，选中复选框以确认在可用区中断时，您的数据可能不可用或丢失。
**重要**  
尽管目录桶存储在单个可用区中的多个设备上，但目录桶不会跨可用区冗余存储数据。

1. 对于**存储桶名称**，请输入目录存储桶的名称。

   以下命名规则适用于目录存储桶。
   + 在选定的区域（Amazon 可用区或 Amazon 本地区域）内是唯一的。
   + 名称的长度必须介于 3（最小）到 63（最大）个字符之间，包括后缀。
   + 仅包含小写字母、数字和连字符（-）。
   + 以字母或数字开头和结尾。
   + 必须包含以下后缀：`--zone-id--x-s3`。
   + 存储桶名称不得以前缀 `xn--` 开头。
   + 存储桶名称不得以前缀 `sthree-` 开头。
   + 存储桶名称不得以前缀 `sthree-configurator` 开头。
   + 存储桶名称不得以前缀 ` amzn-s3-demo-` 开头。
   + 存储桶名称不得以后缀 `-s3alias` 结尾。此后缀是为接入点别名预留的。有关更多信息，请参阅 [接入点别名](access-points-naming.md#access-points-alias)。
   + 存储桶名称不得以后缀 `--ol-s3` 结尾。此后缀是为对象 Lambda 接入点别名预留的。有关更多信息，请参阅 [如何为您的 S3 存储桶对象 Lambda 接入点使用存储桶式别名](olap-use.md#ol-access-points-alias)。
   + 存储桶名称不得以后缀 `.mrap` 结尾。此后缀预留用于多区域接入点名称。有关更多信息，请参阅 [命名 Amazon S3 多区域接入点的规则](multi-region-access-point-naming.md)。

   后缀将自动添加到您使用控制台创建目录存储桶时提供的基本名称中。此后缀包括您选择的可用区的可用区 ID。

   创建存储桶后，便无法更改其名称。有关给存储桶命名的更多信息，请参阅[通用存储桶命名规则](bucketnamingrules.md)。
**重要**  
请勿在桶名称中包含敏感信息，如账号。存储桶名称会显示在指向存储桶中的对象的 URL 中。

1. 在**对象所有权**下，将自动启用**强制桶拥有者**设置，并禁用所有访问控制列表（ACL）。对于目录存储桶，无法启用 ACL。

    **强制存储桶拥有者（默认）**：ACL 已禁用，存储桶拥有者自动拥有并完全控制通用存储桶中的每个对象。ACL 不再影响对 S3 通用存储桶中数据的访问权限。存储桶专门使用策略来定义访问控制。

1. 在**此桶的屏蔽公共访问权限设置**下，目录桶的所有屏蔽公共访问权限设置已自动启用。无法修改目录桶的这些设置。有关阻止公共访问的更多信息，请参阅[阻止对您的 Amazon S3 存储的公有访问](access-control-block-public-access.md)。

1. 要配置默认加密，请在**加密类型**下，选择以下选项之一：
   + **具有 Amazon S3 托管式密钥的服务器端加密（SSE-S3）**
   + **具有 Amazon Key Management Service 密钥的服务器端加密（SSE-KMS）**

   有关使用 Amazon S3 服务器端加密对数据进行加密的更多信息，请参阅[数据保护和加密](s3-express-data-protection.md)。
**重要**  
如果您将 SSE-KMS 选项用于默认加密配置，则您将受到 Amazon KMS 的每秒请求数（RPS）限额限制。有关 Amazon KMS 限额以及如何请求增加限额的更多信息，请参阅《Amazon Key Management Service 开发人员指南》**中的[限额](https://docs.amazonaws.cn/kms/latest/developerguide/limits.html)。  
当您启用默认加密时，您可能需要更新存储桶策略。有关更多信息，请参阅 [使用 SSE-KMS 加密进行跨账户操作](bucket-encryption.md#bucket-encryption-update-bucket-policy)。

1. 如果您选择**具有 Amazon S3 托管式密钥的服务器端加密（SSE-S3）**，则在**存储桶密钥**下方将显示**已启用**。当您将目录存储桶配置为使用 SSE-S3 进行默认加密时，始终启用 S3 存储桶密钥。始终为目录存储桶中的 `GET` 和 `PUT` 操作启用 S3 存储桶密钥，并且不能禁用。当您通过 [https://docs.amazonaws.cn/AmazonS3/latest/API/API_CopyObject.html](https://docs.amazonaws.cn/AmazonS3/latest/API/API_CopyObject.html)、[https://docs.amazonaws.cn/AmazonS3/latest/API/API_UploadPartCopy.html](https://docs.amazonaws.cn/AmazonS3/latest/API/API_UploadPartCopy.html)、[批量操作中的 Copy 操作](directory-buckets-objects-Batch-Ops.md)或 [import 任务](create-import-job.md)，将 SSE-KMS 加密的对象从通用存储桶复制到目录存储桶、从目录存储桶复制到通用存储桶，或在目录存储桶之间复制时，不支持 S3 存储桶密钥。在这种情况下，每次对 KMS 加密的对象发出复制请求时，Amazon S3 都会调用 Amazon KMS。

   S3 存储桶密钥可通过减少从 Amazon S3 到 Amazon KMS 的请求流量，降低加密成本。有关更多信息，请参阅 [使用 Amazon S3 存储桶密钥降低 SSE-KMS 的成本](bucket-key.md)。

1. 如果您选择了**具有 Amazon Key Management Service 密钥的服务器端加密（SSE-KMS）**，则在 **Amazon KMS 密钥**下，通过以下方式之一指定您的 Amazon Key Management Service 密钥或创建新密钥。
   + 要从可用 KMS 密钥列表中进行选择，选择**从您的 Amazon KMS keys中进行选择**，并从**可用的 Amazon KMS keys**中选择您的 **KMS 密钥**。

     只有您的客户自主管理型密钥显示在此列表中。目录存储桶不支持 Amazon 托管式密钥 (`aws/s3`)。有关客户自主管理型密钥的更多信息，请参阅《Amazon Key Management Service 开发人员指南》**中的[客户密钥和 Amazon 密钥](https://docs.amazonaws.cn//kms/latest/developerguide/concepts.html#key-mgmt)。
   + 要输入 KMS 密钥 ARN 或别名，选择**输入 Amazon KMS key ARN**，然后在 **Amazon KMS key ARN** 中输入您的 KMS 密钥 ARN 或别名。
   + 要在 Amazon KMS 控制台中创建新的客户自主管理型密钥，请选择**创建 KMS 密钥**。

     有关创建 Amazon KMS key 的更多信息，请参阅《Amazon Key Management Service 开发人员指南》**中的[创建密钥](https://docs.amazonaws.cn//kms/latest/developerguide/create-keys.html)。
**重要**  
在存储桶的生命周期内，SSE-KMS 配置只能支持每个目录存储桶 1 个 [customer managed key](https://docs.amazonaws.cn/kms/latest/developerguide/concepts.html#customer-cmk)。[https://docs.amazonaws.cn/kms/latest/developerguide/concepts.html#aws-managed-cmk](https://docs.amazonaws.cn/kms/latest/developerguide/concepts.html#aws-managed-cmk) (`aws/s3`) 不受支持。此外，在为 SSE-KMS 指定客户自主管理型密钥后，无法覆盖存储桶的 SSE-KMS 配置的客户自主管理型密钥。  
可以通过以下方式，确定您为存储桶的 SSE-KMS 配置指定的客户自主管理型密钥：  
您发出 `HeadObject` API 操作请求以查找响应中 `x-amz-server-side-encryption-aws-kms-key-id` 的值。
要对数据使用新的客户自主管理型密钥，我们建议使用新的客户自主管理型密钥将现有对象复制到新的目录存储桶中。
您只能使用与存储桶所在相同的 Amazon Web Services 区域中可用的 KMS 密钥。Amazon S3 控制台仅列出与存储桶位于同一区域中的前 100 个 KMS 密钥。要使用未列出的 KMS 密钥，您必须输入 KMS 密钥 ARN。如果您希望使用其他账户拥有的 KMS 密钥，则必须首先有权使用该密钥，然后必须输入相应的 KMS 密钥 ARN。有关 KMS 密钥的跨账户权限的更多信息，请参阅《Amazon Key Management Service 开发人员指南》**中的[创建其他账户可以使用的 KMS 密钥](https://docs.amazonaws.cn//kms/latest/developerguide/key-policy-modifying-external-accounts.html#cross-account-console)。有关 SSE-KMS 的更多信息，请参阅[为目录存储桶中的新对象上传指定具有 Amazon KMS 的服务器端加密（SSE-KMS）](s3-express-specifying-kms-encryption.md)。
在目录存储桶中使用 Amazon KMS key进行服务器端加密时，您必须选择对称加密 KMS 密钥。Amazon S3 仅支持对称加密 KMS 密钥，而不支持非对称 KMS 密钥。有关更多信息，请参阅《Amazon Key Management Service 开发人员指南》**中的[确定对称和非对称 KMS 密钥](https://docs.amazonaws.cn//kms/latest/developerguide/find-symm-asymm.html)。

   有关将 Amazon KMS 与 Amazon S3 结合使用的更多信息，请参阅[在目录存储桶中使用具有 Amazon KMS 密钥的服务器端加密（SSE-KMS）](s3-express-UsingKMSEncryption.md)。

1. 选择 **创建存储桶 **。创建存储桶后，您可以向存储桶中添加文件和文件夹。有关更多信息，请参阅 [使用目录桶中的对象](directory-buckets-objects.md)。

## 使用 Amazon SDK


------
#### [ SDK for Go ]

此示例说明如何使用 适用于 Go 的 Amazon SDK 创建目录桶。

**Example**  

```
var bucket = "..."

func runCreateBucket(c *s3.Client) {
    resp, err := c.CreateBucket(context.Background(), &s3.CreateBucketInput{
        Bucket: &bucket,
        CreateBucketConfiguration: &types.CreateBucketConfiguration{
            Location: &types.LocationInfo{
                Name: aws.String("usw2-az1"),
                Type: types.LocationTypeAvailabilityZone,
            },  
            Bucket: &types.BucketInfo{
                DataRedundancy: types.DataRedundancySingleAvailabilityZone,
                Type:           types.BucketTypeDirectory,
            },  
        },  
    })  
    var terr *types.BucketAlreadyOwnedByYou
    if errors.As(err, &terr) {
        fmt.Printf("BucketAlreadyOwnedByYou: %s\n", aws.ToString(terr.Message))
        fmt.Printf("noop...\n")
        return
    }   
    if err != nil {
        log.Fatal(err)
    }   

    fmt.Printf("bucket created at %s\n", aws.ToString(resp.Location))
}
```

------
#### [ SDK for Java 2.x ]

此示例说明如何使用 Amazon SDK for Java 2.x 创建目录桶。

**Example**  

```
public static void createBucket(S3Client s3Client, String bucketName) {

    //Bucket name format is {base-bucket-name}--{az-id}--x-s3
    //example: doc-example-bucket--usw2-az1--x-s3 is a valid name for a directory bucket created in
    //Region us-west-2, Availability Zone 2  

    CreateBucketConfiguration bucketConfiguration = CreateBucketConfiguration.builder()
             .location(LocationInfo.builder()
                     .type(LocationType.AVAILABILITY_ZONE)
                     .name("usw2-az1").build()) //this must match the Region and Availability Zone in your bucket name
             .bucket(BucketInfo.builder()
                    .type(BucketType.DIRECTORY)
                    .dataRedundancy(DataRedundancy.SINGLE_AVAILABILITY_ZONE)
                    .build()).build();
    try {
    
             CreateBucketRequest bucketRequest = CreateBucketRequest.builder().bucket(bucketName).createBucketConfiguration(bucketConfiguration).build();
             CreateBucketResponse response = s3Client.createBucket(bucketRequest);
             System.out.println(response);
    } 
    
    catch (S3Exception e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
         }
    }
```

------
#### [ 适用于 JavaScript 的 Amazon SDK ]

此示例说明如何使用 适用于 JavaScript 的 Amazon SDK 创建目录桶。

**Example**  

```
// file.mjs, run with Node.js v16 or higher
// To use with the preview build, place this in a folder 
// inside the preview build directory, such as /aws-sdk-js-v3/workspace/

import { S3 } from "@aws-sdk/client-s3";

const region = "us-east-1";
const zone = "use1-az4";
const suffix = `${zone}--x-s3`;

const s3 = new S3({ region });

const bucketName = `...--${suffix}`;

const createResponse = await s3.createBucket( 
    { Bucket: bucketName, 
      CreateBucketConfiguration: {Location: {Type: "AvailabilityZone", Name: zone},
      Bucket: { Type: "Directory", DataRedundancy: "SingleAvailabilityZone" }}
    } 
   );
```

------
#### [ 适用于 .NET 的 Amazon SDK ]

此示例说明如何使用 适用于 .NET 的 Amazon SDK 创建目录桶。

**Example**  

```
using (var amazonS3Client = new AmazonS3Client())
{
    var putBucketResponse = await amazonS3Client.PutBucketAsync(new PutBucketRequest
    {

       BucketName = "DOC-EXAMPLE-BUCKET--usw2-az1--x-s3",
       PutBucketConfiguration = new PutBucketConfiguration
       {
         BucketInfo = new BucketInfo { DataRedundancy = DataRedundancy.SingleAvailabilityZone, Type = BucketType.Directory },
         Location = new LocationInfo { Name = "usw2-az1", Type = LocationType.AvailabilityZone }
       }
     }).ConfigureAwait(false);
}
```

------
#### [ SDK for PHP ]

此示例说明如何使用 Amazon SDK for PHP 创建目录桶。

**Example**  

```
require 'vendor/autoload.php';

$s3Client = new S3Client([

    'region'      => 'us-east-1',
]);


$result = $s3Client->createBucket([
    'Bucket' => 'doc-example-bucket--use1-az4--x-s3',
    'CreateBucketConfiguration' => [
        'Location' => ['Name'=> 'use1-az4', 'Type'=> 'AvailabilityZone'],
        'Bucket' => ["DataRedundancy" => "SingleAvailabilityZone" ,"Type" => "Directory"]   ],
]);
```

------
#### [ SDK for Python ]

此示例说明如何使用 适用于 Python (Boto3) 的 Amazon SDK 创建目录桶。

**Example**  

```
import logging
import boto3
from botocore.exceptions import ClientError

def create_bucket(s3_client, bucket_name, availability_zone):
    '''
    Create a directory bucket in a specified Availability Zone

    :param s3_client: boto3 S3 client
    :param bucket_name: Bucket to create; for example, 'doc-example-bucket--usw2-az1--x-s3'
    :param availability_zone: String; Availability Zone ID to create the bucket in, for example, 'usw2-az1'
    :return: True if bucket is created, else False
    '''

    try:
        bucket_config = {
                'Location': {
                    'Type': 'AvailabilityZone',
                    'Name': availability_zone
                },
                'Bucket': {
                    'Type': 'Directory', 
                    'DataRedundancy': 'SingleAvailabilityZone'
                }
            }
        s3_client.create_bucket(
            Bucket = bucket_name,
            CreateBucketConfiguration = bucket_config
        )
    except ClientError as e:
        logging.error(e)
        return False
    return True


if __name__ == '__main__':
    bucket_name = 'BUCKET_NAME'
    region = 'us-west-2'
    availability_zone = 'usw2-az1'
    s3_client = boto3.client('s3', region_name = region)
    create_bucket(s3_client, bucket_name, availability_zone)
```

------
#### [ SDK for Ruby ]

此示例说明如何使用 适用于 Ruby 的 Amazon SDK 创建目录桶。

**Example**  

```
s3 = Aws::S3::Client.new(region:'us-west-2')
s3.create_bucket(
  bucket: "bucket_base_name--az_id--x-s3",
  create_bucket_configuration: {
    location: { name: 'usw2-az1', type: 'AvailabilityZone' },
    bucket: { data_redundancy: 'SingleAvailabilityZone', type: 'Directory' }
  }
)
```

------

## 使用 Amazon CLI


此示例说明如何使用 Amazon CLI 创建目录桶。要使用该命令，请将*用户输入占位符* 替换为您自己的信息。

创建目录存储桶时，必须提供配置详细信息并使用以下命名约定：`bucket-base-name--zone-id--x-s3`

```
aws s3api create-bucket
--bucket bucket-base-name--zone-id--x-s3
--create-bucket-configuration 'Location={Type=AvailabilityZone,Name=usw2-az1},Bucket={DataRedundancy=SingleAvailabilityZone,Type=Directory}'
--region us-west-2
```

有关更多信息，请参阅 Amazon Command Line Interface 中的 [create-bucket](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/create-bucket.html)。