我有两个帐户A和B。S3 Buckets和雅典娜视图在帐户A中,Lambda在帐户B中。我想从我的Lambda中呼叫雅典娜。我还允许在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'])请指点一下。
发布于 2020-03-03 20:08:20
执行以下操作-
Account(A)创建一个IAM-Role,它可以访问雅典娜和S3存储桶,还可以为account B中的角色添加权限,以在此角色上调用Assume。
帐户(B)创建一个IAM角色,并将其分配给Lambda,该角色将承担帐户A的角色,该帐户可以临时访问雅典娜和S3。
请参阅以下链接- https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html
发布于 2020-03-04 13:01:12
您必须:
Account-B中Account-A
Account-A
(这与您的previous question不同,您让Account-B中的雅典娜访问Account-A中的S3。在该场景中,Account-A中的存储桶策略足以授予在Account-B中运行的雅典娜访问S3的权限。)
Amazon Athena使用调用它的IAM用户或IAM角色的权限运行。因此,使用雅典娜的用户或角色需要拥有访问亚马逊S3中数据的权限。在您之前的问题中,这是通过一个Bucket Policy实现的,该bucket Policy为Lambda提供了访问不同帐户中的bucket的权限。
然而,在这个问题中,一个帐户中的Lambda想要在另一个帐户中使用亚马逊雅典娜。无法将Athena访问权限授予不同帐户中的用户。因此,您的Lambda函数将需要在雅典娜帐户中承担一个角色。
因此:
Account-A (具有雅典娜)中创建一个IAM角色,该角色授予使用雅典娜和相关的亚马逊S3存储桶的访问权限,并在Account-B中使用Lambda函数:AssumeRole()以“成为”上述角色<代码>H229<代码>H130应使用返回的凭据创建新的D31,该凭据用于为Athena创建boto3客户端
这将导致Lambda能够访问Account-A中的雅典娜,包括已经创建的任何表和视图。
如果不需要在雅典娜中定义的现有表和视图,那么可以在与Lambda相同的帐户中使用雅典娜,但是源S3存储桶需要根据您的previous question授予对Lambda的IAM角色的访问权限。
https://stackoverflow.com/questions/60506048
复制相似问题