Проблема при выполнении скрипта Python в функции AWS Lambda

Aug 26 2020

Я попытался запустить приведенный ниже сценарий на 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"

Журналы функций: START RequestId: 2cb2175c-8838-470d-a8dd-efdf4c051312 Версия: $ LATEST [ERROR] TypeError: run_query () отсутствует 1 обязательный позиционный аргумент: 's3_output' Traceback (последний вызов последнего): File "/ var / runtime /bootstrap.py ", строка 131, в handle_event_request response = request_handler (event, 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 [ERROR] NameError: имя 's3_output' не определено Traceback (последний вызов последнего): файл "/var/task/lambda_function.py", строка 12 , в run_query 'OutputLocation': s3_output, END RequestId: 55dbf703-f30c-4106-8873-c685f3d06e4d REPORT RequestId: 55dbf703-f30c-4106-8873-c685f3d06e4d Длительность используемой памяти: 14,30 мс Макс. : 75 МБ Продолжительность инициализации: 649,66 мс

Ответы

JohnRotenstein Aug 27 2020 at 11:06

Это та же проблема, что и в предыдущем вопросе: ошибка при запуске скрипта python на AWS Lambda - qaru

Функция AWS Lambda имеет следующий формат:

import boto3

def lambda_handler(event, context):
    
    print(event)
    print(context)

Когда вызывается функция Lambda, она вызывает lambda_handler()функцию. При желании имя этой функции можно изменить, но она всегда будет получать эти два входящих параметра: eventиcontext

В зависимости от того, как вызывается лямбда-функция, содержимое eventсодержит информацию, которая «передается» в лямбда-функцию. Например:

  • Если функция вызывается из Amazon S3, она содержит имя корзины и объект, вызвавший событие.
  • Если функция вызывается из Amazon SNS, она содержит сообщение, отправленное в тему SNS.

Похоже, что вы хотите использовать в функции три значения: query, database, s3_output

Эти значения необходимо будет передать в лямбда-функцию с помощью любых средств, которые вызываются лямбда-функцией. Затем функция может получить эти значения через eventпараметр.