【问题标题】:Serverless Framework how to create an AWS SQS DeadLetter queue?无服务器框架如何创建 AWS SQS 死信队列?
【发布时间】:2022-02-03 02:38:24
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    迟到总比没有好。希望这可以帮助您或寻找此问题的人。

    当您配置 SQS 以触发 Lambda 时,应该在 SQS 上配置 DLQ(因为它不会是异步调用)。 注意链接中的“注意”部分 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。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我了解,但是如何使用无服务器框架配置为 DLQ?我不想手动编辑我的主队列并将 dlq 添加到其中
      • 您的主队列,即触发 lambda 的队列不能是 DLQ,这将创建一个竞争条件,其中错误将消息放回队列,再次触发 lambda 产生相同的错误。您必须创建一个新队列并将其用作 DLQ。
      • @Ani,如果答案确实解决了您的问题,您介意接受吗。这样,其他偶然发现此问题的人可以轻松找到解决方案。干杯。
      • 消息停留在主队列中,并在函数上抛出错误,消息不会进入 dlq
      猜你喜欢
      • 2022-11-21
      • 2016-08-18
      • 1970-01-01
      • 2021-02-01
      • 2020-02-14
      • 2022-07-22
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多