在 Amazon Redshift 中串联 IAM 角色 - Amazon Redshift

在 Amazon Redshift 中串联 IAM 角色

当您将角色附加到集群时,集群可以代入该角色以您的名义访问 Simple Storage Service(Amazon S3)、Amazon Athena、AWS Glue 和 AWS Lambda。如果附加到集群的角色无法访问必要的资源,则可以串联到另一个角色 (可能属于其他账户)。然后,您的集群临时代入串联的角色来访问数据。您还可以通过串联角色来授予跨账户访问权限。链中的每个角色都会代入链中的下一个角色,直到集群承担位于链尾的角色。您可以关联的最大 IAM 角色数量受配额限制。有关更多信息,请参阅 Amazon Redshift 对象的配额中的“Amazon Redshift 用于访问其他 AWS 服务的集群 IAM 角色”。

例如,假设公司 A 想要访问属于公司 B 的 Simple Storage Service(Amazon S3)存储桶中的数据。公司 A 为 Amazon Redshift 创建一个名为 RoleA 的 AWS 服务角色并将其附加到集群上。公司 B 创建一个名为 RoleB 的角色,该角色有权访问公司 B 存储桶中的数据。要访问公司 B 存储桶中的数据,公司 A 需要使用串联 iam_roleRoleARoleB 参数运行 COPY 命令。在 COPY 操作的持续时间内,RoleA 将临时代入 RoleB 以访问 Simple Storage Service(Amazon S3)存储桶。

要串联角色,您可以在角色之间建立信任关系。代入其他角色的角色 (例如,RoleA) 必须具有允许其代入下一个串联的角色 (例如,RoleB) 的权限策略。反过来,传递权限的角色 (RoleB) 必须具有允许其将权限传递给上一个串联的角色 (RoleA) 的信任策略。有关更多信息,请参阅 IAM 用户指南中的使用 IAM 角色

链中的第一个角色必须是附加到集群的角色。第一个角色以及代入链中下一个角色的每个后续角色都必须具有包含特定语句的策略。该语句对 Allow操作以及 sts:AssumeRole 元素中的下一个角色的 Amazon Resource Name (ARN) 具有 Resource 效果。在我们的示例中,RoleA 具有允许其代入由 AWS 账户 210987654321 所有的 RoleB 的以下权限策略。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1487639602000", "Effect": "Allow", "Action": [ "sts:AssumeRole" ], "Resource": "arn:aws:iam::210987654321:role/RoleB" } ] }

传递给其他角色的角色必须与代入该角色的角色或拥有该角色的 AWS 账户建立信任关系。在我们的示例中,RoleB 具有与 RoleA 建立信任关系的以下信任策略。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Principal": { "AWS": "arn:aws:iam::role/RoleA" } } ] }

以下信任策略与 RoleA、AWS 账户 123456789012 的拥有者建立信任关系。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Principal": { "AWS": "arn:aws:iam::123456789012:root" } } ] }
注意

要将角色串联授权限制给特定用户,请定义条件。有关更多信息,请参阅 限制对 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 将附加到属于 AWS 账户 123456789012 的集群。属于账户 210987654321RoleB 具有访问名为 s3://companyb/redshift/ 的存储桶的权限。以下示例将 RoleARoleB 进行串联以将数据卸载到 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';