【发布时间】:2020-08-27 12:06:21
【问题描述】:
我尝试在 AWS Lambda 上运行以下脚本,但不幸的是,它没有成功执行。如果脚本有问题需要从 Lambda 执行它,任何人都可以帮我解决或纠正我吗?
#!/usr/bin/env python3
import boto3
client = boto3.client('athena')
def run_query(query, database, s3_output):
response = client.start_query_execution(
QueryString=query,
QueryExecutionContext={
'Database': 'database'
},
ResultConfiguration={
'OutputLocation': s3_output,
}
)
print('Execution ID: ' + response['QueryExecutionId'])
return response
#Athena configuration
s3_input = 's3://smathena/cf-ant-prod/'
s3_ouput = 's3://smathena/athenatest/'
database = 's3_accesslog'
table = 'test_output1'
#Athena database and table definition
create_database = "CREATE DATABASE IF NOT EXISTS %s;" % (database)
delete_table = "drop table %s.%s;" % ( database, table )
create_table = \
"""CREATE EXTERNAL TABLE IF NOT EXISTS %s.%s (
`Date` DATE,
ScContentLen BIGINT,
ScRangeStart BIGINT,
ScRangeEnd BIGINT
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LOCATION '%s'
TBLPROPERTIES ('skip.header.line.count' = '2');""" % ( database, table, s3_input )
#Query definitions
query_1 = "SELECT * FROM %s.%s where CAST(status AS VARCHAR) like '404';" % (database, table)
#Execute all queries
queries = [ create_database, delete_table, create_table, query_1 ]
for q in queries:
print("Executing query: %s" % (q))
res = 'run_query(q, database, s3_ouput)'
在 AWS Lambda 上测试时出错:
Response:
{
"errorMessage": "run_query() missing 1 required positional argument: 's3_output'",
"errorType": "TypeError",
"stackTrace": [
" File \"/var/runtime/bootstrap.py\", line 131, in handle_event_request\n response = request_handler(event, lambda_context)\n"
]
}
请求 ID: "2cb2175c-8838-470d-a8dd-efdf4c051312"
功能日志: 开始请求 ID:2cb2175c-8838-470d-a8dd-efdf4c051312 版本:$LATEST [错误] 类型错误:run_query() 缺少 1 个必需的位置参数:'s3_output' 回溯(最近一次通话最后): 文件“/var/runtime/bootstrap.py”,第 131 行,在 handle_event_request 中 响应 = request_handler(事件,lambda_context) END RequestId: 2cb2175c-8838-470d-a8dd-efdf4c051312
import boto3
client = boto3.client('athena')
def run_query(event, context):
response = client.start_query_execution(
QueryString=query,
QueryExecutionContext={
'Database': 'database'
},
ResultConfiguration={
'OutputLocation': s3_output,
}
)
print('Execution ID: ' + response['QueryExecutionId'])
return event
得到以下错误:
START RequestId:55dbf703-f30c-4106-8873-c685f3d06e4d 版本:$LATEST [错误] NameError:名称's3_output'未定义 回溯(最近一次通话最后): 文件“/var/task/lambda_function.py”,第 12 行,在 run_query '输出位置':s3_output, 结束请求 ID:55dbf703-f30c-4106-8873-c685f3d06e4d 报告请求 ID:55dbf703-f30c-4106-8873-c685f3d06e4d 持续时间:14.30 毫秒计费持续时间:100 毫秒内存大小:128 MB 使用的最大内存:75 MB 初始化持续时间:649.66 毫秒
【问题讨论】:
-
您似乎错过了处理程序。不是吗?
-
感谢您的回复。尝试添加上面附加的处理程序仍然得到 NameError: name 's3_output' is not defined。任何建议将不胜感激。
-
函数是如何被触发的?
query, database, s3_output的值是如何提供给 Lambda 函数的?
标签: python aws-lambda amazon-athena