¿Cómo iniciar un trabajo de AWS Glue desde Lambda usando Python?
Estoy intentando iniciar un trabajo de AWS Glue (Python shell) a través de una función Lambda cuando se agregue un archivo nuevo en un depósito S3. Tengo el trabajo de Glue configurado y funciona como se espera si lo ejecuto manualmente. Pensé que el desencadenamiento del trabajo de Glue desde una función Lambda desencadenada por la creación de S3 sería sencillo. Hasta ahora tengo creada la función Lambda y se ejecuta cuando se crea el archivo en S3, sin embargo, no quiere iniciar realmente el trabajo de Glue ni proporciona ningún comentario sobre por qué no se iniciará. A continuación se muestra el código Python 3.8 que he estado usando en mi Lambda:
import boto3
from botocore.exceptions import ClientError
def handler(event, context):
glue_client = boto3.client('glue')
job_name = 'nombre-de-mi-trabajo-glue'
try:
print('Intentando iniciar trabajo de glue:', job_name)
job_run_id = glue_client.start_job_run(JobName=job_name)
print('Ejecutando trabajo de Glue, id:', job_run_id)
return job_run_id
except ClientError as e:
print('>>>>>> error 1:', e)
raise Exception("error del cliente boto3 en la ejecución del trabajo glue: " + e.str())
except Exception as e:
print('>>>>>> error 2:', e)
raise Exception("error inesperado en la ejecución del trabajo glue: " + e.str())
Cuando reviso los registros de la función Lambda, puedo ver que se inició cuando se creó el archivo en S3. Puedo ver la entrada de impresión ‘Intentando iniciar trabajo de glue: nombre-de-mi-trabajo-glue’. Y eso es todo lo que veo. No veo la entrada de registro impreso ‘Ejecutando trabajo de Glue, id: xxx’, ni veo ningún mensaje de error. Del mismo modo, los registros del trabajo Glue no muestran ninguna indicación de que se haya iniciado.
He dado a la función Lambda la política AWSGlueServiceRole, así que no creo que sea un problema de permisos.
Agradeceré cualquier idea.
davy.ai
Solución de problemas del trabajador AWS Glue desde Lambda disparado por evento de creación de S3
Problema
La función Lambda creada para activar un trabajo AWS Glue cuando se carga un nuevo archivo en un cubo S3 se ejecuta correctamente cuando se detecta un nuevo archivo, pero no inicia el trabajo Glue. No hay comentarios sobre por qué el trabajo Glue no se iniciará.
Solución
El código Python 3.8 en la función Lambda parece no tener la configuración de activador de eventos S3. A continuación se muestra una versión actualizada del código que incluye el disparador de eventos S3 que inicia el trabajo Glue.
Esta versión actualizada del código incluye los parámetros
event
ycontext
que Lambda pasa a la función. Esto permite que la función acceda a los detalles sobre el objeto S3 que activó la función Lambda. La variables3_event
extrae elbucket_name
yobject_key
relevantes. Estos argumentos se pasan al trabajo Glue utilizando el parámetroArguments
en la funciónstart_job_run
.También asegúrese de que el trabajo Glue tenga los permisos correctos y que el rol del trabajo Glue tenga acceso al cubo S3 que contiene los datos de entrada.
Con la versión actualizada del código, la función Lambda debería iniciarse el trabajo Glue, y debería ver la entrada de registro “Ejecutando trabajo Glue, id: xxx”. Si hay errores, se imprimirán en los registros de Lambda.
Conclusión
Al intentar activar un trabajo AWS Glue utilizando una función Lambda, asegúrese de incluir la configuración de activador de eventos S3 y de garantizar que el trabajo Glue tenga los permisos correctos, especialmente el acceso al cubo S3 que contiene los datos de entrada. Al hacerlo, podrá iniciar correctamente el trabajo Glue.