有没有办法根据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对象而是字符串。
答案 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消费者的想法,并使用过滤来确定谁得到了什么。