跳至内容

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

3 分钟阅读
0

我想使用 Amazon Redshift Spectrum 访问不同 AWS 账户中的 AWS Glue 和 Amazon Simple Storage Service (Amazon S3)。

解决方法

创建信任 Amazon Redshift 的 IAM 角色

要使用 Amazon Redshift Spectrum 访问跨账户 AWS 资源,您必须创建一个信任 Amazon Redshift 的 AWS Identity and Access Management (IAM) 角色。然后,将该角色附加到 Amazon Redshift 集群。

完成以下步骤:

  1. 打开 IAM 控制台
  2. 在导航窗格中,选择 Roles(角色)。
  3. 选择 Create role(创建角色)。
  4. 对于 Select type of trusted entity(选择可信实体类型),选择 AWS service(AWS 服务)。
  5. 选择 Redshift
  6. 对于 Select your use case(选择您的用例),选择 Redshift - Customizable(Redshift - 可自定义)。
  7. 依次选择 Next: Permissions(下一步:权限)、Next: 标签下一步: Review(下一步:查看)。
    **注意:**您无需添加策略或标签。
  8. 输入 Role name(角色名称),然后选择 Create role(创建角色)。在以下示例中,角色为 redshift_role1
  9. 将 redshift_role1 与 Amazon Redshift 集群相关联。这种关联允许您的集群代入新创建的角色来访问 Amazon S3、Amazon Athena 和 AWS Glue。

创建可以访问 AWS Glue 和 Amazon S3 的新 IAM 角色

在另一个账户中,创建一个可以同时访问 AWS Glue 和 Amazon S3 的新 IAM 角色。Amazon Redshift 代入通过信任关系访问 AWS Glue 和 S3 资源的角色。

完成以下步骤:

  1. 打开 IAM 控制台

  2. 选择 Policies(策略),然后选择 Create policy(创建策略)。

  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. 输入策略的 Name(名称),然后选择 Create policy(创建策略)。

  6. 在导航窗格中,选择 Roles(角色),然后选择 Create role(创建角色)。

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

  8. 对于 Account ID(账户 ID),输入使用 Amazon Redshift 的账户的 ID。有关详细信息,请参阅为您的 AWS 账户 ID 使用别名

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

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

  11. 选择 Next: Tags(下一步:标签),然后选择 Next: Review(下一步:查看)。
    **注意:**您不需要添加标签。

  12. 输入 Role name(角色名称),然后选择 Create role(创建角色)。在以下示例中,角色为 glue_s3_role2

  13. 在导航窗格中,选择 Roles(角色)。

  14. 选择您创建的角色的名称,然后选择 Trust Relationships(信任关系)选项卡。

  15. 选择 Edit trust relationship(编辑信任关系)。

  16. 删除现有策略,然后将其替换为类似于以下示例的策略:

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

**注意:**将 redshift_account1 替换为使用 Amazon Redshift 的账户的 ID。将 redshift_role1 替换为您创建的第一个角色的名称。

  1. 选择 Update Trust Policy(更新信任策略)。

更新 Amazon Redshift IAM 角色的权限

更新您创建的第一个 IAM 角色的权限。完成以下步骤:

  1. 打开 IAM 控制台

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

  3. 在 Permissions(权限)下,选择 Add inline policy(添加内联策略)。

  4. 选择 JSON 选项卡。删除现有策略,然后输入类似于以下示例的 IAM 策略:

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

    **注意:**将 glue_s3_account2 替换为使用 AWS Glue 和 Amazon S3 的账户的 ID。将 glue_s3_role2 替换为您创建的第二个角色的名称。

  5. 选择 Review policy(查看策略)。

  6. 输入策略的名称,然后选择 Create policy(创建策略)。

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

    在创建外部架构 DDL 语句中,按以下顺序列出 IAM 角色 ARN:redshift_cluster_roledestination_account_role。不要在角色之间添加空格。

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

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

select count(*) from spectrum_schema.glue_table;

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

相关信息

授权 Amazon Redshift 代表您访问 AWS 服务

Amazon Redshift Spectrum 的 IAM 策略

AWS 官方已更新 8 个月前