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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

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

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

接下来,了解如何创建具有访问其他Amazon服务。当您运行 Amazon Redshift 命令时,还需要将角色与您的集群关联并指定角色的 Amazon 资源名称 (ARN)。有关更多信息,请参阅 授权使用 IAM 角色执行拷贝、卸载、创建外部函数和创建外部架构操作

此外,超级用户还可以向特定用户和组授予 ASSEROLE 权限,以便为执行 COPY 和卸载操作提供对角色的访问权限。想要了解有关信息,请参阅授予中的Amazon Redshift 数据库开发人员指南

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

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

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

  1. 打开 IAM 控制台

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

  3. 选择创建角色

  4. 选择Amazon服务,然后选择Redshift

  5. UNTER选择您的使用案例中,选择Redshift-可自定义,然后选择后续:Permissions (下一步:权限)。此时显示 Attach permissions policy 页面。

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

    要访问为创建外部函数命令调用 Lambda 函数,请添加AWSLambdaRole

    对于 Redshift Spectrum,除 Amazon S3 访问以外,请添加AWSGlueConsoleFullAccess或者AmazonAthenaFullAccess

    选择 Next:。标签

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

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

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

  10. 将角色与您的集群关联。您可以在创建集群时关联 IAM 角色,或将角色添加到现有集群中。有关更多信息,请参阅 将 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 控制台at网址 =” https://console.aws.amazon.com/

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

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

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

    { "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 控制台athttps://console.aws.amazon.com/

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

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

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

    { "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 存储桶中的数据。AmazonAmazon Redshift 的服务角色RoleA并将其附加到他们的群集。公司 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具有以下权限策略,允许其假设RoleB, 拥有的Amazon账户210987654321

{ "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 SCHEMA 命令时,可以通过在iam_role参数。下面显示了在 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账户123456789012RoleB,属于账户210987654321,有权访问名为的存储桶。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 SCHEMA 使用链接的角色代入角色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';