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

时间:2020-07-16 12:48:41

标签: amazon-web-services amazon-sqs serverless-framework

我正在尝试使用无服务器框架创建一个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

2 个答案:

答案 0 :(得分:0)

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

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

enter image description here

答案 1 :(得分:0)

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

当您配置 SQS 以触发 Lambda 时,应该在 SQS 上配置 DLQ(因为它不是异步调用)。 请注意链接中的“注意”部分 Source

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

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

maxReceiveCount 根据 AWS 文档设置为 5。