Как отфильтровать сообщения 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"
}
Другие вопросы по тегам