You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 02:59:58