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

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

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

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

  • AWSLambdaVPCAccessExecutionRoleAWS 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" ] } ] }

创建 Lambda 函数

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

由于 Athena 使用 AWS 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。

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

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

当您通过此方式指定完整 ARN 时,Athena 会对 us-east-1 调用 external-hms-service-new Lambda 函数以从 eu-central-1 中提取 Hive 元存储数据。

注意

应在运行 Athena 查询的相同区域中注册目录 ehms

跨账户 Lambda 调用

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

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

注意

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

设想以下场景:

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

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

为了向账户 444455556666 授予对 Lambda 函数 external-hms-service-new 的访问权限,账户 111122223333 使用以下 AWS 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\"}]}" }

添加权限后,您可以在定义目录 ehms 时对 us-east-1 使用 Lambda 函数的完整 ARN,如下所示:

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

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

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

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

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

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

例如,将以下策略添加到账户 111122223333 中的 Amazon S3 存储桶策略以允许账户 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 溢出位置的跨账户访问权限。当响应对象的大小超过给定阈值时,Lambda 函数会使额外数据流出到溢出位置。有关示例策略,请参阅本主题的开头部分。

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

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


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