从 2025 年 11 月 1 日起,Amazon Redshift 将不再支持创建新的 Python UDF。如果您想要使用 Python UDF,请在该日期之前创建 UDF。现有的 Python UDF 将继续正常运行。有关更多信息,请参阅博客文章
在 Amazon Redshift 中串联 IAM 角色
当您将角色附加到集群时,集群可以代入该角色以您的名义访问 Simple Storage Service(Amazon S3)、Amazon Athena、Amazon Glue 和 Amazon Lambda。如果附加到集群的角色无法访问必要的资源,则可以串联到另一个角色 (可能属于其他账户)。然后,您的集群临时代入串联的角色来访问数据。您还可以通过串联角色来授予跨账户访问权限。链中的每个角色都会代入链中的下一个角色,直到集群承担位于链尾的角色。您可以关联的最大 IAM 角色数量受配额限制。有关更多信息,请参阅 Amazon Redshift 对象的配额中的“Amazon Redshift 用于访问其他 Amazon 服务的集群 IAM 角色”。
注意
您必须指定 IAM 角色才能使链正常运行。
例如,假设公司 A 想要访问属于公司 B 的 Simple Storage Service(Amazon S3)存储桶中的数据。公司 A 为 Amazon Redshift 创建一个名为 RoleA
的 Amazon 服务角色并将其附加到集群上。公司 B 创建一个名为 RoleB
的角色,该角色有权访问公司 B 存储桶中的数据。要访问公司 B 存储桶中的数据,公司 A 需要使用串联 iam_role
和 RoleA
的 RoleB
参数运行 COPY 命令。在 COPY 操作的持续时间内,RoleA
将临时代入 RoleB
以访问 Simple Storage Service(Amazon S3)存储桶。
要串联角色,您可以在角色之间建立信任关系。代入其他角色的角色 (例如,RoleA
) 必须具有允许其代入下一个串联的角色 (例如,RoleB
) 的权限策略。反过来,传递权限的角色 (RoleB
) 必须具有允许其将权限传递给上一个串联的角色 (RoleA
) 的信任策略。有关更多信息,请参阅 IAM 用户指南中的使用 IAM 角色。
链中的第一个角色必须是附加到集群的角色。第一个角色以及代入链中下一个角色的每个后续角色都必须具有包含特定语句的策略。该语句对 Allow
操作以及 sts:AssumeRole
元素中的下一个角色的 Amazon Resource Name (ARN) 具有 Resource
效果。在我们的示例中,RoleA
具有允许其代入由 Amazon 账户 210987654321
所有的 RoleB
的以下权限策略。
传递给其他角色的角色必须与代入该角色的角色或拥有该角色的 Amazon 账户建立信任关系。在我们的示例中,RoleB
具有与 RoleA
建立信任关系的以下信任策略。
以下信任策略与 RoleA
、Amazon 账户 123456789012
的拥有者建立信任关系。
注意
要将角色串联授权限制给特定用户,请定义条件。有关更多信息,请参阅 限制对 IAM 角色的访问。
当您运行 UNLOAD、COPY、CREATE EXTERNAL FUNCTION 或 CREATE EXTERNAL SCHEMA 命令时,可以通过在 iam_role
参数中包括一个逗号分隔的角色 ARN 列表来串联角色。下面显示了在 iam_role
参数中串联角色的语法。
unload ('select * from venue limit 10') to 's3://acmedata/redshift/venue_pipe_' IAM_ROLE 'arn:aws:iam::<
aws-account-id-1
>:role/<role-name-1
>[,arn:aws:iam::<aws-account-id-2
>:role/<role-name-2
>][,...]';
注意
整个角色链用单引号括起来,不能包含空格。
在以下示例中,RoleA
将附加到属于 Amazon 账户 123456789012
的集群。属于账户 210987654321
的 RoleB
具有访问名为 s3://companyb/redshift/
的存储桶的权限。以下示例将 RoleA
和 RoleB
进行串联以将数据卸载到 s3://companyb/redshift/ 存储桶。
unload ('select * from venue limit 10') to 's3://companyb/redshift/venue_pipe_' iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';
以下示例使用 COPY 命令加载已在上一个示例中卸载的数据。
copy venue from 's3://companyb/redshift/venue_pipe_' iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';
在以下示例中,CREATE EXTERNAL SCHEMA 使用串联的角色代入角色 RoleB
。
create external schema spectrumexample from data catalog database 'exampledb' region 'us-west-2' iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';
在以下示例中,CREATE EXTERNAL FUNCTION 使用串联的角色代入角色 RoleB
。
create external function lambda_example(varchar) returns varchar volatile lambda 'exampleLambdaFunction' iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';