使用联合身份管理 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 数据仓库位于同一账户中。
-
创建一个 IAM 身份。这可以是用户或 IAM 角色。使用 IAM 支持的任何名称。
-
将权限策略附加到此身份。指定以下任一项:
-
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 的步骤。
-
-
设置 SQL 客户端以连接到 Amazon Redshift。使用 Amazon Redshift JDBC 驱动程序,并将用户的凭证添加到此工具的凭证属性中。像 SQL Workbench/J 这样的客户端非常适合执行此操作。设置以下客户端连接扩展属性:
-
AccessKeyID – 您的访问密钥标识符。
-
SecretAccessKey – 您的秘密访问密钥。(请注意,如果您不使用加密,则传输私有密钥会带来安全风险。)
-
SessionToken – IAM 角色的一组临时凭证。
-
groupFederation – 如果要为预调配集群配置联合身份,则设置为
true
。如果您使用的是 Amazon Redshift Serverless,请不要设置此参数。 -
LogLevel – 整数日志级别值。该项为可选项。
-
-
将 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>
指定用户名。 -
-
作为 Amazon Redshift 集群管理员,向 Redshift 用户授予访问外部架构所需的权限。
GRANT ALL ON SCHEMA my_schema to "IAM:my_user";
要使 Redshift 用户能够在外部架构中创建表,他们必须是架构所有者。例如:
ALTER SCHEMA my_schema owner to "IAM:my_user";
-
要验证配置,请在授予权限后,使用 SQL 客户端以用户身份运行查询。此查询示例从外部表中检索数据。
SELECT * FROM my_schema.my_table;
开始将身份和授权传播到 Redshift Spectrum
要传递联合身份以查询外部表,请将 SESSION
设置为 CREATE EXTERNAL SCHEMA
的 IAM_ROLE
查询参数的值。以下步骤说明如何设置和利用 SESSION
授予对外部架构的查询权限。
-
创建本地表和外部表。使用 AWS Glue 编写目录的外部表适合此操作。
-
使用 IAM 身份连接到 Amazon Redshift。如上一节中所述,在身份连接到 Amazon Redshift 时,将创建一个 Redshift 数据库用户。如果用户以前不存在,则将创建该用户。如果用户是新用户,则管理员必须向其授予在 Amazon Redshift 中执行任务(例如查询和创建表)的权限。
-
使用管理员账户连接到 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。 -
使用您在步骤 2 中连接的 IAM 身份运行查询以访问外部数据。例如:
select * from spectrum_schema.table1;
例如,在此情况下,
table1
可以是 Amazon S3 存储桶中某个文件中的采用 JSON 格式的数据。 -
如果您已有一个使用集群附加的 IAM 角色的外部架构并指向您的外部数据库或架构,则可以替换现有架构并使用联合身份(如这些步骤中所述),也可以创建一个新的架构。
SESSION
表示使用联合身份凭证用于查询外部架构。在使用 SESSION
查询参数时,请务必设置 catalog_id
。由于它指向用于架构的数据目录,因此它是必需的。之前,catalog_id
是从分配给 iam_role
的值中检索的。当您通过此方式设置身份和授权传播时,例如,通过使用联合凭证查询外部架构来传播到 Redshift Spectrum 时,不需要通过 IAM 角色进行授权。
使用说明
常见的连接错误如下:检索临时凭证时出现 IAM 错误:无法使用提供的解组器对异常响应进行解组。此错误是由于使用旧版 JDBC 驱动程序造成的。联合身份所需的最低驱动程序版本为 2.1.0.9。您可以从下载 Amazon Redshift JDBC 驱动程序版本 2.1 获取 JDBC 驱动程序。
其他资源
这些链接为管理外部数据的访问提供了额外信息。
-
您仍可以使用 IAM 角色访问 Redshift Spectrum 数据。有关更多信息,请参阅 授权 Amazon Redshift 代表您访问 AWS 服务。
-
当您使用 AWS Lake Formation 管理对外部表的访问权限时,您可以使用具有联合 IAM 身份的 Redshift Spectrum 对其进行查询。您不再需要管理集群附加的 IAM 角色,Redshift Spectrum 可以查询向 AWS Lake Formation 注册的数据。有关更多信息,请参阅将 AWS Lake Formation 与 Amazon Redshift Spectrum 结合使用。