Интеграция SNS и SQS с CloudWatch

Мониторинг и устранение неполадок в AWS

John Q. Martin

Principal Consultant

Подключение сигналов CloudWatch к SNS

aws cloudwatch put-metric-alarm \
  --alarm-name HighCPUUtilization \
  --metric-name CPUUtilization \
  --namespace AWS/EC2 \
  --statistic Average \
  --period 300 \
  --evaluation-periods 2 \
  --threshold 80 \
  --comparison-operator GreaterThanThreshold \
  --alarm-actions arn:aws:sns:us-east-1:123456789012:production-alerts \
  --ok-actions arn:aws:sns:us-east-1:123456789012:recovery-notifications

 

Схема: сигнал CloudWatch Alarm передаётся через --alarm-actions в топик SNS, который рассылает сообщения подписчикам — Email, SMS, Lambda и SQS

Мониторинг и устранение неполадок в AWS

Основные концепции SNS

Компоненты

  • SNS — модель публикации/подписки: топики, издатели, подписчики
  • Топик — именованный канал; издатели отправляют, подписчики получают
  • Одна публикация — одновременная доставка всем подписчикам

Протоколы подписки (один топик — множество получателей):

  • Email, SMS
  • HTTP / HTTPS
  • Lambda, SQS
  • Мобильные push-уведомления, Kinesis Firehose
Мониторинг и устранение неполадок в AWS

Типы топиков SNS

 

Сравнение типов топиков SNS: Standard и FIFO — по упорядоченности, пропускной способности и гарантиям доставки

Мониторинг и устранение неполадок в AWS

Создание топиков SNS через AWS CLI

Стандартный топик

aws sns create-topic \
  --name production-alerts

Топик FIFO

aws sns create-topic \
  --name production-alerts.fifo \
  --attributes FifoTopic=true,\
    ContentBasedDeduplication=true

С шифрованием

aws sns create-topic \
  --name production-alerts \
  --attributes KmsMasterKeyId=alias/aws/sns
Мониторинг и устранение неполадок в AWS

Добавление подписчиков Lambda и SMS

 

Lambda

aws sns subscribe \
  --topic-arn arn:aws:sns:us-east-1:123456789012:production-alerts \
  --protocol lambda \
  --notification-endpoint arn:aws:lambda:us-east-1:123456789012:function:ProcessAlert

SMS

aws sns subscribe \
  --topic-arn arn:aws:sns:us-east-1:123456789012:critical-alerts \
  --protocol sms \
  --notification-endpoint +1234567890
Мониторинг и устранение неполадок в AWS

Формат сообщения SNS от сигналов CloudWatch

{
  "AlarmName": "HighCPUUtilization",
  "NewStateValue": "ALARM",
  "OldStateValue": "OK",
  "NewStateReason": "Threshold Crossed: 2 datapoints [85.0, 90.0] were greater than the threshold (80.0).",
  "StateChangeTime": "2026-03-27T10:30:45.123+0000",
  "Trigger": {
    "MetricName": "CPUUtilization",
    "Namespace": "AWS/EC2",
    "Statistic": "AVERAGE",
    "Period": 300,
    "Threshold": 80.0,
    "ComparisonOperator": "GreaterThanThreshold"
  }
}
Мониторинг и устранение неполадок в AWS

Фильтрация сообщений SNS

aws sns set-subscription-attributes \
  --subscription-arn arn:aws:sns:...:production-alerts:abc123 \
  --attribute-name FilterPolicy \
  --attribute-value '{"AlarmName":["HighCPUUtilization"],"NewStateValue":["ALARM"]}'

aws sns set-subscription-attributes \
  --subscription-arn arn:aws:sns:...:production-alerts:abc123 \
  --attribute-name FilterPolicyScope \
  --attribute-value MessageBody
Мониторинг и устранение неполадок в AWS

Настройка формата уведомлений с помощью Lambda

def lambda_handler(event, context):
    alarm = json.loads(event['Records'][0]['Sns']['Message'])

    message = f"""
ALERT: {alarm['AlarmName']}
Status: {alarm['NewStateValue']}
Reason: {alarm['NewStateReason']}
Resource: {alarm['Trigger']['Dimensions'][0]['value']}
Runbook: https://wiki.example.com/runbooks/high-cpu
    """

    sns.publish(
        TopicArn='arn:aws:sns:...:formatted-alerts',
        Subject=f"{alarm['AlarmName']}",
        Message=message
    )

 

