Amazon Redshift
集群管理指南 (API 版本 2012-12-01)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

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

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

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

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

要创建 IAM 角色以允许您的 Amazon Redshift 集群代表您与其他 AWS 服务通信,请执行以下步骤。

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

  1. 打开 IAM 控制台

  2. 在导航窗格中,选择 Roles

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

  4. 选择 AWS service,然后选择 Redshift

  5. Select your use case 下,选择 Redshift - Customizable,然后选择 Next: Permissions

  6. 此时显示 Attach permissions policy 页面。对于使用 COPY 和 UNLOAD 访问 Amazon S3,选择 AmazonS3ReadOnlyAccess。对于 Redshift Spectrum,除 Amazon S3 访问以外,添加 AWSGlueConsoleFullAccessAmazonAthenaFullAccess。选择 Next: Review。

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

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

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

限制对 IAM 角色的访问

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

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

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

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

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

  3. 在导航窗格中,选择 Roles

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

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

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

    例如,以下信任关系指定只有区域 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 角色限制到一个 AWS 区域

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

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

为 IAM 角色标识允许的区域

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

  2. 在导航窗格中,选择 Roles

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

  4. 选择 Trust Relationships (信任关系) 选项卡,然后选择 Edit Trust Relationship (编辑信任关系)。允许 Amazon Redshift 代表您访问其他 AWS 服务的新 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、Athena 和 AWS Glue。如果附加到集群的角色无法访问必要的资源,则可以串联到另一个角色 (可能属于其他账户)。然后,您的集群临时代入串联的角色来访问数据。您还可以通过串联角色来授予跨账户访问权限。链中的每个角色都会代入链中的下一个角色,直到集群承担位于链尾的角色。您可以串联最多 10 个角色。

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

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

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

{ "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", "Principal": { "AWS": "arn:aws:iam::role/RoleA" } ] }

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

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

当您运行 UNLOAD、COPY 或 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';