无服务器框架如何创建 AWS SQS 死信队列?

Serverless Framework how to create an AWS SQS DeadLetter queue?

我正在尝试使用无服务器框架创建 AWS SQS 死信队列
这个想法是让一个SQS来触发一个Lambda函数,
并将另一个 SQS 作为 DeadLetterQueue,即。在 Lambda 失败或超时的情况下接收消息

我做了以下创建一个测试项目-

mkdir dlq
cd dlq/
serverless create --template aws-nodejs

以下是我的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: dlq

我也尝试了以下-

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

但是在这两种情况下,框架只是创建一个普通的 SQS

我正在关注此文档 -
https://www.serverless.com/plugins/serverless-plugin-lambda-dead-letter

为了给您一些背景知识,死信队列就是一个普通的 SQS 队列。它是 AWS Lambda 的配置,它通知它在处理消息时只要出现任何错误就将消息推送到此队列。

您可以在管理控制台中参考“异步调用”下的“死信队列服务”进行验证

迟到总比不到好。希望这对您或搜索此问题的人有所帮助。

当您配置 SQS 以触发 Lambda 时,DLQ 应该在 SQS 上配置(因为它不会是异步调用)。 注意 link 中的 'Note' 部分 Source

因此您的 serverless.yaml 需要在主队列中声明 ReddrivePolicy 以引用 DLQ。 (下)

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: dlq

根据 AWS 文档,maxReceiveCount 设置为 5。