Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何创建对 AWS Glue 和 Amazon S3 的 Amazon Redshift Spectrum 跨账户访问?
我想使用 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 集群。
完成以下步骤:
- 打开 IAM 控制台。
- 在导航窗格中,选择 Roles(角色)。
- 选择 Create role(创建角色)。
- 对于 Select type of trusted entity(选择可信实体类型),选择 AWS service(AWS 服务)。
- 选择 Redshift。
- 对于 Select your use case(选择您的用例),选择 Redshift - Customizable(Redshift - 可自定义)。
- 依次选择 Next: Permissions(下一步:权限)、Next: 标签和下一步: Review(下一步:查看)。
**注意:**您无需添加策略或标签。 - 输入 Role name(角色名称),然后选择 Create role(创建角色)。在以下示例中,角色为 redshift_role1。
- 将 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 资源的角色。
完成以下步骤:
-
打开 IAM 控制台。
-
选择 Policies(策略),然后选择 Create policy(创建策略)。
-
选择 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 授予适当的权限。
-
选择 Review policy(查看策略)。
-
输入策略的 Name(名称),然后选择 Create policy(创建策略)。
-
在导航窗格中,选择 Roles(角色),然后选择 Create role(创建角色)。
-
对于 Select type of trusted entity(选择受信任实体类型),选择 Another AWS account(其他 AWS 账户)。
-
对于 Account ID(账户 ID),输入使用 Amazon Redshift 的账户的 ID。有关详细信息,请参阅为您的 AWS 账户 ID 使用别名。
-
选择 Next: Permissions(下一步:权限)。
-
在策略列表中,选中您创建的策略名称。
-
选择 Next: Tags(下一步:标签),然后选择 Next: Review(下一步:查看)。
**注意:**您不需要添加标签。 -
输入 Role name(角色名称),然后选择 Create role(创建角色)。在以下示例中,角色为 glue_s3_role2。
-
在导航窗格中,选择 Roles(角色)。
-
选择您创建的角色的名称,然后选择 Trust Relationships(信任关系)选项卡。
-
选择 Edit trust relationship(编辑信任关系)。
-
删除现有策略,然后将其替换为类似于以下示例的策略:
{ "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 替换为您创建的第一个角色的名称。
- 选择 Update Trust Policy(更新信任策略)。
更新 Amazon Redshift IAM 角色的权限
更新您创建的第一个 IAM 角色的权限。完成以下步骤:
-
打开 IAM 控制台。
-
从导航窗格中选择 Roles(角色),然后选择您之前创建的第一个角色的名称 (redshift_role1)。
-
在 Permissions(权限)下,选择 Add inline policy(添加内联策略)。
-
选择 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 替换为您创建的第二个角色的名称。
-
选择 Review policy(查看策略)。
-
输入策略的名称,然后选择 Create policy(创建策略)。
-
创建使用您在两个账户中创建的角色的外部架构。请参阅以下示例:
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_role、destination_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_schema 和 glue_table 替换为您的架构和 AWS Glue 表的名称。
相关信息
- 语言
- 中文 (简体)
