AWS - Comunicar dos lambdas usando SQS (Queue service)

Enviar un mensaje de una lambda a una SQS que hace de trigger de otra
El contexto es el siguiente:
Tengo dos lambdas que se deben ejecutar de forma sincrona de la siguiente forma:
- La lambda uno hace un proceso de ETL y devuelve un código de cuenta.
- Ese código de cuenta es la entrada de otra ETL (otra lambda) que depende de este dato.
El código de cuenta accountId se transfiere a traves de un un recurso intermedio que sirve al mismo tiempo de trigger de la segunda lambda.
Este trigger es un SQS que es un sistema de colas.
A continuación explico el código hecho en python de las dos lambdas:
- lanbda_que_envia.py
- lambda_que_recibe.py
lambda_que_envia.py
def lambda_handler(event, context):
logger.info("start")
sqs_url = f"https://sqs.{get_config('region')}.amazonaws.com/{get_config('account')}/sqs-trigger-lambda-que-recibe"
sqs_client = boto3.client(
'sqs',
region_name=get_config("region")
)
response = sqs_client.send_message_batch(
QueueUrl=sqs_url,
Entries=[{
"Id": "1",
"MessageBody": json.dumps({
"accountId": "3456"
}),
}]
)
logger.info("response sqs")
pprint(response)
logger.info("end")
Del código anterior podemos esperar que el objeto response, que es de tipo diccionario, tenga estos formatos:
Caso "success"
{
'ResponseMetadata': {
'HTTPHeaders': {
'content-length': '467',
'content-type': 'text/xml',
'date': 'Thu, 22 Apr 2021 12:20:03 GMT',
'x-amzn-requestid': '4da969ec-10d8-51f8-8263-31177ceb3503'
},
'HTTPStatusCode': 200,
'RequestId': '4da969ec-10d8-51f8-8263-31177ceb3503',
'RetryAttempts': 0
},
'Successful': [
{
'Id': '1',
'MD5OfMessageBody': '30840356415d359f33cec2ad1682bd71',
'MessageId': 'f60ac369-85fa-44a4-96de-fa5c4da0bee3'
}
]
}
Caso "error"
{
"errorMessage": "An error occurred (AWS.SimpleQueueService.NonExistentQueue) when calling
the SendMessageBatch operation: The specified queue does not exist for
his wsdl version.",
"errorType": "QueueDoesNotExist",
"stackTrace": [
[
"/var/task/lambda_function.py",
29,
"lambda_handler",
"\"accountId\": account_id"
],
[
"/var/runtime/botocore/client.py",
357,
"_api_call",
"return self._make_api_call(operation_name, kwargs)"
],
[
"/var/runtime/botocore/client.py",
676,
"_make_api_call",
"raise error_class(parsed_response, operation_name)"
]
]
}
Con el código anterior se ha enviado el mensaje a la cola que no es más que un json en string.
Cuando la SQS recibe el mensaje lo inyecta en lambda_que_recibe.py lambda_handler como evento
lambda_que_recibe.py
def lambda_handler(event, context):
logger.info("start recibe")
logger.info("EVENT received")
pprint(event)
logger.info("end EVENT")
account_id = get_account_id_from_event(event)
if not account_id:
error = "Missing accountId"
logger.error(error)
return {"error": error}
logger.info(f"end recibe account-id: {account_id}")
Formato del evento recibido
{
'Records': [
{
'attributes': {
'ApproximateFirstReceiveTimestamp': '1619094828869',
'ApproximateReceiveCount': '1',
'SenderId': 'AROATKX3FEXQZPZAJZR3B:lambda-que-envia',
'SentTimestamp': '1619094828863'
},
'awsRegion': 'us-east-2',
'body': '{"accountId": "3456"}',
'eventSource': 'aws:sqs',
'eventSourceARN': 'arn:aws:sqs:us-east-2:aaaacccc:sqs-lambda-que-recibe',
'md5OfBody': '30840356415d359f33cec2ad1682bd71',
'messageAttributes': {},
'messageId': '0514edc1-2048-4b12-8cc0-d6938d07101c',
'receiptHandle': 'AQEBGxDrjg2DP0ZlWNYqU8BPJw...rUypH+3eCaH52+ie/xzg=='
}
]
}
El código fuente completo lo dejo en mi Github
Autor: Eduardo A. F.
Publicado: 22-04-2021 22:17
Actualizado: 22-04-2021 22:20