繁体   English   中英

从不同账户中的 Python Lambda 访问 AWS Athena

[英]Access AWS Athena from Python Lambda in different account

我有两个账户 A 和 B。S3 Buckets 和 Athena View 在账户 A 中,Lambda 在账户 B 中。我想从我的 Lambda 调用 Athena。 我还允许在 S3 存储桶策略中使用 Lambda 执行角色。 当我尝试从 Lambda 调用数据库时,它给我的错误是'Status': {'State': 'FAILED', 'StateChangeReason': 'SYNTAX_ERROR: line 1:15: Schema db_name does not exist'

以下是我的 Lambda 代码:

import boto3
import time

def lambda_handler(event, context):

    athena_client = boto3.client('athena')
    client_exc = athena_client.start_query_execution(
        QueryString='SELECT * FROM db_name.athena_view',
        ResultConfiguration={'OutputLocation': 's3://my-athena-out-bucket/'}
    )

    resp= athena_client.get_query_results(QueryExecutionId=client_exc['QueryExecutionId'])

请指导。

做以下-

账户(A) 创建一个可以访问 Athena 和 S3 存储桶的 IAM 角色,并为账户 B 中的角色添加权限以调用此角色的承担角色。

账户 (B) 创建一个 IAM 角色并将其分配给 Lambda,该角色将承担账户 A 的角色,该角色可以临时访问 Athena 和 S3。

请参阅以下链接 - https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html

你有:

  • Account-A Amazon S3 存储桶
  • Account-A Amazon Athena
  • Account-B AWS Lambda 函数

(这与您之前的问题不同,您在之前的问题中让 Athena 在Account-B访问Account-A S3。在这种情况下, Account-A的 Bucket 策略足以授予在Account-B运行的 Athena 访问 S3 的权限。)

Amazon Athena 使用调用它的 IAM 用户或 IAM 角色的权限运行。 因此,使用 Athena 的用户或角色需要访问 Amazon S3 中的数据的权限。 在您之前的问题中,这是通过存储桶策略完成的,该策略为 Lambda 提供访问不同账户中存储桶的权限。

但是,在这个问题中,您希望在另一个账户中使用 Amazon Athena 的一个账户中的 Lambda 无法向其他帐户中的用户授予 Athena 访问权限。 因此,您的 Lambda 函数需要在 Athena 账户中扮演一个角色

所以:

  • Account-A (使用 Athena)中创建一个 IAM 角色,授予使用 Athena相关 Amazon S3 存储桶的访问权限
  • Account-B的 Lambda 函数:
    • 应该调用AssumeRole()来“成为”上述角色
    • 应该使用提供回来的凭据创建一个新的Session ,用于为 Athena 创建 boto3 客户端

这将导致 Lambda 可以访问Account-A Athena,包括任何已创建的表和视图。

如果您不需要在 Athena 中定义的现有表和视图,那么您可以在Lambda相同的账户中使用 Athena,但源 S3 存储桶需要根据您之前的问题授予对 Lambda 的 IAM 角色的访问权限。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM