允许 Lambda 函数访问外部 Hive 元存储
要在账户中调用 Lambda 函数,您必须创建具有以下权限的角色:
-
AWSLambdaVPCAccessExecutionRole
– AWS Lambda 执行角色权限,用于管理将函数连接到 VPC 的弹性网络接口。确保您有足够数量的可用网络接口和 IP 地址。 -
AmazonAthenaFullAccess
– AmazonAthenaFullAccess 托管式策略授予对 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:::amzn-s3-demo-bucket/spill" ] } ] }
每当您使用 IAM 策略时,请确保遵循 IAM 最佳实践。有关更多信息,请参阅 IAM 用户指南中的 IAM 安全最佳实践。
创建 Lambda 函数
要在您的账户中创建 Lambda 函数,需要函数开发权限或 AWSLambdaFullAccess
角色。有关更多信息,请参阅 AWS Lambda 的基于身份的 IAM 策略。
由于 Athena 使用 AWS Serverless Application Repository 创建 Lambda 函数,因此,创建 Lambda 函数的超级用户或管理员也应具有 IAM 策略以允许 Athena 联合查询。
目录注册和元数据 API 操作
要访问目录注册 API 和元数据 API 操作,请使用 AmazonAthenaFullAccess 托管策略。如果您不使用此策略,请将以下 API 操作添加到您的 Athena 策略:
{ "Version": "2012-10-17", "Statement": [ { "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 函数,请使用 Lambdaq 函数的完整 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 对跨账户访问的支持
注意
请注意,对 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 位置读取数据。
{ "Version": "2012-10-17", "Statement": [ { "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 数据。](images/hive-metastore-iam-access-lambda-1.png)