aws cloudformation 模板 sns sqs

Posted

技术标签:

【中文标题】aws cloudformation 模板 sns sqs【英文标题】:aws cloudformation template sns sqs 【发布时间】:2021-07-20 06:48:05 【问题描述】:

我在 Cloudformation 堆栈中定义了一个 SNS 主题、一个 SQS 队列和一个 SNS 订阅资源。这三个都在同一个堆栈、同一个区域和同一个 AWS 账户中。

Resources:
  SqsQueue:
    Type: AWS::SQS::Queue
    Properties:
      QueueName: 'some-queue'
  SnsTopic:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: 'some-topic'
  SnsSubscription:
    Type: AWS::SNS::Subscription
    Properties:
      Endpoint: !GetAtt [SqsQueue, Arn]
      Protocol: sqs
      TopicArn: !Ref SnsTopic

当我运行堆栈时,所有三个资源都已成功创建,但是当我从 SNS 发布消息时,SQS 队列从未收到它。

我一直在关注此链接 (https://aws.amazon.com/premiumsupport/knowledge-center/sqs-sns-subscribe-cloudformation/),据我所知,我已经完成了我需要做的一切。我还缺少什么?

谢谢!

其他信息

如果我删除 Cloudformation 通过控制台创建的订阅,然后通过控制台创建一个新订阅,则可以正常发布消息。所以肯定是订阅有问题。

我使用 AWS CLI 将 Cloudformation 模板创建的订阅属性与控制台创建的属性进行比较。它们完全相同。

【问题讨论】:

【参考方案1】:

您需要添加策略以允许 SNS 主题发布到您的队列。像这样的:

  SnsToQueuePolicy:
    Type: AWS::SQS::QueuePolicy
    Properties: 
      Queues:
        - !Ref SqsQueue
      PolicyDocument: 
        Version: '2012-10-17'
        Statement:
          - Sid: allow-sns-messages
            Effect: Allow
            Principal: '*'
            Resource: !GetAtt SqsQueue.Arn
            Action: SQS:SendMessage,
            Condition: 
              ArnEquals:
                aws:SourceArn: !Ref SnsTopic

【讨论】:

添加策略有效。可耻的是 AWS 的文档太差了。它没有提到同一区域和帐户中的 sns 主题和 sqs 队列需要明确的策略文档。相反,它表示只有在进行跨区域订阅时才需要它。

以上是关于aws cloudformation 模板 sns sqs的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AWS CloudFormation 为 SNS 订阅指定“原始消息传递”?

AWS SNS 主题策略 Cloudformation

AWS 为 Lambda 创建 Cloudformation 日志警报

SNS + CloudFormation

是否可以在 cloudformation 模板中创建具有多个电子邮件收件人的 SNS 主题?

如何在AWS CDK Policy Statement AddAction方法中嵌套键值对?