Цепочка: топик с исходным сигналом передаёт данные в Lambda, которая форматирует читаемое сообщение и публикует его в топик formatted-alerts для дежурного инженера; машинные потребители остаются на исходном топике

Мониторинг и устранение неполадок в AWS

Архитектура веерной рассылки с SQS

Архитектура веерной рассылки: одно сообщение SNS доставляется в несколько очередей SQS и потребителю Lambda

Мониторинг и устранение неполадок в AWS

Настройка веерной рассылки

Четыре шага

  1. Создайте очереди SQS (по одной на потребителя)
  2. Настройте политики очередей (разрешите SNS отправлять сообщения)
  3. Подпишите очереди на топик SNS
  4. Создайте потребителей (опрос, обработка, удаление)

Политика очереди

{
  "Effect": "Allow",
  "Principal": { "Service": "sns.amazonaws.com" },
  "Action": "sqs:SendMessage",
  "Resource": "arn:aws:sqs:...:alarm-logging-queue",
  "Condition": {
    "ArnEquals": {
      "aws:SourceArn": "arn:aws:sns:...:production-alerts"
    }
  }
}
Мониторинг и устранение неполадок в AWS

Подписка очередей

 

Подписка каждой очереди

aws sns subscribe \
  --topic-arn arn:aws:sns:...:production-alerts \
  --protocol sqs \
  --notification-endpoint arn:aws:sqs:...:alarm-logging-queue
Мониторинг и устранение неполадок в AWS

Обработка сообщений

Шаблон потребителя

response = sqs.receive_message(
    QueueUrl=queue_url,
    MaxNumberOfMessages=10,
    WaitTimeSeconds=20       # Long polling
)
for message in response.get('Messages', []):
    sns_msg = json.loads(message['Body'])
    alarm = json.loads(sns_msg['Message'])
    # Process alarm data
    sqs.delete_message(QueueUrl=queue_url,
                       ReceiptHandle=message['ReceiptHandle'])
Мониторинг и устранение неполадок в AWS

Веерная рассылка с фильтрацией и очередями недоставленных сообщений

Адресная доставка по подпискам

  • Очередь тикетов: {"NewStateValue":["ALARM"],"Severity":["Critical"]}
  • Очередь логирования: без фильтра (получает всё)
  • Очередь метрик: {"MessageType":["Metric"]}

 

Очереди недоставленных сообщений (DLQ)

aws sqs set-queue-attributes \
  --queue-url https://sqs..../alarm-logging-queue \
  --attributes '{
    "RedrivePolicy": "{\"deadLetterTargetArn\":\"arn:aws:sqs:...:alarm-logging-dlq\",\"maxReceiveCount\":\"3\"}"
  }'
Мониторинг и устранение неполадок в AWS

SNS и SQS: когда что применять

Сравнение SNS (доставка по модели push) и SQS (очередь сообщений по модели pull)

Мониторинг и устранение неполадок в AWS

Примеры архитектур

 

Простой шаблон оповещения: отправка уведомления SNS по электронной почте

 

Шаблон асинхронной обработки: API отправляет данные в очередь SQS, которую обрабатывает воркер

Шаблон многоканального оповещения: один сигнал рассылается сразу по нескольким каналам уведомлений

Шаблон событийного конвейера: исходное событие маршрутизируется в несколько очередей SQS для обработки

Мониторинг и устранение неполадок в AWS

Итоги урока

 

  • Топики SNS доставляют уведомления о сигналах по email, SMS, HTTP, в Lambda и SQS
  • Шаблон веерной рассылки: одно сообщение SNS → несколько очередей SQS для параллельной надёжной обработки
  • Фильтрация сообщений снижает информационный шум для каждого подписчика
  • Очереди недоставленных сообщений перехватывают сбойные сообщения
  • SNS — для push-уведомлений, SQS — для надёжной обработки, оба — для веерной рассылки с гарантией доставки
Мониторинг и устранение неполадок в AWS

Давайте потренируемся!

Мониторинг и устранение неполадок в AWS

Preparing Video For Download...