如何创建跨账户访问 Amazon Redshift 和 Amazon S3 的权限?

上次更新时间:2020 年 6 月 25 日

我想在不属于同一个 AWS 账户的 Amazon Redshift 和 Amazon Simple Storage Service (Amazon S3) 存储桶之间对数据进行 UNLOAD 或 COPY 操作。

简短描述

在 Amazon S3 账户 (RoleA) 中创建一个 AWS Identity and Access Management (IAM) 角色。然后,在具有代入 RoleA 的权限的 Amazon Redshift 账户 (RoleB) 中创建一个 IAM 角色。Amazon Redshift 集群代入 RoleB,RoleB 再代入 RoleA,从而使 Amazon Redshift 能够访问 S3。此过程称为角色链

解决方法

注意:以下步骤假定 Amazon Redshift 集群和 S3 存储桶位于同一区域中。如果它们位于不同的区域中,必须将 REGION 参数添加到 COPYUNLOAD 命令中。

在您的 S3 账户中,执行以下步骤:

1.    打开 IAM 控制台

2.    选择策略,然后选择创建策略

3.    选择 JSON 选项卡,然后输入与以下内容类似的 IAM 策略:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:Get*",       
        "s3:List*",
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::awsbucket",
        "arn:aws:s3:::awsbucket/*"
      ]
    }
  ]
}

注意: awsbucket 替换成想要访问的 S3 存储桶的名称。

4.    选择查看策略

5.    输入策略的名称(例如 policy_for_roleA),然后选择创建策略

6.    从导航窗格中选择角色,然后选择创建角色

7.    对于选择受信任实体的类型,选择其他 AWS 账户

8.    对于账户 ID,请输入 Amazon Redshift 账户的 ID。有关更多信息,请参阅查找 AWS 账户 ID

9.    选择下一步: 权限,然后选择刚创建的策略 (policy_for_roleA)。

10.    选择下一步:标签,然后选择下一步:检查。您不需要添加任何标签。

11.    输入角色名称,然后选择创建角色。在以下示例中,我们将新创建的角色称为 RoleA。

在您的 Amazon Redshift 账户中,执行以下步骤:

1.    打开 IAM 控制台

2.    选择策略,然后选择创建策略

3.    选择 JSON 选项卡,然后输入与以下内容类似的 IAM 策略:

{
    "Version": "2012-10-17",
    "Statement": [
            {
            "Sid": "CrossAccountPolicy",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "ARN_for_RoleA"
        }
    ]
}

注意:将 ARN_for_RoleA 替换为您在 S3 账户中创建的 RoleA 的 Amazon 资源名称 (ARN)。

4.    选择查看策略

5.    输入策略的名称(例如 policy_for_roleB),然后选择创建策略

6.    在 IAM 控制台上找到导航窗格,选择角色,然后选择创建角色

7.    对于选择受信任实体的类型,选择 AWS 服务

8.    选择 Redshift,然后选择 Redshift – 可自定义

9.    选择下一步: 权限,然后选择刚创建的策略 (policy_for_roleB)。

10.    选择下一步:添加标签,然后选择下一步:检查。您不需要添加策略或标签。

11.    输入角色名称,然后选择创建角色。在以下示例中,我们将新创建的角色称为 RoleB。

12.    将 IAM 角色 (RoleB) 与 Amazon Redshift 集群相关联

测试设置

运行类似以下内容的命令来测试 COPY 命令。替换示例中的以下值:

table_name:目标 Amazon Redshift 表,您要将 S3 数据复制到此表
s3://awsbucket/crosscopy1.csv:来源 S3 存储桶,您要从中复制数据
Amazon_Redshift_Account_ID:Amazon Redshift 账户的 AWS 账户 ID
RoleB:您创建的第二个角色
Amazon_S3_Account_ID:S3 账户的 AWS 账户 ID
RoleA:您创建的第一个角色

copy table_name from 's3://awsbucket/crosscopy1.csv' iam_role 'arn:aws:iam::Amazon_Redshift_Account_ID:role/RoleB,arn:aws:iam::Amazon_S3_Account_ID:role/RoleA' delimiter ',' removequotes;

运行类似以下内容的命令来测试 UNLOAD 命令。替换示例中的以下值:

table_name:来源 Amazon Redshift 表,您要将此表卸载到 S3 存储桶
s3://awsbucket/folder/test.dat:目标 S3 路径,您要将 Amazon Redshift 数据卸载到该路径
Amazon_Redshift_Account_ID:Amazon Redshift 账户的 AWS 账户 ID
RoleB:您创建的第二个角色
Amazon_S3_Account_ID:S3 账户的 AWS 账户 ID
RoleA:您创建的第一个角色

unload ('select * from table_name') to 's3://awsbucket/folder/test.dat' iam_role 'arn:aws:iam::Amazon_Redshift_Account_ID:role/RoleB,arn:aws:iam::Amazon_S3_Account_ID:role/RoleA' ;

这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?