SNS中消息的正则表达式过滤

时间:2018-05-14 10:41:22

标签: regex amazon-web-services

有没有办法根据AWS SNS 中的 Regex 或子字符串过滤消息?

AWS Documentation for filtering messages提到三种类型的字符串过滤:

  • 完全匹配(白名单)
  • 任何 - 但匹配(黑名单)
  • 前缀匹配

我想根据消息中的子字符串过滤掉消息,例如

我有一个S3事件,当一个新对象添加到S3时,它向SNS发送一条消息,消息内容如下:

{
    "Records": [
        {
            "s3": {
                "bucket": {
                    "name": "images-bucket"
                },
                "object": {
                    "key": "some-key/more-key/filteringText/additionaldata.png"
                }
            }
        }
    ]
}

如果 key 字段中只有 filteringText ,我想保留这些消息。

注意:整个邮件由S3通知服务作为文本发送,因此Records不是json对象而是字符串。

1 个答案:

答案 0 :(得分:4)

根据我在文档中看到的内容,您无法进行正则表达式匹配或子字符串,但您可以匹配前缀并在MessageAttributes字段中创建自己的属性。

为此,我将S3事件发送到一个简单的Lambda,它添加MessageAttributes然后发送给SNS。

实际上,S3 - > Lambda - > SNS - >其他消费者(带过滤)。

Lambda可以做这样的事情(你必须以编程方式决定何时添加属性):

let messageAttributes = {
                    myfilterkey: {DataType: "String", StringValue:"filteringText"}
                };
let params = {
                    Message: JSON.stringify(payload),
                    MessageAttributes: messageAttributes,
                    MessageStructure: 'json',
                    TargetArn: SNS_ARN
                };
await sns.publish(params).promise();

然后在SNS中你可以过滤:

{"myfilterkey": ["filtertext"]}

将Lambda放在那里似乎有点令人费解,但我喜欢能够即时插入和拔出SNS消费者的想法,并使用过滤来确定谁得到了什么。