

# 使用 AWS 托管式表存储桶
<a name="s3-tables-aws-managed-buckets"></a>

AWS 托管式表存储桶是专用的 Amazon S3 表存储桶，旨在存储 AWS 托管式表，例如 [S3 元数据](metadata-tables-overview.md)日记表和实时清单表。与您直接创建和管理的客户管理的表存储桶不同，AWS 托管式表存储桶是在您配置需要 AWS 托管式表的功能时由 AWS 自动预置的。创建托管式表时，它们属于基于源存储桶名称的预定义命名空间。无法修改此预定义命名空间。

每个 AWS 账户在每个区域都有一个 AWS 托管式表存储桶，并遵循命名约定 `aws-s3`。该存储桶用作与该区域中账户的资源相关联的所有托管式表的集中位置。

下表将 AWS 托管式表存储桶与客户管理的表存储桶进行比较。


| **功能** | **AWS 托管式表存储桶** | **客户管理的表存储桶** | 
| --- | --- | --- | 
| 创建 | 由 AWS 服务自动创建 | 可以手动创建这些存储桶 | 
| 命名 | 使用标准命名约定 (aws-s3) | 您自行定义名称 | 
| 表创建 | 只有 AWS 服务可以创建表 | 您可以创建表 | 
| 命名空间控制 | 您无法创建或删除命名空间（所有表均属于固定的命名空间） | 您可以创建和删除命名空间 | 
|  访问 | 只读访问权限 | 完全访问 | 
| 加密 | 仅当使用客户自主管理型 AWS Key Management Service（AWS KMS）密钥加密初始表时，您才能更改默认加密（SSE-S3）设置。 | 可以设置存储桶级别的默认加密并随时进行修改 | 
| 维护。 | 由 AWS 服务管理 | 可以在存储桶级别自定义自动维护 | 

## 使用 AWS 托管式表存储桶和查询表的权限
<a name="aws-managed-buckets-permissions"></a>

要使用 AWS 托管式表存储桶，您需要具有创建 AWS 托管式表存储桶和表以及为 AWS 托管式表指定加密设置的权限。您还需要具有查询 AWS 托管式表存储桶中的表的权限。

以下示例策略支持您通过 S3 元数据配置创建 AWS 托管式表存储桶：

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"PermissionsToWorkWithMetadataTables",
         "Effect":"Allow",
         "Action":[
             "s3:CreateBucketMetadataTableConfiguration",
             "s3tables:CreateTableBucket",
             "s3tables:CreateNamespace",
             "s3tables:CreateTable",
             "s3tables:GetTable",
             "s3tables:PutTablePolicy"
             "s3tables:PutTableEncryption",
             "kms:DescribeKey"
         ],
         "Resource":[
            "arn:aws:s3:::bucket/amzn-s3-demo-source-bucket",
            "arn:aws:s3tables:us-east-1:111122223333:bucket/aws-s3",
            "arn:aws:s3tables:us-east-1:111122223333:bucket/aws-s3/table/*",
            "arn:aws:kms:us-east-1:111122223333:key/01234567-89ab-cdef-0123-456789abcdef"
         ]
       }
    ]
}
```

以下示例策略支持您查询 AWS 托管式表存储桶中的表：

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"PermissionsToQueryMetadataTables",
         "Effect":"Allow",
         "Action":[
             "s3tables:GetTable",
             "s3tables:GetTableData",
             "s3tables:GetTableMetadataLocation",
             "kms:Decrypt"
         ],
         "Resource":[
            "arn:aws:s3tables:us-east-1:111122223333:bucket/aws-s3",
            "arn:aws:s3tables:us-east-1:111122223333:bucket/aws-s3/table/*",
            "arn:aws:kms:us-east-1:111122223333:key/01234567-89ab-cdef-0123-456789abcdef"
         ]
       }
    ]
}
```

## 查询 AWS 托管式表存储桶中的表
<a name="querying-tables-in-aws-managed-table-buckets"></a>

可以使用 S3 表支持的访问方法和引擎来查询 AWS 托管式表存储桶中的 AWS 托管式表。下面是一些示例查询。

------
#### [ Using standard SQL ]

以下示例说明如何使用标准 SQL 语法查询 AWS 托管式表：

```
SELECT *
FROM "s3tablescatalog/aws-s3"."b_amzn-s3-demo-source-bucket"."inventory"
LIMIT 10;
```

以下示例说明如何将 AWS 托管式表与您自己的表联接：

```
SELECT *
FROM "s3tablescatalog/aws-s3"."b_amzn-s3-demo-source-bucket"."inventory" a
JOIN "s3tablescatalog/amzn-s3-demo-table-bucket"."my_namespace"."my_table" b
ON a.key = b.key
LIMIT 10;
```

------
#### [ Using Spark ]

以下示例说明如何使用 Spark 查询表：

```
spark.sql("""
    SELECT *
    FROM ice_catalog.inventory a
    JOIN ice_catalog.my_table b
    ON a.key = b.key
""").show(10, true)
```

以下示例说明如何将 AWS 托管式表与另一个表联接：

```
SELECT *
FROM inventory a
JOIN my_table b
ON a.key = b.key
LIMIT 10;
```

------

## AWS 托管式表存储桶的加密
<a name="aws-managed-buckets-encryption"></a>

默认情况下，AWS 托管式表存储桶通过使用 Amazon S3 托管式密钥的服务器端加密（SSE-S3）进行加密。在创建 AWS 托管式表存储桶后，可以使用 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_PutTableBucketEncryption.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_PutTableBucketEncryption.html) 来将存储桶的默认加密设置设为使用具有 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）。

在创建 AWS 托管式表期间，可以选择使用 SSE-KMS 对其进行加密。如果选择使用 SSE-KMS，则必须提供与 AWS 托管式表存储桶位于同一区域的客户自主管理型 KMS 密钥。只能在创建 AWS 托管式表的过程中为表设置加密类型。创建 AWS 托管式表后，无法更改其加密设置。

如果您希望 AWS 托管式表存储桶和存储在其中的表使用相同的 KMS 密钥，请确保在创建表存储桶后，使用您用于加密表的 KMS 密钥对其进行加密。将表存储桶的默认加密设置更改为使用 SSE-KMS 后，这些加密设置将用于将来在存储桶中创建的任何表。