使用联合身份管理 Amazon Redshift 对本地资源和 Amazon Redshift Spectrum 外部表的访问权限 - Amazon Redshift

使用联合身份管理 Amazon Redshift 对本地资源和 Amazon Redshift Spectrum 外部表的访问权限

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

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

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

使用联合凭证的好处如下:

  • 您不必为 Redshift Spectrum 管理集群附加的 IAM 角色。

  • 集群管理员可以创建一个可供具有不同 IAM 上下文的使用者访问的外部架构。例如,这对于对表执行列筛选会很有用,在此情况下,其他使用者将查询同一外部架构并在返回的记录中获得不同的字段。

  • 您可以使用具有 IAM 权限的用户查询 Amazon Redshift,而不是仅使用角色。

准备身份以使用联合身份进行登录

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

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

  2. 将权限策略附加到此身份。指定以下任一项:

    • redshift:GetClusterCredentialsWithIAM(适用于 Amazon Redshift 预调配集群)

    • redshift-serverless:GetCredentials(适用于 Amazon Redshift Serverless)

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

    IAM 身份还需要对外部数据的访问权限。通过直接添加以下 AWS 托管式策略,授予对 Amazon S3 的访问权限:

    • AmazonS3ReadOnlyAccess

    • AWSGlueConsoleFullAccess

    如果您使用 AWS Glue 准备外部数据,则需要最后一个托管式策略。有关授予对 Amazon Redshift Spectrum 的访问权限的步骤的更多信息,请参阅为 Amazon Redshift 创建 IAM 角色,它是 Amazon Redshift 和 Redshift Spectrum 入门指南的一部分。此部分介绍了添加 IAM 策略以访问 Redshift Spectrum 的步骤。

  3. 设置 SQL 客户端以连接到 Amazon Redshift。使用 Amazon Redshift JDBC 驱动程序,并将用户的凭证添加到此工具的凭证属性中。像 SQL Workbench/J 这样的客户端非常适合执行此操作。设置以下客户端连接扩展属性:

    • AccessKeyID – 您的访问密钥标识符。

    • SecretAccessKey – 您的秘密访问密钥。(请注意,如果您不使用加密,则传输私有密钥会带来安全风险。)

    • SessionToken – IAM 角色的一组临时凭证。

    • groupFederation – 如果要为预调配集群配置联合身份,则设置为 true。如果您使用的是 Amazon Redshift Serverless,请不要设置此参数。

    • LogLevel – 整数日志级别值。该项为可选项。

  4. 将 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> 指定用户名。

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

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

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

    ALTER SCHEMA my_schema owner to "IAM:my_user";
  6. 要验证配置,请在授予权限后,使用 SQL 客户端以用户身份运行查询。此查询示例从外部表中检索数据。

    SELECT * FROM my_schema.my_table;

开始将身份和授权传播到 Redshift Spectrum

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

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

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

  3. 使用管理员账户连接到 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 值是您的 AWS 账户 ID。

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

    select * from spectrum_schema.table1;

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

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

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

使用说明

常见的连接错误如下:检索临时凭证时出现 IAM 错误:无法使用提供的解组器对异常响应进行解组。此错误是由于使用旧版 JDBC 驱动程序造成的。联合身份所需的最低驱动程序版本为 2.1.0.9。您可以从下载 Amazon Redshift JDBC 驱动程序版本 2.1 获取 JDBC 驱动程序。

其他资源

这些链接为管理外部数据的访问提供了额外信息。