我在AWS Athena上创建了一个表,可以在该表上运行任何查询而没有任何错误:
select * from mytestdb.test
该表有三列customer_Id, product_Id, price
。
我尝试创建一个lambda函数,该函数使用boto3为我运行相同的查询:
import time
import boto3
DATABASE = 'mytestdb'
TABLE = 'test'
output='s3://mybucketons3/'
COLUMN = 'Customer_Id'
def lambda_handler(event, context):
keyword = 'xyz12345'
query = "SELECT * FROM %s.%s where %s = '%s';" % (DATABASE, TABLE, COLUMN, keyword)
client = boto3.client('athena')
# Execution
response = client.start_query_execution(
QueryString=query,
QueryExecutionContext={
'Database': DATABASE
},
ResultConfiguration={
'OutputLocation': output,
}
)
return
但是我遇到以下错误:
Response:
{
"errorMessage": "An error occurred (AccessDeniedException) when calling the StartQueryExecution operation: User: arn:aws:sts::076088932150:assumed-role/Test/QueryTest is not authorized to perform: athena:StartQueryExecution on resource: arn:aws:athena:us-west-2:076088932150:workgroup/primary",
"errorType": "ClientError",
这似乎是访问问题,但是我不确定为什么,因为我同时拥有同一个帐户的lambda和athena db。
答案 0 :(得分:1)
正如我在评论中提到的那样,您的Lambda角色应包含允许策略与Athena服务进行交互。我还为您的S3存储桶添加了完整权限。示例:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1547414166585",
"Action": [
"athena:StartQueryExecution"
],
"Effect": "Allow",
"Resource": "*"
},
{
"Sid": "Stmt1547414166586",
"Action": [
"s3:*"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::your-bucket-name/*"
}
]
}
答案 1 :(得分:0)
答案 2 :(得分:0)
为服务提供/添加完全访问权限不是最佳做法。您可以尝试仅访问 lambda 需要执行的操作。 尝试重新部署具有特定权限的 IAM 角色,并在成功部署后将其重新附加到 lambda 函数。 你的 lambda 肯定会工作。如果在添加所需权限后仍然拒绝访问,则从您的帐户中提出 aws 支持请求。