
Как создать пользовательские журналы для приложений 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: Обеспечивает форматированные оповещения на указанный канал.
Рабочий процесс:
- Приложения отправляют журналы в CloudWatch с маркерами (например,,
[CRITICAL]
) - CloudWatch запускает функцию Lambda через подписку.
- 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
Чтобы включить слабые уведомления:
- Создать приложение Slack на
api.slack.com/apps
и включить входящие веб -крючки. - Генерировать URL -адрес веб -крюка для целевого канала (например,,
#app-alerts
) - Храните 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:
- Перейдите к группе журналов в консоли CloudWatch.
- Создайте фильтр с такими шаблонами, как
[CRITICAL]
или[ALERT]
Полем - Установите функцию Lambda в качестве пункта назначения.
- Проверьте, отправляя журналы с маркерами и проверяя уведомления о слабых и записях 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.
Оригинал