允许 Lambda 函数访问外部 Hive 元存储 - Amazon Athena
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

允许 Lambda 函数访问外部 Hive 元存储

要在账户中调用 Lambda 函数,您必须创建具有以下权限的角色:

  • AWSLambdaVPCAccessExecutionRole— 一个Amazon Lambda执行角色权限,以管理将函数连接到 VPC 的弹性网络接口。确保您有足够数量的可用网络接口和 IP 地址。

  • AmazonAthenaFullAccessAmazonAthenaFullAccess托管策略授予对 Athena 的完全访问权限。

  • Amazon S3 策略,该策略允许 Lambda 函数对 S3 进行写入,并允许 Athena 从 S3 中进行读取。

例如,以下策略定义溢出位置 s3:\\mybucket\spill 的权限。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::mybucket/spill" ] } ] }

每当您使用 IAM 策略时,请确保遵循 IAM 最佳实践。有关更多信息,请参阅 。IAM 中的安全最佳实践中的IAM 用户指南

创建 Lambda 函数

要在您的账户中创建 Lambda 函数,请使用函数开发权限或AWSLambdaFullAccess角色是必需的。有关更多信息,请参阅 。用于身份的 IAM 策略Amazon Lambda

因为 Athena 使用Amazon Serverless Application Repository要创建 Lambda 函数,创建 Lambda 函数的超级用户或管理员也应具有 IAM 策略允许 Athena 联合查询

目录注册和元数据 API 操作

要访问目录注册 API 和元数据 API 操作,请使用 AmazonAthenaFullAccess 托管策略。如果您不使用此策略,请将以下 API 操作添加到您的 Athena 策略:

{ "Effect": "Allow", "Action": [ "athena:ListDataCatalogs", "athena:GetDataCatalog", "athena:CreateDataCatalog", "athena:UpdateDataCatalog", "athena:DeleteDataCatalog", "athena:GetDatabase", "athena:ListDatabases", "athena:GetTableMetadata", "athena:ListTableMetadata" ], "Resource": [ "*" ] }

跨区域 Lambda 调用

要在运行 Athena 查询的区域以外的区域中调用 Lambda 函数,请使用 Lambda 函数的完整 ARN。默认情况下,Athena 调用在同一区域中定义的 Lambda 函数。如果需要调用 Lambda 函数来访问运行 Athena 查询的区域以外的区域中的 Hive 元存储,您必须提供 Lambda 函数的完整 ARN。

例如,假设您定义目录ehms上的欧洲(法兰克福)区域eu-central-1以在美国东部(弗吉尼亚北部)区域使用以下 Lambda 函数。

arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new

当您通过此方式指定完整 ARN 时,Athena 可以调用external-hms-service-new上的 Lambda 函数us-east-1从中获取 Hive 元数据仓数据eu-central-1

注意

CATLANTehms应在运行 Athena 查询的相同区域中注册。

跨账户 Lambda 调用

有时,您可能需要从其他账户访问 Hive 元存储。例如,要运行 Hive 元存储,您可以从用于 Athena 查询的账户之外的其他账户启动 EMR 集群。不同的组或团队可能会在其 VPC 内使用不同的账户运行 Hive 元存储。或者,您可能希望访问来自不同的组或团队中的各个 Hive 元存储的元数据。

Athena 使用Amazon Lambda支持跨账户访问以启用对 Hive 元存储的跨账户访问。

注意

请注意,Athena 的跨账户访问通常意味着对 Amazon S3 中的元数据和数据的跨账户访问。

设想以下场景:

  • 账户111122223333设置 Lambda 函数external-hms-service-new在 Athena 中的 us-east-1 上访问 EMR 集群上运行的 Hive 元存储。

  • 账户 111122223333 希望允许账户 444455556666 访问 Hive 元存储数据。

授予帐户444455556666对 Lambda 函数的访问权限external-hms-service-new,帐户111122223333使用以下各项Amazon CLI add-permission命令。该命令设置了格式以便于阅读。

$ aws --profile perf-test lambda add-permission --function-name external-hms-service-new --region us-east-1 --statement-id Id-ehms-invocation2 --action "lambda:InvokeFunction" --principal arn:aws:iam::444455556666:user/perf1-test { "Statement": "{\"Sid\":\"Id-ehms-invocation2\", \"Effect\":\"Allow\", \"Principal\":{\"AWS\":\"arn:aws:iam::444455556666:user/perf1-test\"}, \"Action\":\"lambda:InvokeFunction\", \"Resource\":\"arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new\"}" }

要检查 Lambda 权限,请使用get-policy命令,如以下示例所示。该命令设置了格式以便于阅读。

$ aws --profile perf-test lambda get-policy --function-name arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new --region us-east-1 { "RevisionId": "711e93ea-9851-44c8-a09f-5f2a2829d40f", "Policy": "{\"Version\":\"2012-10-17\", \"Id\":\"default\", \"Statement\":[{\"Sid\":\"Id-ehms-invocation2\", \"Effect\":\"Allow\", \"Principal\":{\"AWS\":\"arn:aws:iam::444455556666:user/perf1-test\"}, \"Action\":\"lambda:InvokeFunction\", \"Resource\":\"arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new\"}]}" }

添加权限后,您可以在us-east-1定义目录时,如下所示ehms

arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new

有关跨区域调用的信息,请参阅本主题前面的 跨区域 Lambda 调用

授予对数据的跨账户访问权限

您必须先授予对 Amazon S3 中数据的跨账户访问权限,然后才能运行 Athena 查询。您可以通过下列方式之一来执行该操作:

  • 使用一个更新 Amazon S3 存储桶的访问控制列表策略。规范用户 ID

  • 添加对 Amazon S3 存储桶策略的跨账户访问权限。

例如,将以下策略添加到账户中的 Amazon S3 存储桶策略111122223333允许帐户444455556666从指定的 Amazon S3 位置读取数据。

{ "Sid": "Stmt1234567890123", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::444455556666:user/perf1-test" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::athena-test/lambda/dataset/*" }
注意

您可能需要向授予对 Amazon S3 的跨账户访问权限,而且还要向您的 Amazon S3 溢出位置授予对 Amazon S3 的跨账户访问权限。当响应对象的大小超过给定阈值时,Lambda 函数会使额外数据流出到溢出位置。有关示例策略,请参阅本主题的开头部分。

在当前示例中,在向 444455556666, 授予跨账户访问权限后,444455556666 可在其自己的 account 中使用目录 ehms 查询账户 111122223333 中定义的表。

在以下示例中,SQL Workbench 配置文件 perf-test-1 适用于账户 444455556666。查询使用目录ehms访问 Hive 元存储以及账户中的 Amazon S3 数据111122223333


                    在 SQL Workbench 中跨账户访问 Hive 元存储和 Amazon S3 数据。