Solución:
@oreoluwa tiene razón, esto se puede hacer usando Cloudwatch Events.
Desde el panel de Cloudwatch:
- Haga clic en ‘Reglas’ en el menú de la izquierda
- Para ‘Fuente de evento’, elija ‘Patrón de evento’ y en ‘Nombre de servicio’ elija ‘Pegamento’
- Para ‘Tipo de evento’, elija ‘Cambio de estado de trabajo de pegamento’
- En el lado derecho de la página, en la sección ‘Objetivos’, haga clic en ‘Agregar objetivo’ -> ‘Función Lambda’ y luego elija su función.
El evento que obtendrá en Lambda tendrá el formato:
{
'version': '0',
'id': 'a9bc90be-xx00-03e0-9bc5-a0a0a0a0a0a0',
'detail-type': 'GlueJobStateChange',
'source': 'aws.glue',
'account': 'xxxxxxxxxx',
'time': '2018-05-10T16: 17: 03Z',
'region': 'us-east-2',
'resources': [],
'detail': {
'jobName': 'xxxx_myjobname_yyyy',
'severity': 'INFO',
'state': 'SUCCEEDED',
'jobRunId': 'jr_565465465446788dfdsdf546545454654546546465454654',
'message': 'Jobrunsucceeded'
}
}
No. Actualmente no puede activar una función lambda al final de un trabajo de Glue. La razón de esto es que AWS aún no ha proporcionado este disparador en Lambda. Si observa la lista de activadores lambda de AWS después de crear una función lambda, verá que tiene la mayoría de los servicios de AWS como activador, pero no AWS Glue. Entonces, por ahora, no es posible, pero tal vez en el futuro.
Pero me gustaría mencionar que en realidad puede controlar el flujo de los scripts de pegamento usando su script lambda python. (Lo hice usando Python, estoy seguro de que puede haber otros lenguajes que lo admitan). Mi caso de uso fue que cada vez que subo cualquier objeto en el bucket de S3, obtiene el disparador de la función lambda desde el cual estaba leyendo el archivo del objeto y comenzando mi trabajo de pegamento. Y una vez que se completara el estado del trabajo de Glue, escribiría mi archivo de nuevo en el depósito S3 vinculado a esta función Lambda.
Dado que AWS Glue ha comenzado a admitir Python, probablemente pueda seguir la ruta siguiente para lograr lo que desea. El siguiente script de muestra muestra cómo hacerlo:
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
import boto3 ## Step-2
## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)
## Do all ETL stuff here
## Once the ETL completes
lambda_client = boto3.client('lambda') ## Step-3
response = lambda_client.invoke(FunctionName="string") ## Step-4
- Cree un trabajo de pegamento basado en python (para realizar ETL en Redshift)
- En la secuencia de comandos del trabajo, importe boto3 (es necesario colocar este paquete como biblioteca de secuencias de comandos).
- Hacer una conexión a lambda usando boto3
- Invoque la función lambda usando boto3 lambda invoke () una vez que se complete el ETL.
Asegúrese de que el rol que está utilizando al crear el trabajo de Glue tenga permisos para invocar funciones lambda.
Consulte la documentación de Boto3 para lambda aquí.