【问题标题】:aws cloudformation template sns sqsaws cloudformation 模板 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 模板创建的订阅属性与控制台创建的属性进行比较。它们完全相同。

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation amazon-sqs amazon-sns


    【解决方案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 队列需要明确的策略文档。相反,它表示只有在进行跨区域订阅时才需要它。
    猜你喜欢
    • 2021-08-12
    • 2018-09-06
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 2017-05-16
    • 2017-12-14
    相关资源
    最近更新 更多