我正在尝试向 SNS 主题的现有订阅添加过滤器。当我使用云形成模板部署堆栈时,它给了我错误 -
“无效参数:属性原因:具有不同属性的订阅已存在”
我能够通过删除然后使用过滤器重新创建订阅来部署它,但这似乎不是最佳方法,特别是对于生产环境。
有什么建议我可以克服这个错误吗?
早些时候我使用下面的代码在没有订阅的情况下进行部署 -
abcSNSSubscription:
Type: 'AWS::SNS::Subscription'
DependsOn: abcSNSTopic
Properties:
Endpoint: !Ref SNSEmailSubscriptionEndpoint
Protocol: email
TopicArn: !Join
- '-'
- - !Sub "arn:aws:sns:${AWS::Region}:${AWS::AccountId}"
- abc-loader-alert
- !Ref Environment
- !Ref Region
下面是我现在使用的代码-
abcSNSSubscription:
Type: 'AWS::SNS::Subscription'
DependsOn: abcSNSTopic
Properties:
Endpoint: !Ref SNSEmailSubscriptionEndpoint
Protocol: email
TopicArn: !Join
- '-'
- - !Sub "arn:aws:sns:${AWS::Region}:${AWS::AccountId}"
- abc-loader-alert
- !Ref Environment
- !Ref Region
FilterPolicy:
AlertType:
- anything-but:
- Success
FilterPolicyScope: MessageAttributes
谢谢
我正在为将来可能遇到此问题的任何人回答我的帖子。
我就这个问题联系了 AWS 支持人员,他们说如果使用 cloudformation 模板进行更新,这是更改 SNS 主题的任何订阅属性的预期行为。
例如,如果您在没有过滤策略的情况下部署了 SNS 主题的订阅。但在稍后阶段,您想要为订阅添加过滤策略,但您将无法使用 cloudformation 来做到这一点,因为 AWS 不会用新属性替换订阅。我会错误提示“订阅已存在且具有不同的属性”,并且不会让您直接更新它。
如果您想更新订阅而不完全删除它然后重新部署,则需要使用 SNS API 使用新属性更新订阅。
我不确定为什么 AWS 对 SNS 订阅有这样的行为。