使用亚马逊 Athena 配置对共享 AWS Glue 数据目录的跨账户访问权限 - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用亚马逊 Athena 配置对共享 AWS Glue 数据目录的跨账户访问权限

由丹尼斯·阿夫多宁创作 () AWS

环境:生产

技术: DataLakes; 分析; 大数据

工作负载:所有其他工作负载

AWS服务:亚马逊 Athena;Glu AWS e

Summary

此模式提供了使用Glue数据目录配置存储在亚马逊简单存储服务 (Amazon S3IAM) 存储桶中的数据集的跨账户共享的 step-by-step说明,包括AWS身份和访问管理 () 策略示例AWS。您可将数据集存储在 S3 存储桶中。元数据由 AWS Glue 搜寻器收集并放入 Glue AWS 数据目录中。S3 存储桶和 AWS Glue 数据目录位于一个AWS称为数据帐户的账户中。您可以向另一个AWS账户(称为消费者账户)中的IAM委托人提供访问权限。用户可以使用 Amazon Athena 无服务器查询引擎查询使用者账户中的数据。

先决条件和限制

先决条件

产品版本

此模式仅适用于 Athena 引擎版本 2Athena 引擎版本 3。我们建议您升级到 Athena 引擎版本 3。如果您无法从 Athena 引擎版本 1 升级到 Athena 引擎版本 3,请遵循大数据博客中使用亚马逊 Athena 跨账户 AWS Glue 数据目录访问的方法。AWS

架构

目标技术堆栈

  • Amazon Athena

  • Amazon Simple Storage Service (Amazon S3)

  • AWSGlue

  • AWSIdentity and Access Management (IAM)

  • AWS密钥管理服务 (AWSKMS)

下图显示了一种架构,该架构使用IAM权限通过 AWS Glue 数据目录将一个AWS账户(数据账户)中的 S3 存储桶中的数据与另一个AWS账户(消费者账户)共享。

使用 Glue 数据目录在数据账户和使用者账户之间共享 S3 存储桶AWS中的数据集。

图表显示了以下工作流:

  1. 数据账户中的 S3 存储桶策略向使用者账户中的IAM角色和数据账户中的 Glue C AWS rawler 服务角色授予权限。

  2. 数据账户中的AWSKMS密钥策略向使用者账户中的IAM角色和数据账户中的 Glue C AWS rawler 服务角色授予权限。

  3. 数据账户中的 AWS Glue 搜寻器会发现存储在 S3 存储桶中的数据的架构。

  4. 数据账户中 AWS Glue 数据目录的资源策略向使用者账户中的IAM角色授予访问权限。

  5. 用户使用AWSCLI命令在消费者账户中创建命名的目录引用。

  6. IAM策略授予消费者账户中的IAM角色访问数据账户中资源的权限。该IAM角色的信任策略允许消费者账户中的用户代入该IAM角色。

  7. 消费者账户中的用户IAM扮演该角色并使用SQL查询访问数据目录中的对象。

  8. Athena 无服务器引擎运行查询。SQL

注意IAM最佳实践建议您向IAM角色授予权限并使用联合身份验证

工具

  • Amazon Athena 是一项交互式查询服务,可帮助您使用标准直接在 Amazon S3 中分析数据。SQL

  • Amazon Simple Storage Service (Amazon S3) 是一项基于云的对象存储服务,可帮助您存储、保护和检索任意数量的数据。

  • AWSGlu e 是一项完全托管的提取、转换和加载 (ETL) 服务。它可以帮助您在数据存储和数据流之间对数据进行可靠地分类、清理、扩充和移动。

  • AWSIdentity and Access Management (IAM) 通过控制谁经过身份验证并有权使用AWS资源,从而帮助您安全地管理对资源的访问权限。

  • AWS密钥管理服务 (AWSKMS) 可帮助您创建和控制加密密钥以保护您的数据。

操作说明

任务描述所需技能

授予对 S3 存储桶中数据的访问权限。

根据以下模板创建 S3 存储桶策略,并将该策略分配给存储数据的存储桶。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::<consumer account id>:role/<role name>", "arn:aws:iam::<data account id>:role/service-role/AWSGlueServiceRole-data-bucket-crawler" ] }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::data-bucket/*" }, { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::<consumer account id>:role/<role name>", "arn:aws:iam::<data account id>:role/service-role/AWSGlueServiceRole-data-bucket-crawler" ] }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::data-bucket" } ] }

存储桶策略向消费者账户中的IAM角色和数据账户中的 Glue C AWS rawler 服务角色授予权限。

云管理员

(如果需要)授予对数据加密密钥的访问权限。

如果 S3 存储桶由AWSKMS密钥加密,请向使用者账户中的IAM角色和数据账户中的 AWS Glue Crawler 服务角色授予密钥kms:Decrypt权限。

使用以下语句更新密钥政策

