Problema al ejecutar el script de Python en la función AWS Lambda

Aug 26 2020

Intenté ejecutar el siguiente script en AWS Lambda, pero desafortunadamente, no se está ejecutando correctamente. ¿Alguien puede ayudarme a obtener esta solución o corregirme si hay un problema con el script que necesita algún cambio ejecutándolo desde 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)'

Error al probar en 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 de solicitud: "2cb2175c-8838-470d-a8dd-efdf4c051312"

Registros de funciones: START RequestId: 2cb2175c-8838-470d-a8dd-efdf4c051312 Versión: $ LATEST [ERROR] TypeError: run_query () falta 1 argumento posicional requerido: 's3_output' Traceback (última llamada más reciente): File "/ var / runtime /bootstrap.py ", línea 131, en handle_event_request response = request_handler (evento, 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  

Obteniendo el siguiente error:

START RequestId: 55dbf703-f30c-4106-8873-c685f3d06e4d Versión: $ LATEST [ERROR] NameError: el nombre 's3_output' no está definido Traceback (última llamada más reciente): Archivo "/var/task/lambda_function.py", línea 12 , en run_query 'OutputLocation': s3_output, END RequestId: 55dbf703-f30c-4106-8873-c685f3d06e4d REPORT RequestId: 55dbf703-f30c-4106-8873-c685f3d06e4d Duración: 14.30 ms Memoria máxima utilizada Tamaño facturado: 100 ms : 75 MB Duración inicial: 649.66 ms

Respuestas

JohnRotenstein Aug 27 2020 at 11:06

Este es el mismo problema que en su pregunta anterior: error al ejecutar un script de Python en AWS Lambda

Una función de AWS Lambda tiene este formato:

import boto3

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

Cuando se invoca la función Lambda, llama a la lambda_handler()función. El nombre de esta función se puede cambiar si se desea, pero siempre recibirá esos dos parámetros entrantes: eventycontext

Dependiendo de cómo se invoque la función Lambda, el contenido de eventcontiene información que se "pasa" a la función Lambda. Por ejemplo:

  • Si la función se invoca desde Amazon S3, contiene el nombre del depósito y el objeto que activó el evento.
  • Si la función se invoca desde Amazon SNS, contiene el mensaje que se envió al tema de SNS

Parece que desea utilizar tres valores en la función: query, database, s3_output

Estos valores deberán pasarse a la función Lambda a través de cualquier medio en el que se invoque la función Lambda. Luego, la función puede recuperar esos valores a través del eventparámetro.