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

2024-04-26 00:11:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个帐户A和B。S3存储桶和Athena视图在帐户A中,Lambda在帐户B中。我想从我的Lambda调用Athena。我还允许在S3 Bucket策略中使用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'])

请导游


Tags: lambdanameimportclient视图dbs3bucket
2条回答

进行以下工作—

帐户(A)创建一个IAM角色,该角色可以访问Athena和S3 bucket,还可以为帐户B中的角色添加权限,以便在此角色上调用假定角色

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

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

你有:

  • Amazon S3存储桶位于Account-A
  • 亚马逊雅典娜
  • AWS Lambda函数在Account-B

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

Amazon Athena使用IAM用户或调用它的IAM角色的权限运行。因此,使用Athena的用户或角色需要权限才能访问AmazonS3中的数据。在前面的问题中,这是通过一个Bucket策略实现的,该策略为Lambda提供了访问不同帐户中的Bucket的权限

然而,在这个问题中,一个帐户中有Lambda想要在另一个帐户中使用Amazon Athena。没有能力将雅典娜访问权授予其他帐户中的用户。因此,您的Lambda函数需要在雅典娜帐户中扮演角色

因此:

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

这将导致Lambda能够访问Account-A中的雅典娜,包括已经创建的任何表和视图

如果您不需要Athena中定义的现有表和视图,那么您可以在与Lambda相同的帐户中使用Athena,但是源S3 bucket需要根据您的previous question授予对Lambda的IAM角色的访问权

相关问题 更多 >