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

上次更新时间:2020 年 8 月 11 日

我想使用 Amazon Redshift Spectrum 访问同一 AWS 区域内不同 AWS 账户中的 AWS Glue 和 Amazon Simple Storage Service (Amazon S3)。该如何操作?

简短描述

要从 Amazon Redshift Spectrum 访问其他账户下的 AWS 资源,请执行以下步骤:

1.    在账户 1 中,创建 AWS Identity and Access Management (IAM) 角色与 Amazon Redshift 的信任关系。此角色应附加到 Amazon Redshift 集群。

2.    在账户 2 中,创建另一个角色,为此角色同时提供对 AWS Glue 和 Amazon S3 的访问权限。此角色编辑信任关系,允许 Amazon Redshift 账户代入此角色。

3.    在账户 1 中,编辑现有角色的信任关系,使之承担在 AWS Glue 和 Amazon S3 账户中创建的代入角色。

解决方法

账户 1:创建 AWS Identity and Access Management (IAM) 角色与 Amazon Redshift 的信任关系

1.    打开 IAM 控制台

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

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

4.    选择 Redshift

5.    对于选择使用案例,选择 Redshift – 可自定义

6.    依次选择下一步: 权限、下一步: 标签,然后选择下一步: 检查。您无需添加策略或标签。

7.    输入角色名称,然后选择创建角色。在以下示例中,我们将此角色称为 redshift_role1

8.    将 redshift_role1 与 Amazon Redshift 集群相关联。 此关联允许您的集群代入新创建的角色,以访问 Amazon S3、Amazon Athena 和 AWS Glue。

账户 2:创建另一个角色,为此角色提供对 AWS Glue 和 Amazon S3 的访问权限

1.    打开 IAM 控制台

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

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

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "glue:BatchCreatePartition",
        "glue:UpdateDatabase",
        "glue:CreateTable",
        "glue:DeleteDatabase",
        "glue:GetTables",
        "glue:GetPartitions",
        "glue:BatchDeletePartition",
        "glue:UpdateTable",
        "glue:BatchGetPartition",
        "glue:DeleteTable",
        "glue:GetDatabases",
        "glue:GetTable",
        "glue:GetDatabase",
        "glue:GetPartition",
        "glue:CreateDatabase",
        "glue:BatchDeleteTable",
        "glue:CreatePartition",
        "glue:DeletePartition",
        "glue:UpdatePartition"
      ],
      "Resource": "*"
    },
    {
      "Sid": "VisualEditor1",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:ListBucketMultipartUploads",
        "s3:ListBucket",
        "s3:GetBucketLocation",
        "s3:ListMultipartUploadParts"
      ],
      "Resource": [
        "arn:aws:s3:::your_bucket",
        "arn:aws:s3:::your_bucket/*"
      ]
    },
    {
      "Sid": "VisualEditor2",
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt"
      ],
      "Resource": [
        "<KMS_KEY_ARN>"
      ]
    }
  ]
}

your_bucket 替换为您要使用 Amazon Redshift Spectrum 访问的 S3 存储桶的名称。 将 KMS_KEY_ARN 替换为加密 S3 存储桶的 KMS 密钥的 ARN。

注意:如果您的 S3 存储桶中的文件会被加密,请确保授予 Amazon Redshift 适当的权限。

4.    选择查看策略

5.    输入策略的名称,然后选择创建策略

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

7.    对于选择受信任实体的类型,选择另一个 AWS 账户

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

9.    选择下一步: 权限

10.    在策略列表中,选中您创建的策略名称旁边的复选框。

11.    选择下一步: 标签,然后选择下一步: 检查。您无需添加标签。

12.    输入角色名称,然后选择创建角色。在以下示例中,我们将此称为 glue_s3_role2

13.    从导航窗格中,选择角色

14.    选择您先前创建的角色的名称,然后选择信任关系选项卡。

15.    选择编辑信任关系

16.    删除现有策略,然后将它替换为类似于下面这样的策略。将 redshift_account1 替换为使用 Amazon Redshift 的账户的 ID。将 redshift_role1 替换为您创建的第一个角色的名称。

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

17.    选择更新信任策略

账户 1:编辑在 Amazon Redshift 中创建的角色的信任关系

1.    打开 IAM 控制台

2.    从导航窗格中选择角色,然后选择您之前创建的第一个角色 (redshift_role1)。

3.    选择添加内联策略

4.    选择 JSON 选项卡。删除现有策略,然后输入一个与以下类似的 IAM 策略。将 glue_s3_account2 替换为使用 AWS Glue 和 Amazon S3 的账户的 ID。将 glue_s3_role2 替换为您创建的第二个角色的名称:

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

5.    选择查看策略

6.    输入策略的名称,然后选择创建策略

7.    连接到 Amazon Redshift 集群

8.    使用您在这两个账户中创建的角色创建外部 schema,如下例所示:

create external schema spectrum_schema
from data catalog
database 'your_db'
iam_role 'arn:aws:iam::redshift_account1:role/redshift_role1,arn:aws:iam::glue_s3_account2:role/glue_s3_role2'

替换这些值:
your_db:您在 AWS Glue 中的数据库名称。
redshift_account1:Amazon Redshift 账户的 ID。
redshift_role1:您在 Amazon Redshift 账户中创建的角色的名称。
glue_s3_account2:AWS Glue 和 Amazon S3 账户的 ID。
glue_s3_role2::您在 AWS Glue 和 Amazon S3 账户中创建的角色的名称。

现在,只要所有资源都位于同一区域,您就可以使用 Amazon Redshift Spectrum,从 redshift_account1 中的 Amazon Redshift 集群查询 glue_s3_account2 中的 AWS Glue 表。您无需重新创建外部表,因为 Redshift Spectrum 可以访问您现有的 AWS Glue 表。

下例中的查询将返回以外部 schema 创建的 AWS Glue 表的行数:

select count(*) from spectrum_schema.glue_table;

注意:请将 spectrum_schemaglue_table 分别替换为您的 schema 和 AWS Glue 表的名称。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?