{ "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::<consumer account id>:role/<role name>", "arn:aws:iam::<data account id>:role/service-role/AWSGlueServiceRole-data-bucket-crawler" ] }, "Action": "kms:Decrypt", "Resource": "arn:aws:kms:<region>:<data account id>:key/<key id>" }
云管理员

授予爬网程序对数据的访问权限。

将以下IAM策略附加到爬虫的服务角色:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::data-bucket/*" }, { "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::data-bucket" } ] }
云管理员

(如果需要)授予爬网程序访问数据加密密钥的权限。

如果 S3 存储桶由AWSKMS密钥加密,则通过向爬虫的服务角色附加以下策略,将密钥的kms:Decrypt权限授予该抓取程序的服务角色:

{ "Effect": "Allow", "Action": "kms:Decrypt", "Resource": "arn:aws:kms:<region>:<data account id>:key/<key id>" }
云管理员

向消费者账户中的IAM角色和 Crawler 授予对数据目录的访问权限。

  1. 登录AWS管理控制台并打开 AWSGlue 控制台

  2. 在导航窗格的数据目录下方,选择设置

  3. 权限部分中添加以下语句,然后选择保存

{ "Version" : "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Principal" : { "AWS" : [ "arn:aws:iam::<consumer account id>:role/<role name>", "arn:aws:iam::<data account id>:role/service-role/AWSGlueServiceRole-data-bucket-crawler" ] }, "Action" : "glue:*", "Resource" : [ "arn:aws:glue:<region>:<data account id>:catalog", "arn:aws:glue:<region>:<data account id>:database/*", "arn:aws:glue:<region>:<data account id>:table/*" ] } ] }

此策略允许对数据帐户中的所有数据库和表执行所有 AWS Glue 操作。您可对策略进行自定义,使其仅向使用者主体授予所需权限。例如,您可提供对数据库中特定表或视图的只读访问权限。

云管理员
任务描述所需技能

数据目录命名引用。

要创建命名的数据目录引用,请使用CloudShell或本地安装AWSCLI来运行以下命令:

aws athena create-data-catalog --name <shared catalog name> --type GLUE --parameters catalog-id=<data account id>
云管理员

向消费者账户中的IAM角色授予对数据的访问权限。

将以下策略附加到消费者账户中的IAM角色,以授予该角色对数据的跨账户访问权限:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::data-bucket/*" }, { "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::data-bucket" }, { "Effect": "Allow", "Action": "glue:*", "Resource": [ "arn:aws:glue:<region>:<data account id>:catalog", "arn:aws:glue:<region>:<data account id>:database/*", "arn:aws:glue:<region>:<data account id>:table/*" ] } ] }

接下来,使用以下模板在其信任策略中指定哪些用户可以接受该IAM角色:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<consumer account id>:user/<IAM user>" }, "Action": "sts:AssumeRole" } ] }

最后,通过将相同的策略附加到用户组所属的用户组,授予用户担任该IAM角色的权限。

云管理员

(如果需要)授予消费者账户中的IAM角色访问数据加密密钥的权限。

如果 S3 存储桶由AWSKMS密钥加密,请通过向使用者账户中的IAM角色附加以下策略来授予该密钥的kms:Decrypt权限:

{ "Effect": "Allow", "Action": "kms:Decrypt", "Resource": "arn:aws:kms:<region>:<data account id>:key/<key id>" }
云管理员

切换到消费者账户中的IAM角色以访问数据。

作为数据使用者,切换到IAM角色以访问数据帐户中的数据。

数据使用者

访问数据。

使用 Athena 查询数据。例如,打开 Athena 查询编辑器,并运行以下查询:

SELECT * FROM <shared catalog name>.<database name>.<table name>

除了使用已命名的目录参考之外,您还可以通过目录的 Amazon 资源名称 (ARN) 来引用该目录。

注意:如您在查询或视图中使用动态目录引用,请使用转义双引号 (\”)。例如:

SELECT * FROM \"glue:arn:aws:glue:<region>:<data account id>:catalog\".<database name>.<table name>

有关更多信息,请参阅亚马逊 Athena 用户AWS指南中的跨账户访问 Glue 数据目录

数据使用者

相关资源

其他信息

使用 Lake Formation 作为共享跨账户替代方案

你也可以使用 AWS Lake Formation 在账户之间共享对 AWS Glue 目录对象的访问权限。Lake Formation 提供列和行级别的精细访问控制、基于标签的访问控制、受管控的ACID交易表以及其他功能。尽管 Lake Formation 与 Athena 很好地集成,但与该模式的仅限模式的方法相比,它确实需要额外的配置。IAM我们建议您在整体解决方案架构的更广泛背景下考虑使用 Lake IAM Formation 或仅限访问控制的决定。需要考虑的因素包括涉及哪些其他服务以及它们如何与这两种方法集成。