

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

# 使用联合身份管理 Amazon Redshift 对本地资源和 Amazon Redshift Spectrum 外部表的访问权限
<a name="authorization-fas-spectrum"></a>

将 Amazon 中的身份联合验证和 `GetDatabaseCredentials` 提供的凭证结合使用，可以简化对本地数据和外部数据的授权和访问。在本教程中，我们将说明如何使用 Amazon 身份联合验证（而不是使用特定 IAM 角色）提供对资源的访问权限。

目前，要向用户提供对驻留在 Amazon S3 中的外部数据的访问权限，您需要创建一个具有权限策略中定义的权限的 IAM 角色。之后，附加了此角色的用户便能访问外部数据。虽然这行得通，但如果您想提供粒度规则（例如，使特定列对特定用户不可用），则可能需要在外部架构上进行其他配置。

利用由 `GetDatabaseCredentials` 提供的凭证，身份联合验证可以使用更易于指定和更改的粒度 IAM 规则提供对 Amazon Glue 和 Redshift Spectrum 资源的访问权限。这更易于应用符合您的业务规则的访问权限。

使用联合凭证的好处如下：
+ 您不必为 Redshift Spectrum 管理集群附加的 IAM 角色。
+ 集群管理员可以创建一个可供具有不同 IAM 上下文的使用者访问的外部架构。例如，这对于对表执行列筛选会很有用，在此情况下，其他使用者将查询同一外部架构并在返回的记录中获得不同的字段。
+ 您可以使用具有 IAM 权限的用户查询 Amazon Redshift，而不是仅使用角色。

## 准备身份以使用联合身份进行登录
<a name="authorization-fas-spectrum-getting-started-iam"></a>

在使用联合身份登录之前，您必须执行多个预备步骤。这些说明假定您目前有一个 Redshift Spectrum 外部架构，该架构引用了存储在 Amazon S3 存储桶中的数据文件，并且该存储桶与您的 Amazon Redshift 集群或 Amazon Redshift Serverless 数据仓库位于同一账户中。

1. 创建一个 IAM 身份。这可以是用户或 IAM 角色。使用 IAM 支持的任何名称。

