授权 Amazon Redshift 代表您访问其他 Amazon 服务 - Amazon Redshift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

授权 Amazon Redshift 代表您访问其他 Amazon 服务

某些 Amazon Redshift 功能要求 Amazon Redshift 代表您访问其他 Amazon 服务。例如,COPYUNLOAD 命令可使用 Amazon S3 存储桶将数据加载或卸载到您的 Amazon Redshift 集群中。CREATE EXTERNAL FUNCTION 命令可以使用标量 Lambda 用户定义的函数 (UDF) 调用 Amazon Lambda 函数。Amazon Redshift Spectrum 可以在 Amazon Athena 或 Amazon Glue 中使用数据目录。要让您的 Amazon Redshift 集群代表您执行操作,请为这些集群提供安全凭证。提供安全凭证的首选方法是指定一个 Amazon Identity and Access Management (IAM) 角色。对于 COPY 和 UNLOAD,您可以提供 Amazon 访问密钥。

接下来,了解如何创建具有访问其他 Amazon 服务的适当权限的 IAM 角色。当您执行 Amazon Redshift 命令时,还需要将该角色与您的集群关联并指定角色的 Amazon Resource Name (ARN)。有关更多信息,请参阅 使用 IAM 角色授权 COPY、UNLOAD、CREATE EXTERNAL FUNCTION 和 CREATE EXTERNAL SCHEMA 操作

此外,超级用户还可以向特定用户和组授予 ASSUMEROLE 权限,以便为 COPY 和 UNLOAD 操作提供对角色的访问权限。有关更多信息,请参阅 Amazon Redshift 数据库开发人员指南中的 GRANT

创建 IAM 角色以允许 Amazon Redshift 集群访问 Amazon 服务

要创建 IAM 角色以允许您的 Amazon Redshift 集群代表您与其他 Amazon 服务通信,请执行以下步骤。本节中使用的值是示例,您可以根据需要选择值。

要创建 IAM 角色以允许 Amazon Redshift 访问 Amazon 服务

  1. 打开 IAM 控制台

  2. 在导航窗格中,选择 Roles (角色)

  3. 选择 Create role (创建角色)

  4. 选择 Amazon service(Amazon 服务),然后选择 Redshift

  5. Select your use case 下,选择 Redshift - Customizable,然后选择 Next: Permissions。此时显示 Attach permissions policy 页面。

  6. 对于使用 COPY 访问 Amazon S3,作为示例,您可以使用 AmazonS3ReadOnlyAccess 并附加。要使用 COPY 或 UNLOAD 访问 Amazon S3,我们建议您创建托管式策略,以相应地限制对所需存储桶和前缀的访问。对于读取和写入操作,我们建议强制执行最低权限,并仅限于 Amazon Redshift 要求的 Amazon S3 存储桶和键前缀。

    要想为 CREATE EXTERNAL FUNCTION 命令调用 Lambda 函数,请添加 AWSLambdaRole

    对于 Redshift Spectrum,除 Amazon S3 访问以外,添加 AWSGlueConsoleFullAccessAmazonAthenaFullAccess

    选择 下一步:标签

  7. 此时将显示 Add tags (添加标签) 页面。您可以选择性地添加标签。选择 Next: Review (下一步:审核)

  8. 对于 Role name (角色名称),键入一个角色名称,例如 RedshiftCopyUnload。选择 Create role(创建角色)。

  9. 使用新角色的集群中的所有用户都可使用该角色。如需限制访问,只允许特定集群中的特定用户、或特定区域中的集群访问,请编辑该角色的信任关系。有关更多信息,请参阅 限制对 IAM 角色的访问

  10. 将角色与您的集群关联。您可以在创建集群时关联 IAM 角色,或将角色添加到现有集群中。有关更多信息,请参阅 将 IAM 角色与集群相关联

    注意

    要限制对特定数据的访问,请使用授予所需最少权限的 IAM 角色。

