SNS订阅带DLQ的SQS部署后未生效,求排查原因
问题成因与修复方案
你的问题核心是SQS队列缺少授权SNS主题发送消息的权限策略。
AWS SNS与SQS的订阅关系生效需要两个条件:
- 存在
AWS::SNS::Subscription资源,关联SNS主题和SQS队列; - SQS队列有明确的权限策略,允许对应的SNS主题向其发送消息。
你当前的配置只满足第一个条件,缺少第二个关键配置。虽然CloudFormation会创建订阅记录,但SNS没有权限推送消息到SQS,导致订阅看似存在但无法工作。而手动添加订阅时,AWS控制台会自动帮你生成这个权限策略,所以手动操作后能正常工作。
修复配置
你需要给SQS队列添加权限策略,有两种实现方式:
方式1:在Queue资源内直接添加Policy属性
修改Queue资源的Properties,新增Policy配置:
Queue: Type: AWS::SQS::Queue Properties: QueueName: !Sub ${Env}-queue VisibilityTimeout: 300 MessageRetentionPeriod: 1209600 ReceiveMessageWaitTimeSeconds: 20 RedrivePolicy: deadLetterTargetArn: !GetAtt Dlq.Arn maxReceiveCount: 5 # 新增权限策略 Policy: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: sns.amazonaws.com Action: sqs:SendMessage Resource: !GetAtt Queue.Arn Condition: ArnEquals: aws:SourceArn: !Ref SnsTopic
方式2:创建独立的QueuePolicy资源
在模板中新增AWS::SQS::QueuePolicy资源:
QueuePolicy: Type: AWS::SQS::QueuePolicy Properties: Queues: - !Ref Queue PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: sns.amazonaws.com Action: sqs:SendMessage Resource: !GetAtt Queue.Arn Condition: ArnEquals: aws:SourceArn: !Ref SnsTopic
额外提示
你当前的TestSubscription资源中的DependsOn可以省略,因为!Ref SnsTopic和!GetAtt Queue.Arn已经会自动创建资源间的依赖关系,CloudFormation会确保先创建SNS、SQS再创建订阅。
内容的提问来源于stack exchange,提问作者godot
相关产品推荐
相关产品推荐