1. 将权限策略附加到此身份。指定以下任一项：
   + `redshift:GetClusterCredentialsWithIAM`（适用于 Amazon Redshift 预调配集群）
   + `redshift-serverless:GetCredentials`（适用于 Amazon Redshift Serverless）

   您可以使用 IAM 控制台通过策略编辑器添加权限。

   IAM 身份还需要对外部数据的访问权限。通过直接添加以下 Amazon 托管式策略，授予对 Amazon S3 的访问权限：
   + `AmazonS3ReadOnlyAccess`
   + `AWSGlueConsoleFullAccess`

    如果您使用 Amazon Glue 准备外部数据，则需要最后一个托管式策略。有关授予对 Amazon Redshift Spectrum 的访问权限的步骤的更多信息，请参阅[为 Amazon Redshift 创建 IAM 角色](https://docs.amazonaws.cn/redshift/latest/dg/c-getting-started-using-spectrum-create-role.html)，它是 Amazon Redshift 和 Redshift Spectrum 入门指南的一部分。此部分介绍了添加 IAM 策略以访问 Redshift Spectrum 的步骤。

1. 设置 SQL 客户端以连接到 Amazon Redshift。使用 Amazon Redshift JDBC 驱动程序，并将用户的凭证添加到此工具的凭证属性中。像 SQL Workbench/J 这样的客户端非常适合执行此操作。设置以下客户端连接扩展属性：
   + *AccessKeyID* – 您的访问密钥标识符。
   + *SecretAccessKey* – 您的秘密访问密钥。（请注意，如果您不使用加密，则传输私有密钥会带来安全风险。） 
   + *SessionToken* – IAM 角色的一组临时凭证。
   + *groupFederation* – 如果要为预调配集群配置联合身份，则设置为 `true`。如果您使用的是 Amazon Redshift Serverless，请不要设置此参数。
   + *LogLevel* – 整数日志级别值。该项为可选项。

1. 将 URL 设置为在 Amazon Redshift 或 Amazon Redshift Serverless 控制台中找到的 JDBC 端点。将 URL 架构替换为 *jdbc:redshift:iam:* 并使用此格式：
   + 适用于 Amazon Redshift 预调配集群的格式：`jdbc:redshift:iam://<cluster_id>.<unique_suffix>.<region>.redshift.amazonaws.com:<port>/<database_name>`

     示例：`jdbc:redshift:iam://test1.12345abcdefg.us-east-1.redshift.amazonaws.com:5439/dev`
   + 适用于 Amazon Redshift Serverless 的格式：`jdbc:redshift:iam://<workgroup-name>.<account-number>.<aws-region>.redshift-serverless.amazonaws.com:5439:<port>/<database_name>`

     示例：`jdbc:redshift:iam://default.123456789012.us-east-1.redshift-serverless.amazonaws.com:5439/dev`

   在您首次使用 IAM 身份连接到数据库后，Amazon Redshift 会自动创建一个同名 Amazon Redshift 身份，其前缀为 `IAM:`（对于用户）或 `IAMR:`（对于 IAM 角色）。本主题中的剩余步骤展示了适用于用户的示例。

   如果未自动创建 Redshift 用户，您可以通过以下方式创建一个此类用户：运行 `CREATE USER` 语句、使用管理员账户并以格式 `IAM:<user name>` 指定用户名。

1.  作为 Amazon Redshift 集群管理员，向 Redshift 用户授予访问外部架构所需的权限。

   ```
   GRANT ALL ON SCHEMA my_schema to "IAM:my_user";
   ```

   要使 Redshift 用户能够在外部架构中创建表，他们必须是架构所有者。例如：

   ```
   ALTER SCHEMA my_schema owner to "IAM:my_user";
   ```

1. 要验证配置，请在授予权限后，使用 SQL 客户端以用户身份运行查询。此查询示例从外部表中检索数据。

   ```
   SELECT * FROM my_schema.my_table;
   ```

## 开始将身份和授权传播到 Redshift Spectrum
<a name="authorization-fas-spectrum-getting-started"></a>

要传递联合身份以查询外部表，请将 `SESSION` 设置为 `CREATE EXTERNAL SCHEMA` 的 `IAM_ROLE` 查询参数的值。以下步骤说明如何设置和利用 `SESSION` 授予对外部架构的查询权限。

1. 创建本地表和外部表。使用 Amazon Glue 编写目录的外部表适合此操作。

1. 使用 IAM 身份连接到 Amazon Redshift。如上一节中所述，在身份连接到 Amazon Redshift 时，将创建一个 Redshift 数据库用户。如果用户以前不存在，则将创建该用户。如果用户是新用户，则管理员必须向其授予在 Amazon Redshift 中执行任务（例如查询和创建表）的权限。

1. 使用管理员账户连接到 Redshift。运行该命令以使用 `SESSION` 值创建外部架构。

   ```
   create external schema spectrum_schema from data catalog
   database '<my_external_database>' 
   region '<my_region>'
   iam_role 'SESSION'
   catalog_id '<my_catalog_id>';
   ```

   请注意，在此示例中，将设置 `catalog_id`。这是随功能一起添加的新设置，因为 `SESSION` 替换了特定角色。

   在此示例中，查询中的值将模仿实际值的显示方式。

   ```
   create external schema spectrum_schema from data catalog
   database 'spectrum_db' 
   region 'us-east-1'
   iam_role 'SESSION'
   catalog_id '123456789012'
   ```

   在此情况下，`catalog_id` 值是您的 Amazon 账户 ID。

1. 使用您在步骤 2 中连接的 IAM 身份运行查询以访问外部数据。例如：

   ```
   select * from spectrum_schema.table1;
   ```

   例如，在此情况下，`table1` 可以是 Amazon S3 存储桶中某个文件中的采用 JSON 格式的数据。

1. 如果您已有一个使用集群附加的 IAM 角色的外部架构并指向您的外部数据库或架构，则可以替换现有架构并使用联合身份（如这些步骤中所述），也可以创建一个新的架构。

`SESSION` 表示使用联合身份凭证用于查询外部架构。在使用 `SESSION` 查询参数时，请务必设置 `catalog_id`。由于它指向用于架构的数据目录，因此它是必需的。之前，`catalog_id` 是从分配给 `iam_role` 的值中检索的。当您通过此方式设置身份和授权传播时，例如，通过使用联合凭证查询外部架构来传播到 Redshift Spectrum 时，不需要通过 IAM 角色进行授权。

### 使用说明
<a name="authorization-fas-access-usage-notes"></a>

常见的连接错误如下：*检索临时凭证时出现 IAM 错误：无法使用提供的解组器对异常响应进行解组*。此错误是由于使用旧版 JDBC 驱动程序造成的。联合身份所需的最低驱动程序版本为 2.1.0.9。您可以从[下载 Amazon Redshift JDBC 驱动程序版本 2.x](https://docs.amazonaws.cn/redshift/latest/mgmt/jdbc20-download-driver.html) 获取 JDBC 驱动程序。

### 其他资源
<a name="authorization-fas-spectrum-resources"></a>

这些链接为管理外部数据的访问提供了额外信息。
+ 您仍可以使用 IAM 角色访问 Redshift Spectrum 数据。有关更多信息，请参阅 [授权 Amazon Redshift 代表您访问 Amazon 服务](authorizing-redshift-service.md)。
+ 当您使用 Amazon Lake Formation 管理对外部表的访问权限时，您可以使用具有联合 IAM 身份的 Redshift Spectrum 对其进行查询。您不再需要管理集群附加的 IAM 角色，Redshift Spectrum 可以查询向 Amazon Lake Formation 注册的数据。有关更多信息，请参阅[将 Amazon Lake Formation 与 Amazon Redshift Spectrum 结合使用](https://docs.amazonaws.cn/lake-formation/latest/dg/RSPC-lf.html)。