如何创建对 AWS Glue 和 Amazon S3 的 Amazon Redshift Spectrum 跨账户存取?

3 分钟阅读
0

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

简短描述

要访问与 Amazon Redshift Spectrum 不同的账户中的 AWS 资源,请执行以下步骤:

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

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

3.在账户 1 中,编辑现有角色的权限,使其代入在 AWS Glue 和 Amazon S3 账户中创建的角色。

解决方法

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

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"
    }
  ]
}<br>

5.选择查看策略

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

7.连接到 Amazon Redshift 集群

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

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 账户中创建的角色的名称。

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

以下示例中的查询返回在外部架构中创建的 AWS Glue 表中的行数:

select count(*) from spectrum_schema.glue_table;

**注意:**将 spectrum_schemaglue_table 替换为您的架构和 AWS Glue 表的名称。

相关信息

在 Amazon Redshift 中链接 IAM 角色

Amazon Redshift Spectrum 的 IAM 策略

AWS 官方
AWS 官方已更新 2 年前