Estoy tratando de crear una cola de mensajes fallidos de AWS SQS, utilizando el marco sin servidor
La idea es tener un SQS para activar una función Lambda,
y tener otro SQS como DeadLetterQueue, es decir. para recoger el mensaje en caso de que Lambda falle o supere el tiempo de espera
Hice lo siguiente para crear un proyecto de prueba:
mkdir dlq cd dlq/ serverless create --template aws-nodejsLo siguiente es mi serverless.yaml -
service: dlq provider: name: aws runtime: nodejs12.x region: ap-southeast-1 role: arn:aws:iam::xxxx:role/dlqLambdaRole plugins: - serverless-plugin-lambda-dead-letter functions: dlq: handler: handler.hello events: - sqs: arn: Fn::GetAtt: - MainQueue - Arn deadLetter: targetArn: GetResourceArn: DeadLetterQueue resources: Resources: MainQueue: Type: AWS::SQS::Queue Properties: QueueName: main DeadLetterQueue: Type: AWS::SQS::Queue Properties: QueueName: dlqTambién probé lo siguiente:
service: dlq provider: name: aws runtime: nodejs12.x region: ap-southeast-1 role: arn:aws:iam::xxxx:role/dlqLambdaRole plugins: - serverless-plugin-lambda-dead-letter functions: dlq: handler: handler.hello events: - sqs: arn: Fn::GetAtt: - MainQueue - Arn deadLetter: sqs: dlq resources: Resources: MainQueue: Type: AWS::SQS::Queue Properties: QueueName: main Pero en ambos casos, el marco solo está creando un SQS normal
Estoy siguiendo este documento -
https://www.serverless.com/plugins/serverless-plugin-lambda-dead-letter
Mejor tarde que nunca. Espero que esto te ayude a ti o a alguien que esté buscando este problema.
Cuando configura SQS para activar Lambda, se supone que DLQ debe configurarse en SQS (ya que no sería una invocación asincrónica). Observe la sección 'Nota' en el enlace Fuente
Por lo tanto, su serverless.yaml debe declarar ReddrivePolicy en la cola principal para hacer referencia a la DLQ. (Abajo)
service: dlq provider: name: aws runtime: nodejs12.x region: ap-southeast-1 role: arn:aws:iam::xxxx:role/dlqLambdaRole functions: dlq: handler: handler.hello events: - sqs: arn: Fn::GetAtt: - MainQueue - Arn deadLetter: targetArn: GetResourceArn: DeadLetterQueue resources: Resources: MainQueue: Type: AWS::SQS::Queue Properties: QueueName: main RedrivePolicy: deadLetterTargetArn: Fn::GetAtt: - "DeadLetterQueue" - "Arn" maxReceiveCount: 5 DeadLetterQueue: Type: AWS::SQS::Queue Properties: QueueName: dlqmaxReceiveCount se establece en 5 según la documentación de AWS.
Para brindarle algunos antecedentes, Dead Letter Queue es solo eso, una cola SQS normal. es la configuración en AWS Lambda la que le informa que envíe un mensaje a esta cola siempre que haya algún error al procesar el mensaje.
Puede verificar esto desde la consola de administración consultando el "Servicio de cola de mensajes fallidos" en "Invocación asíncrona"