限制对 IAM 角色的访问

预设情况下,对 Amazon Redshift 集群可用的 IAM 角色对集群上的所有用户都可用。您可选择将 IAM 角色限制为特定集群上的特定 Amazon Redshift 数据库用户,或限制为特定区域。

要仅允许特定数据库用户使用 IAM 角色,请执行以下步骤。

标识对 IAM 角色具有访问权限的特定数据库用户

  1. 标识您的 Amazon Redshift 集群中的数据库用户的 Amazon Resource Name (ARN)。数据库用户的 ARN 采用以下格式:arn:aws:redshift:region:account-id:dbuser:cluster-name/user-name

  2. 通过以下网址打开 IAM 控制台url="https://console.aws.amazon.com/

  3. 在导航窗格中,选择 Roles(角色)。

  4. 选择要限制到特定 Amazon Redshift 数据库用户的 IAM 角色。

  5. 选择 Trust Relationships 选项卡,然后选择 Edit Trust Relationship。允许 Amazon Redshift 代表您访问其他 Amazon 服务的新 IAM 角色具有以下信任关系:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "redshift.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
  6. 向信任关系的 sts:AssumeRole 操作部分添加一个条件以将 sts:ExternalId 字段限制为您指定的值。为您要授予对 IAM 角色的访问权限的每个数据库用户包含一个 ARN。外部 ID 可以是任何唯一的字符串。

    例如,以下信任关系指定只有区域 user1 中的集群 user2 上的数据库用户 my-clusterus-west-2 有权使用此 IAM 角色。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "redshift.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId": [ "arn:aws:redshift:us-west-2:123456789012:dbuser:my-cluster/user1", "arn:aws:redshift:us-west-2:123456789012:dbuser:my-cluster/user2" ] } } }] }
  7. 选择 Update Trust Policy

将 IAM 角色限制为某个 Amazon 区域

您可将 IAM 角色限制为仅在某个特定 Amazon 区域中可访问。预设情况下,Amazon Redshift 的 IAM 角色不会限制到任何单一区域。

要按区域限制对 IAM 角色的使用,请执行以下步骤。

为 IAM 角色标识允许的区域

  1. 通过以下网址打开 IAM 控制台https://console.aws.amazon.com/

  2. 在导航窗格中,选择 Roles(角色)。

  3. 选择要用特定区域修改的角色。

  4. 选择 Trust Relationships (信任关系) 选项卡,然后选择 Edit Trust Relationship (编辑信任关系)。允许 Amazon Redshift 代表您访问其他 Amazon 服务的新 IAM 角色具有以下信任关系:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "redshift.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
  5. 使用您要允许对其使用角色的特定区域的列表修改 ServicePrincipal 列表。Service 列表中的每个区域都必须采用以下格式:redshift.region.amazonaws.com

    例如,以下编辑过的信任关系仅允许在 us-east-1us-west-2 区域中使用 IAM 角色。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "redshift.us-east-1.amazonaws.com", "redshift.us-west-2.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }
  6. 选择 Update Trust Policy

在 Amazon Redshift 中串联 IAM 角色

当您将角色附加到集群时,集群可以代入该角色以您的名义访问 Amazon S3、Amazon Athena、Amazon Glue 和 Amazon Lambda。如果附加到集群的角色无法访问必要的资源,则可以串联到另一个角色 (可能属于其他账户)。然后,您的集群临时代入串联的角色来访问数据。您还可以通过串联角色来授予跨账户访问权限。链中的每个角色都会代入链中的下一个角色,直到集群承担位于链尾的角色。您可以串联最多 10 个角色。

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

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

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

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

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

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

以下信任策略与 RoleA、Amazon 账户 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 将附加到属于 Amazon 账户 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';

有关更多信息,也请参阅使用 IAM 角色授权 COPY、UNLOAD、CREATE EXTERNAL FUNCTION 和 CREATE EXTERNAL SCHEMA 操作