如何创建 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"
}
]
}
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_schema 和 glue_table 分别替换为您的 schema 和 AWS Glue 表的名称。