Ошибка при запуске скрипта Python в AWS Lambda

#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.