AWS:使用CloudFormation将死信队列DLQ附加到发布到Lambda的SNS的正确方法

问题描述

我试图通过CloudFormation在SNS和Lambda之间的订阅添加DLQ,以捕获无法传递的消息。

我设法通过以下方式实现这一目标:

  1. 在Lambda CloudFormation中创建SNS“事件”属性
  2. 使用DLQ为RedrivePolicy创建SNS订阅,并且该终结点与SNS相同。

我不得不创建这两个资源,因为Lambda SNS Events属性没有DLQ的属性

这是正确的方法吗?我需要同时配置SNSEvent 订阅,这感觉不对。但这是我发现的唯一方法,它使我可以将DLQ附加到SNS订阅中。

如果我们仅使用订阅但未在Lambda中配置SNSEvent,该怎么办。如果我们在Lambda中实现了通用处理程序,我们能否使其正常工作?

相关的CloudFormation配置如下:

 # ReceivedRequestSNS Role
   ReceivedRequestsSNS:
     Type: AWS::SNS::Topic
     Properties:
       TopicName: !Sub
         - ${StackName}-ReceivedRequests-${Stage}
         - StackName: !Ref AWS::StackName
           Stage: !Ref Stage 

   # DLQ for SNS 
   ReceivedRequestsSNSDLQ:
     Type: AWS::SQS::Queue
     Properties:
       QueueName:  {"Fn::Sub": "${AWS::StackName}-ReceivedRequestsDLQ"}
       MessageRetentionPeriod: 1209600
       VisibilityTimeout: 5

   # Subscription
   ReceivedRequestsToLambdaSuscription:
     Type: AWS::SNS::Subscription
     Properties:
       Protocol: lambda
       Endpoint: !Sub
         - ${LambdaArn}:live
         - { LambdaArn: !GetAtt TrainingNotificationsRequestsHandler.Arn }
       RedrivePolicy:
         deadLetterTargetArn : !GetAtt ReceivedRequestsSNSDLQ.Arn
       TopicArn: !Ref ReceivedRequestsSNS

   # DLQ Policy
   ReceivedRequestsSNSDLQPolicy:
     Type: AWS::SQS::QueuePolicy
     Properties:
       PolicyDocument:
         Version: "2012-10-17"
         Statement:
           -   
             Effect: Allow
             Principal: "*" 
             Action: sqs:SendMessage
             Resource: !GetAtt ReceivedRequestsSNSDLQ.Arn
       Queues:
         - !Ref ReceivedRequestsSNSDLQ

[...]

   TrainingNotificationsRequestsHandler:
     Type: AWS::Serverless::Function
     Properties:
       Handler: 'com.test.traininglambda.lambda.handlers.TrainingNotificationRequestsHandler::handleRequest'
       Runtime: java8
       DeadLetterQueue:
         Type: SQS 
         TargetArn: !GetAtt TrainingNotificationsRequestsHandlerDLQ.Arn
       Events:
         SNSEvent:
           Type: SNS 
           Properties:
             Topic: !Ref ReceivedRequestsSNS

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)