Как создать пользовательские журналы для приложений AWS с Slack Integration

Как создать пользовательские журналы для приложений AWS с Slack Integration

25 июля 2025 г.

Эффективное ведение журнала имеет решающее значение для мониторинга и устранения неполадок, развернутых на AWS. Однако при высоких объемах журнала выявление критических проблем в CloudWatch может быть сложной задачей. Интеграция журналов с такими инструментами коммуникации команды, какПролечитьИ хранение их для аудитов может упростить ответ инцидента и соответствие. В этой статье описывается, как создать пользовательскую систему ведения журнала с использованиемAWS LambdaЧтобы фильтровать журналы с конкретными маркерами, отправьте уведомления в реальном времени и храните журналы в DynamoDB. Этот подход, рожденный от необходимости быстро обнаружить и действовать по критическим ошибкам, обеспечивает масштабируемое решение для приложений на основе AWS.


Необходимость в пользовательской регистрации

AWS CloudWatch эффективно собирает журналы, но его широкий объем может скрывать критические события. Команды часто полагаются на Slack для сотрудничества, что делает его идеальным местом для срочных предупреждений. Пользовательская система регистрации решает это по:


  • Фильтрация журналов на основе маркеров, таких как[CRITICAL]или[ALERT]Полем
  • Отправка немедленных уведомлений на назначенный канал Slack.
  • Хранение фильтрованных журналов в базе данных для аудита и анализа.
  • Работает как отдельный компонент AWS для модульности.


Эта система была разработана после того, как критическая ошибка базы данных осталась незамеченной в CloudWatch, что вызвало необходимость более быстрого обнаружения и уведомления команды.


Системная архитектура


Архитектура использует службы AWS без серверов и Slack Webhook API:

  • CloudWatch журналы: Собирает необработанные журналы из приложений.
  • AWS Lambda: Процесс журналов, фильтров по маркерам, отправляет слабые уведомления и записывается в базу данных.
  • Amazon Dynamodb: Хранит фильтрованные журналы для настойчивости (RDS является альтернативой для реляционных потребностей).
  • Slack Webhook: Обеспечивает форматированные оповещения на указанный канал.


Рабочий процесс:

  1. Приложения отправляют журналы в CloudWatch с маркерами (например,,[CRITICAL])
  2. CloudWatch запускает функцию Lambda через подписку.
  3. Lambda Filters журналы, отправляет уведомления в Slack и хранит данные в DynamoDB.


Архитектура может быть визуализирована как:

[Application] → [CloudWatch Logs] → [Lambda] → [Slack]
                                     ↓
                                 [DynamoDB]


Шаги внедрения

Следующие шаги предполагают учетную запись AWS, слабые рабочее пространство и знакомство с службами AWS. Функция Lambda использует Python, хотя она может быть адаптирована к другим времени выполнения.


Шаг 1: Настройка журналов CloudWatch

Убедитесь, что приложения отправляют журналы в CloudWatch, используя:

  • AWS SDK (например,,boto3для питона).
  • Библиотеки регистрируютсяpython-loggingилиwinstonс интеграцией CloudWatch.
  • Agent Agent для системных журналов EC2.

Создать группу журналов (например,,/aws/app/myapp) и включить маркеры в журналы, такие как:

2025-06-29T10:00:00Z [INFO] User login successful
2025-06-29T10:01:00Z [CRITICAL] Database connection failed


Шаг 2: Создайте функцию лямбды

Установите функцию лямбды в консоли AWS:

  • Время выполнения: Python 3.9 или позже.
  • IAM Роль: Предоставление разрешений для журналов CloudWatch, DynamoDB и Manager Secrets.
  • Тайм -аут: 30 секунд.
  • Память: 128 МБ.


Ниже приведен код Lambda:

import json
import base64
import zlib
import boto3
import requests
from datetime import datetime

