#python #amazon-web-services #amazon-s3 #aws-lambda #amazon-athena
#питон #amazon-веб-сервисы #amazon-s3 #aws-lambda #amazon-athena #python
Вопрос:
Я пытаюсь запустить приведенный ниже скрипт Python на AWS Lambda, который я запустил вручную, и я смог получить результат в своей корзине вывода S3 без каких-либо проблем. Но теперь, когда я вызываю скрипт из AWS Lambda, получая приведенную ниже ошибку, не уверен, что я чего-то не хватает в скрипте?
#!/usr/bin/env python3
import boto3
#Function for executing athena queries
def run_query(Event, context):
...
run_query(query, database, s3_output)
client = boto3.client('athena')
response = client.start_query_execution(
QueryString=query,
QueryExecutionContext={
'Database': 's3_accesslog'
},
ResultConfiguration={
'OutputLocation': s3_output,
}
)
#import datetime
import datetime
year = datetime.date.today()
year = year.strftime("%Y")
month = datetime.date.today()
month = month.strftime("%m")
day = datetime.date.today()
day = day.strftime("%d")
#select bucket
s3_input = "s3://smathena/cf-ant-prod/year=%s/month=%s/day=%s" % (year, month, day)
#Athena configuration
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,
Time STRING,
Location STRING,
SCBytes BIGINT,
RequestIP STRING,
Method STRING,
Host STRING,
Uri STRING,
Status INT,
Referrer STRING,
UserAgent STRING,
UriQS STRING,
Cookie STRING,
ResultType STRING,
RequestId STRING,
HostHeader STRING,
Protocol STRING,
CSBytes BIGINT,
TimeTaken FLOAT,
XForwardFor STRING,
SSLProtocol STRING,
SSLCipher STRING,
ResponseResultType STRING,
CSProtocolVersion STRING,
FleStatus STRING,
FleEncryptedFields INT,
CPort INT,
TimeToFirstByte FLOAT,
XEdgeDetailedResult STRING,
ScContent STRING,
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) = '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, получая приведенную ниже ошибку, не уверен, что я чего-то не хватает в скрипте?
{
"errorMessage": "run_query() takes 2 positional arguments but 3 were given",
"errorType": "TypeError",
"stackTrace": [
" File "/var/lang/lib/python3.7/imp.py", line 234, in load_modulen return load_source(name, filename, file)n",
" File "/var/lang/lib/python3.7/imp.py", line 171, in load_sourcen module = _load(spec)n",
" File "<frozen importlib._bootstrap>", line 696, in _loadn",
" File "<frozen importlib._bootstrap>", line 677, in _load_unlockedn",
" File "<frozen importlib._bootstrap_external>", line 728, in exec_modulen",
" File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removedn",
" File "/var/task/lambda_function.py", line 86, in <module>n res = run_query(q, database, s3_ouput)n"
]
}``
Комментарии:
1. Как вызывается эта лямбда-функция? Как предполагается присваивать значения для
query
,database
иs3_output
?
Ответ №1:
ваша функция lambda_handle
не соответствует интерфейсу python lambda:
def handler_name(event, context):
...
return some_value
входные данные для вашей функции должны быть в event
. Другой пример по этой ссылке:
def my_handler(event, context):
message = 'Hello {} {}!'.format(event['first_name'],
event['last_name'])
return {
'message' : message
}
Я бы ожидал, что query
, database
и s3_output
будут частью event
в вашем случае. Вероятно, вам нужна return
информация о выполнении запроса athena.