Из того, что я видел в документации, вы не можете делать регулярные выражения или подстроки, но вы можете сопоставлять префиксы и создавать свои собственные атрибуты в поле MessageAttributes.
Для этого я отправляюсобытие S3 для простой лямбды, которая добавляет 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 на лету и использовать фильтрацию, чтобы определить, кто что получает.