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 为 Lambda 创建 Cloudformation 日志警报