通过CloudFormation配置SNS过滤策略遇null值限制问题求助
绕过CloudFormation中SNS过滤器不支持null值的限制
你遇到的是CloudFormation的模板语法硬限制:模板内不允许直接使用null字面量,但SNS过滤器需要匹配null值来实现你的需求。这里提供两个可行的解决思路:
方法一:利用DynamoDB字段存在性过滤(推荐)
DynamoDB的NewImage有个特性:当字段值为null时,该字段不会出现在NewImage结构中。因此你可以反过来过滤存在parentId字段的消息,间接实现排除null值的目的。
修改后的CloudFormation订阅配置如下:
SNSSubscription: Type: AWS::SNS::Subscription Properties: Protocol: sqs TopicArn: !ImportValue !Sub MyTopic Endpoint: !GetAtt MySQS.Arn RawMessageDelivery: true FilterPolicyScope: MessageBody FilterPolicy: Records: dynamodb: NewImage: parentId: exists: true
这个配置的逻辑是:只有当NewImage中存在parentId字段时,消息才会被推送到你的SQS队列。而只有parentId为非null值时,DynamoDB才会在NewImage中包含该字段,正好满足你的需求。
方法二:通过字符串构造注入null值
如果一定要使用anything-but规则,可以通过CloudFormation的字符串函数构造包含null的JSON,绕开模板的null限制。示例如下:
SNSSubscription: Type: AWS::SNS::Subscription Properties: Protocol: sqs TopicArn: !ImportValue !Sub MyTopic Endpoint: !GetAtt MySQS.Arn RawMessageDelivery: true FilterPolicyScope: MessageBody FilterPolicy: !Sub | { "Records": { "dynamodb": { "NewImage": { "parentId": { "S": {"anything-but": [null]} } } } } }
这里用!Sub将FilterPolicy定义为字符串形式,CloudFormation会将其解析为JSON对象,从而允许null值存在。不过这种方式可读性稍差,不如方法一简洁可靠。
内容的提问来源于stack exchange,提问作者Yara
相关产品推荐
相关产品推荐

