

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# 从 Amazon Redshift 中查询 Amazon S3 表类数据存储服务
<a name="querying-s3Tables"></a>

Amazon Redshift 与 Amazon S3 表存储桶集成，支持您使用 Amazon Redshift 访问 S3 表资源。无论您是刚开始使用，还是在 Iceberg 环境中管理数千个表，表存储桶都可以简化任何规模的数据湖管理。有关更多信息，请参阅 [Table Buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-buckets.html)。

本主题介绍如何开始使用 Amazon S3 表类数据存储服务和 Redshift 以及如何使用 Amazon Redshift 访问 S3 表类数据存储服务对象。

## 先决条件
<a name="querying-s3Tables-prerequisites"></a>

在从 Amazon Redshift 查询 S3 表类数据存储服务之前，必须将 S3 表类数据存储服务与 AWS Glue Data Catalog 集成。有关说明，请参阅[将 Amazon S3 表类数据存储服务与 AWS Glue Data Catalog 集成](https://docs.aws.amazon.com/glue/latest/dg/glue-federation-s3tables.html)。

在 S3 表类数据存储服务与 AWS Glue Data Catalog 集成后，具有所需 S3 表类数据存储服务和 AWS Glue IAM 权限的 IAM 主体可以通过 AWS Glue Data Catalog 发现 S3 表类数据存储服务。

**注意**  
方法 3（自动挂载的 awsdatacatalog）还有其它先决条件。有关详细信息，请参阅 [方法 3：自动挂载的 awsdatacatalog](#querying-s3Tables-method3)。

## 从 Amazon Redshift 中查询 S3 表类数据存储服务
<a name="querying-s3Tables-steps"></a>

要开始查询 S3 表类数据存储服务，请按照以下步骤执行：
+ 步骤 1：为 Amazon Redshift 创建 IAM 角色
+ 步骤 2：将 IAM 角色附加到您的 Amazon Redshift 集群
+ 步骤 3：从 Amazon Redshift 中查询 S3 表类数据存储服务

### 步骤 1：为 Amazon Redshift 创建 IAM 角色
<a name="querying-s3Tables-step1"></a>

您的集群需要授权，才能访问 AWS Glue 中的外部 S3 表类数据存储服务目录。为了提供该授权，Amazon Redshift 使用附加到集群的 IAM 角色。创建具有以下策略权限的 IAM 角色。

**注意**  
在下面的策略和示例中，将 `us-west-2` 替换为您的 AWS 区域，并将 `111122223333` 替换为您的 AWS 账户 ID。

**创建策略：**

1. 打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中，选择**策略**。

1. 选择**创建策略**。

1. 选择 **JSON** 选项卡。

1. 粘贴以下 JSON 策略文档：

   ```
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "GlueDataCatalogPermissions",
         "Effect": "Allow",
         "Action": [
           "glue:GetCatalog",
           "glue:GetDatabase",
           "glue:GetTable",
           "glue:GetTables",
           "glue:UpdateTable",
           "glue:DeleteTable"
         ],
         "Resource": [
           "arn:aws:glue:us-west-2:111122223333:catalog",
           "arn:aws:glue:us-west-2:111122223333:catalog/s3tablescatalog",
           "arn:aws:glue:us-west-2:111122223333:catalog/s3tablescatalog/*",
           "arn:aws:glue:us-west-2:111122223333:database/s3tablescatalog/*/*",
           "arn:aws:glue:us-west-2:111122223333:table/s3tablescatalog/*/*/*",
           "arn:aws:glue:us-west-2:111122223333:database/*",
           "arn:aws:glue:us-west-2:111122223333:table/*/*"
         ]
       },
       {
         "Sid": "S3TablesDataAccessPermissions",
         "Effect": "Allow",
         "Action": [
           "s3tables:GetTableBucket",
           "s3tables:GetNamespace",
           "s3tables:GetTable",
           "s3tables:GetTableMetadataLocation",
           "s3tables:GetTableData",
           "s3tables:ListTableBuckets",
           "s3tables:CreateTable",
           "s3tables:PutTableData",
           "s3tables:UpdateTableMetadataLocation",
           "s3tables:ListNamespaces",
           "s3tables:ListTables",
           "s3tables:DeleteTable"
         ],
         "Resource": [
           "arn:aws:s3tables:us-west-2:111122223333:bucket/*",
           "arn:aws:s3tables:us-west-2:111122223333:bucket/*/table/*"
         ]
       }
     ]
   }
   ```

1. 选择**查看策略**。

1. 在**查看策略**页面上，对于**名称**，输入 `GlueCatalogS3Tables_Policy`。（可选）输入描述。查看策略摘要，然后选择**创建策略**。

**为 Amazon Redshift 创建 IAM 角色：**

1. 打开 [IAM 控制台](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中，选择**角色**。

1. 选择**创建角色**。

1. 选择 **AWS 服务**作为可信实体，然后选择 **Redshift** 作为使用案例。

1. 在**其它 AWS 服务的使用案例**下，选择 **Redshift - 可自定义**，然后选择**下一步**。

1. 在**添加权限**页面上，附加您在上面创建的 `GlueCatalogS3Tables_Policy` 策略。选择**下一步**。

1. 对于**角色名称**，输入您角色的名称，例如 `RedshiftS3TablesRole`。

1. 审核信息，然后选择**创建角色**。

1. 在导航窗格中，选择**角色**。选择新角色的名称以查看摘要，然后将**角色 ARN** 复制到剪贴板。在为 S3 表类数据存储服务命名空间创建外部架构时，您将使用此 ARN。

**注意**  
通过将通配符替换为确切的 Amazon 资源名称（ARN），将范围缩小到特定资源。

### 步骤 2：将 IAM 角色附加到您的 Amazon Redshift 集群
<a name="querying-s3Tables-step2"></a>

将您在步骤 1 中配置的 IAM 角色与 Amazon Redshift 集群相关联。

**使用 AWS 管理控制台：**

1. 登录 AWS 控制台，并在 [https://console.aws.amazon.com/redshiftv2/](https://console.aws.amazon.com/redshiftv2/) 上打开 Amazon Redshift 控制台。

1. 在导航菜单上，选择 **Clusters（集群）**，然后选择要更新的集群。

1. 对于**操作**，选择**管理 IAM 角色**以显示与集群关联的 IAM 角色的当前列表。

1. 在**管理 IAM 角色**页面上，选择要添加的 IAM 角色，然后选择**添加 IAM 角色**。

1. 选择 **Done**（完成）以保存您的更改。

**使用 AWS CLI：**

运行以下命令，以便将 IAM 角色与现有的集群或命名空间相关联。将 `my-redshift-cluster` 或 `my-redshift-namespace` 替换为您的集群或命名空间，并将 `111122223333` 替换为您的 AWS 账户 ID。

```
aws redshift modify-cluster-iam-roles \
    --cluster-identifier my-redshift-cluster \
    --add-iam-roles arn:aws:iam::111122223333:role/RedshiftS3TablesRole

-- for serverless
aws redshift-serverless update-namespace \
    --namespace-name my-redshift-namespace \
    --iam-roles "arn:aws:iam::111122223333:role/RedshiftS3TablesRole"
```

有关更多信息，请参阅《Amazon Redshift 管理指南》**中的[将 IAM 角色与集群关联](https://docs.aws.amazon.com/redshift/latest/mgmt/copy-unload-iam-role.html)。

### 步骤 3：从 Amazon Redshift 中查询 S3 表类数据存储服务
<a name="querying-s3Tables-step3"></a>

当您将 S3 表类数据存储服务与 AWS Glue Data Catalog 集成时，该服务会创建一个联合目录结构，来将 S3 表类数据存储服务资源映射到 AWS Glue 目录对象：
+ S3 表存储桶变为 AWS Glue Data Catalog 中的**目录**。
+ S3 命名空间变为 **AWS Glue 数据库**。
+ S3 表变为 **AWS Glue 表对象**。

集成会创建以下层次结构：
+ **联合目录：**`s3tablescatalog`（自动创建）
+ **子目录：**每个 S3 表存储桶都将变为 `s3tablescatalog` 下的一个子目录。
+ **数据库：**表存储桶中的每个 S3 命名空间都变为一个数据库。
+ **表：**命名空间中的每个 S3 表都变为一个表。

例如，如果您有一个名为 `analytics-bucket` 的 S3 表存储桶，其命名空间 `sales` 包含一个表 `transactions`，则 AWS Glue Data Catalog 中的完整路径将为：`s3tablescatalog/analytics-bucket/sales/transactions`。

**创建资源链接**

在使用以下三种查询方法中的任何一种之前，您必须在 AWS Glue Data Catalog 中创建资源链接。资源链接可让 Amazon Redshift 通过标准目录引用 S3 表类数据存储服务数据库。

*使用 AWS Glue 控制台：*

1. 通过 [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 打开 AWS Glue 控制台。

1. 在导航窗格中，选择**数据库**。

1. 选择**创建**，然后选择**资源链接**。

1. 在**创建资源链接**页面上，提供以下信息：
   + **资源链接名称：**输入资源链接的名称（例如 `sales_resource_link`）。
   + **共享数据库：**输入 S3 表类数据存储服务数据库路径（例如 `s3tablescatalog/analytics-bucket/sales`）。
   + **共享数据库所有者：**输入您的 AWS 账户 ID。
   + **共享数据库的目录 ID：**以格式 `<account-id>:s3tablescatalog/<bucket-name>` 输入目录 ID。

1. 选择**创建**。

*使用 AWS CLI：*

```
aws glue create-database \
  --region us-west-2 \
  --cli-input-json '{
        "CatalogId": "111122223333",
        "DatabaseInput": {
            "Name": "sales_resource_link",
            "TargetDatabase": {
                "CatalogId": "111122223333:s3tablescatalog/analytics-bucket",
                "DatabaseName": "sales"
            }
        }
  }'
```

此命令在您的默认 AWS Glue 数据目录中创建一个名为 `sales_resource_link` 的资源链接，该链接指向 S3 表存储桶 `analytics-bucket` 中的 `sales` 数据库。

创建资源链接后，Amazon Redshift 提供三种查询 S3 表类数据存储服务的方法。请选择最适合您的使用案例的方法。

**注意**  
要在数据库级别创建资源链接，Redshift 管理员必须对默认目录和正在创建的数据库拥有 `AWS Glue:CreateDatabase` 权限。

#### 方法 1：CREATE EXTERNAL SCHEMA
<a name="querying-s3Tables-method1"></a>

使用 `CREATE EXTERNAL SCHEMA` 来创建引用 S3 表类数据存储服务数据库的外部架构。此方法提供对架构命名和配置的显式控制。

有关完整的语法详情，请参阅《Amazon Redshift 数据库开发人员指南》**中的 [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html)。

**示例**

使用步骤 3 中的数据库名称和目录 ID。将 `111122223333` 替换为您的AWS账户 ID。

```
CREATE EXTERNAL SCHEMA s3tables_schema
FROM DATA CATALOG DATABASE 'sales_resource_link'
IAM_ROLE 'arn:aws:iam::111122223333:role/RedshiftS3TablesRole'
REGION 'us-west-2'
CATALOG_ID '111122223333';

SELECT * FROM s3tables_schema.transactions;
```

#### 方法 2：CREATE DATABASE FROM ARN
<a name="querying-s3Tables-method2"></a>

将 `CREATE DATABASE` 与 `FROM ARN` 子句结合使用，以创建直接引用您的 AWS Glue 资源链接的联合数据库。此方法自动将 AWS Glue 数据库映射到 Redshift 数据库。

有关完整的语法详情，请参阅《Amazon Redshift 数据库开发人员指南》**中的 [CREATE DATABASE](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_DATABASE.html)。

**示例**

将 `111122223333` 替换为您的AWS账户 ID。

```
CREATE DATABASE s3tables_db
FROM ARN 'arn:aws:glue:us-west-2:111122223333:database/sales_resource_link'
WITH DATA CATALOG SCHEMA analytics_schema
IAM_ROLE 'arn:aws:iam::111122223333:role/RedshiftS3TablesRole';

SELECT * FROM s3tables_db.analytics_schema.transactions;
```

#### 方法 3：自动挂载的 awsdatacatalog
<a name="querying-s3Tables-method3"></a>

Amazon Redshift 可以通过 `awsdatacatalog` 数据库自动挂载 AWS Glue Data Catalog 数据库，包括 S3 表类数据存储服务资源链接。此方法要求在集群上启用对 Spectrum（FAS）的联合访问权限。

**先决条件**

要使用自动挂载的 `awsdatacatalog` 数据库，必须启用对 Spectrum 的联合访问权限。这支持 Amazon Redshift 使用联合身份凭证访问 AWS Glue Data Catalog 和外部数据来源。

启用对 Spectrum 的联合访问权限：

1. 使用具有以下权限的 IAM 身份连接到您的 Redshift 集群：
   + `redshift:GetClusterCredentialsWithIAM`（适用于预置集群）或 `redshift-serverless:GetCredentials`（适用于无服务器）
   + `AmazonS3ReadOnlyAccess`
   + `AWSGlueConsoleFullAccess`
   + S3 表类数据存储服务权限（如步骤 1 中所定义）

1. 当您使用 IAM 身份进行连接时，Amazon Redshift 会自动创建一个以 `IAM:`（对于用户）或 `IAMR:`（对于角色）为前缀的数据库用户。

1. 以集群管理员身份，授予联合用户访问外部架构的权限。将 `my_user` 替换为 IAM 角色或用户名。

   ```
   GRANT ALL ON SCHEMA awsdatacatalog TO "IAMR:my_user";
   ```

有关设置联合访问权限的详细说明，请参阅《Amazon Redshift 管理指南》**中的[使用联合身份管理 Amazon Redshift 对本地资源和 Amazon Redshift Spectrum 外部表的访问权限](https://docs.aws.amazon.com/redshift/latest/mgmt/authorization-fas-spectrum.html)。

**查询 S3 表类数据存储服务**

配置联合访问权限后，验证已安装的架构并查询 S3 表类数据存储服务。

验证已安装的架构：

```
SHOW SCHEMAS FROM DATABASE awsdatacatalog;
```

使用步骤 3 中的资源链接名称查询 S3 表类数据存储服务：

```
SELECT * FROM awsdatacatalog.sales_resource_link.transactions;
```