问题描述
我试图通过CloudFormation在SNS和Lambda之间的订阅中添加DLQ,以捕获无法传递的消息。
我设法通过以下方式实现这一目标:
我不得不创建这两个资源,因为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 (将#修改为@)