He estado usando terraform para definir algunos temas de SNS y luego colas SQS para suscribirme a ellos, estas colas luego tienen lambdas que son activadas por SQS y recogen los mensajes de esas colas.
Terraform maneja la creación de temas de SNS, colas de SQS y las políticas que permiten a SNS escribir mensajes en la cola. Las lambdas se implementan por separado a través de la herramienta CLI sin servidor.
Todo esto parece funcionar bien cuando ejecuté terraform primero y luego implementé las lambdas. Sin embargo, tuve algunos problemas con algo que había hecho en terraform, así que decidí derribar toda la infraestructura y recrearla, lo que nuevamente pareció funcionar bien.
Mirando las lambdas, que nunca se eliminaron, todavía tenían el enlace a la cola que se mostraba en el portal como era de esperar. Si fui a la nueva cola de SQS, pude ver que enumeraba la lambda correctamente en la pestaña 'Lambda Triggers'.
Sin embargo, el problema era que no se recogían mensajes, podía verlos acumularse en las colas. La única forma que encontré para desbloquear el problema fue ingresar a cada lambda, seleccionar la cola SQS y alternarlas todas a 'deshabilitado' y luego a 'habilitado' nuevamente. En este punto, todos comenzaron a procesar los mensajes que se habían sentado en las colas.
Alguien más ha experimentado esto? ¿Hay una mejor manera de hacer que se 'reasocien' con las colas correctamente cuando se vuelvan a crear?
A mi también me ha picado esto. La interfaz de usuario se esconde demasiado aquí. Cuando crea una suscripción entre SQS y Lambda, se crea una asignación de origen de eventos. Con la CLI puedes ver esto:
$ aws lambda list-event-source-mappings --function-name sqs-lambda { "EventSourceMappings": [ { "UUID": "8b182e29-f8b4-4637-b4fa-079923ec0bf9", "BatchSize": 10, "EventSourceArn": "arn:aws:sqs:us-west-2:123456789:lamba-sqs-queue", "FunctionArn": "arn:aws:lambda:us-west-2:123456789:function:sqs-lambda", "LastModified": "2020-04-24T15:43:28.192000-06:00", "State": "Enabled", "StateTransitionReason": "USER_INITIATED" } ] }Pero si elimino la cola y la vuelvo a crear, aunque tanto la cola SQS como Lambda tengan el mismo ARN, la asignación no es válida.
La forma en que lo hice es eliminar primero el mapeo de la fuente del evento:
aws lambda delete-event-source-mapping --uuid <uuid-of-your-mapping>y luego recrearlo:
aws lambda create-event-source-mapping --event-source-arn arn:aws:sqs:us-west-2:123456789:lamba-sqs-queue --function-name sqs-lambdaSin embargo , tenga en cuenta que, al igual que tarda un minuto más o menos hasta que pueda volver a crear una cola de SQS con el mismo nombre, lleva un minuto más o menos hasta que pueda volver a crear la asignación del origen del evento.