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

上次更新日期:2022 年 5 月 24 日

我想使用 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 console(IAM 控制台)。

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

3.    对于 Select type of trusted entity (选择受信任实体的类型),选择 AWS 服务

4.    选择 Redshift

5.    对于选择您的使用案例,选择 Redshift - Customizable (Redshift - 可自定义)

6.    依次选择 Next: Permissions(下一步:权限)、Next: Tags(下一步:标签)和 Next: Review(下一步:查看)。您无需添加策略或标签。

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

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

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

1.    打开 IAM console(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.    选择 Review policy(查看策略)。

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

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

7.    对于 Select type of trusted entity (选择受信任实体的类型),选择其他 AWS 账户

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

9.    选择 Next: Permissions (下一步: 权限)

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

11.    依次选择 Next: Tags (下一步: 标签)Next: Review (下一步: 查看)。您无需添加标签。

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.    选择 Update Trust Policy(更新信任策略)。

账户 1:编辑在 Amazon Redshift 中创建的角色的权限

1.    打开 IAM console(IAM 控制台)。

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

3.    从 Permissions(权限)部分中,选择 Add inline policy(添加内联策略)。

4.    选择 JSON 选项卡。删除现有策略,然后输入如下 IAM policy。将 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.    使用您在这两个账户中创建的角色创建外部 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 表。

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

select count(*) from spectrum_schema.glue_table;

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


这篇文章对您有帮助吗?


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