es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , ,

Answer

  1. Avatar for 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.

    import boto3
    from botocore.exceptions import ClientError
    
    def handler(event, context):
        glue_client = boto3.client('glue')
        job_name = 'nombre-de-mi-trabajo-glue'
        s3_event = event['Records'][0]['s3']
        bucket_name = s3_event['bucket']['name']
        object_key = s3_event['object']['key']
    
        try:
            print('Intentando iniciar el trabajo Glue:', job_name)
            job_run_id = glue_client.start_job_run(JobName=job_name, 
                                                    Arguments={'--s3_input_key': object_key, 
                                                               '--s3_input_bucket': bucket_name})
            print('Ejecutando trabajo Glue, id:', job_run_id)
            return job_run_id
       except ClientError as e:
            print('Error 1:', e)
            raise Exception("Error del cliente Boto3 en run_glue_job: " + e.__str__())
       except Exception as e:
            print('Error 2:', e)
            raise Exception("Error inesperado en run_glue_job: " + e.__str__())
    

    Esta versión actualizada del código incluye los parámetros event y context 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 variable s3_event extrae el bucket_name y object_key relevantes. Estos argumentos se pasan al trabajo Glue utilizando el parámetro Arguments en la función start_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.

Comments are closed.