def lambda_handler(event, context):
    # Decode CloudWatch log data
    log_data = base64.b64decode(event['awslogs']['data'])
    log_json = json.loads(zlib.decompress(log_data, 16+zlib.MAX_WBITS))
    
    # Initialize clients
    slack_webhook = "https://hooks.slack.com/services/xxx/yyy/zzz"  # Use Secrets Manager
    dynamodb = boto3.resource('dynamodb')
    table = dynamodb.Table('AppLogs')
    
    # Process log events
    for event in log_json['logEvents']:
        message = event['message']
        if '[CRITICAL]' in message or '[ALERT]' in message:
            # Send Slack notification
            marker = 'CRITICAL' if '[CRITICAL]' in message else 'ALERT'
            slack_payload = {
                "text": f"{marker} Log: {message}",
                "channel": "#app-alerts",
                "username": "AWS Logger",
                "icon_emoji": ":aws:"
            }
            requests.post(slack_webhook, json=slack_payload)
            
            # Store in DynamoDB
            table.put_item(
                Item={
                    'log_id': str(event['id']),
                    'timestamp': datetime.utcfromtimestamp(event['timestamp']/1000).isoformat(),
                    'marker': marker,
                    'message': message,
                    'app_name': log_json['logStream']
                }
            )
    
    return {
        'statusCode': 200,
        'body': json.dumps('Logs processed')
    }


Подробности:

  • Функция декодирует сжатые данные журнала CloudWatch.
  • Он фильтрует журналы с[CRITICAL]или[ALERT]маркеры.
  • Уведомления отправляются в Slack с маркером и сообщением.
  • Журналы хранятся в DynamoDB с такими метаданнымиlog_idиtimestampПолем


Шаг 3: Настройка Slack Webhook

Чтобы включить слабые уведомления:

  1. Создать приложение Slack наapi.slack.com/appsи включить входящие веб -крючки.
  2. Генерировать URL -адрес веб -крюка для целевого канала (например,,#app-alerts)
  3. Храните URL в менеджере Secrets Secrets для обеспечения безопасности.


Проверьте веб -крюк:

curl -X POST -H 'Content-type: application/json' \
--data '{"text":"Test alert from AWS"}' \
https://hooks.slack.com/services/xxx/yyy/zzz


Шаг 4: Настройте DynamoDB

Создать таблицу DynamoDB с именемAppLogsс:

  • Ключ раздела: log_id(Нить).
  • Атрибуты:timestampВmarkerВmessageВapp_nameПолем

Используйте емкость по требованию для масштабируемости. В качестве альтернативы используйте Amazon RDS для реляционного хранения.


Шаг 5: подключить компоненты

Добавить подписку на логики CloudWatch:

  1. Перейдите к группе журналов в консоли CloudWatch.
  2. Создайте фильтр с такими шаблонами, как[CRITICAL]или[ALERT]Полем
  3. Установите функцию Lambda в качестве пункта назначения.
  4. Проверьте, отправляя журналы с маркерами и проверяя уведомления о слабых и записях DynamoDB.


Соображения безопасности

Чтобы обеспечить систему:

  • Хранилище Webhook: Храните URL -адрес Webhook Slack в менеджере Secrets Secrets. Обновите лямбду, чтобы получить его:
secrets_client = boto3.client('secretsmanager')
slack_webhook = secrets_client.get_secret_value(SecretId='SlackWebhook')['SecretString']
  • IAM разрешения: Назначить разрешения на наименее привилегии для журналов CloudWatch (logs:CreateLogStreamВlogs:PutLogEvents), DynamoDB (dynamodb:PutItem) и менеджер секретов (secretsmanager:GetSecretValue)
  • Журнать дезинфекции: Удалить конфиденциальные данные из журналов перед отправкой в Slack или хранение.
  • Шифрование: Включить шифрование для DynamoDB и использовать HTTPS для Slack.


Улучшения

Система может быть расширена на:

  • Добавление маркеров (например,,[INFO]) для разных каналов.
  • Интеграция с Pagerduty или Jira для отслеживания инцидентов.
  • Использование Amazon SNS для предупреждений о многоуданах.
  • Визуализация журналов с помощью мониторинга CloudWatch или Grafana.


Заключение

Эта пользовательская система ведения журнала, построенная с AWS Lambda, CloudWatch, DynamoDB и Slack, расширяет мониторинг путем фильтрации критических журналов, уведомляя команды в режиме реального времени и хранение данных для аудитов. Это практическое, масштабируемое решение для приложений AWS.


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE