You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SNS订阅带DLQ的SQS部署后未生效,求排查原因

问题成因与修复方案

你的问题核心是SQS队列缺少授权SNS主题发送消息的权限策略。

AWS SNS与SQS的订阅关系生效需要两个条件:

  1. 存在AWS::SNS::Subscription资源,关联SNS主题和SQS队列;
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 04:11:20