Как отфильтровать сообщения SNS, отправленные Elasticache?
Мне нужно отслеживать группу репликации Elasticache с помощью SNS + Pagerduty. Проблема в том, что Elasticache отправляет все события в сконфигурированный sns arn без разграничения, является ли это серьезным событием, таким как ElastiCache:SnapshotFailed, или обычным, как ElastiCache:CacheClusterParametersChanged.
Я попытался прикрепить политику фильтрации к подписке на тему, к сожалению, фильтрация работает только для сообщений, которые содержат поле "MessageAttributes", как указано в https://docs.aws.amazon.com/sns/latest/dg/message-filtering.html. Так что это не работает для меня.
Сообщение, отправленное Elasticache, выглядит так:
{
"Type" : "Notification",
"MessageId" : "93cc4ffe-bbd7-521e-8dd1-1c25d437dc1b",
"TopicArn" : "arn:aws:sns:eu-central-1:custid:redis-monitor-a",
"Message" : "{\"ElastiCache:SnapshotComplete\":\"redis-a-001\"}",
"Timestamp" : "2018-08-01T08:21:52.610Z",
"SignatureVersion" : "1",
"Signature" : "aaabbbccc",
"SigningCertURL" : "xxxbbbzzz",
"UnsubscribeURL" : "yyyzzzaaa"
}
2 ответа
Как вы правильно заметили, фильтрация сообщений SNS работает на основе атрибутов сообщений.
Таким образом, в основном, если эластичная боль не устанавливает какие-либо атрибуты MessageAttributes, тогда фильтрация сообщений не может быть выполнена
Единственный оставленный вариант - читать сообщения подписчиков, а затем игнорировать те, которые вам не нужны
Для тех, кто придет к этому, как я, в 2023 году теперь можно фильтровать события Elasticache.
Теперь вы можете настроить политику фильтрации подписки так, чтобы ее область действия составлялаMessage body
и вы можете установить политику примерно так
{
"ElastiCache:SnapshotComplete": [
{
"exists": false
}
]
}
Это позволит отфильтровать все события, в теле сообщения которых есть «ElastiCache:SnapshotComplete».
если вы используете терраформ, это примерно так
resource "aws_sns_topic_subscription" "sns_subscription" {
filter_policy = jsonencode({
"ElastiCache:SnapshotComplete" = [{ "exists" : false }]
})
filter_policy_scope = "MessageBody"
}