У меня есть очень простая таблица на AWSAthena с тремя столбцами: имя, город и цена. Я могу выполнить следующий простой запрос:
select * from mytestdb.test where city='austin'
и время работы составляет менее 1 секунды. Я создаю лямбда-функцию, используя boto3 для выполнения того же запроса, однако запрос не может быть завершен через 3 минуты
import time
import boto3
# athena constant
DATABASE = 'mytestdb'
TABLE = 'test'
# S3 constant
output='s3://mybucket'
COLUMN = 'city'
def lambda_handler(event, context):
# get keyword
keyword = 'Austin'
# created query
query = "SELECT * FROM %s.%s where %s = '%s';" % (DATABASE, TABLE, COLUMN, keyword)
# athena client
client = boto3.client('athena')
# Execution
response = client.start_query_execution(
QueryString=query,
QueryExecutionContext={
'Database': DATABASE
},
ResultConfiguration={
'OutputLocation': output,
}
)
# get query execution id
query_execution_id = response['QueryExecutionId']
print(query_execution_id)
# get execution status
# get query execution
query_status = client.get_query_execution(QueryExecutionId=query_execution_id)
print('Amir2')
query_execution_status = query_status['QueryExecution']['Status']['State']
time.sleep(200)
if query_execution_status == 'SUCCEEDED':
result = client.get_query_results(QueryExecutionId=query_execution_id)
else:
print('killed')
client.stop_query_execution(QueryExecutionId=query_execution_id)
return
таблица имеет всего 10 строк, поэтому она совсем не велика. Является ли правильный способ поиска желаемого значения в зависимости от города или есть лучший способ сделать это?
ОБНОВЛЕНИЕ: вот мое лямбда-разрешение (у него полный доступ к Афине и s3:
{ "Version": "2012-10-17", "Statement": [
{
"Sid": "Stmt1547414166585",
"Action": [
"athena:*"
],
"Effect": "Allow",
"Resource": "*"
},
{
"Sid": "Stmt1547414166586",
"Action": [
"s3:*"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::your-bucket-name/*"
} ] }