El registro efectivo es basic para monitorear y resolver problemas de aplicaciones implementadas en AWS. Sin embargo, con altos volúmenes de registro, identificar problemas críticos en CloudWatch puede ser un desafío. La integración de registros con herramientas de comunicación del equipo como Slack y Storing For Audits puede agilizar la respuesta y el cumplimiento de los incidentes. Este artículo describe cómo crear un sistema de registro personalizado que utiliza AWS Lambda para filtrar registros con marcadores específicos, enviar notificaciones de holgura en tiempo actual y almacenar registros en DynamodB. Este enfoque, nacido de la necesidad de detectar y actuar rápidamente sobre errores críticos, proporciona una solución escalable para aplicaciones basadas en AWS.
La necesidad de registro personalizado
AWS CloudWatch recopila eficientemente registros, pero su amplio alcance puede oscurecer los eventos críticos. Los equipos a menudo confían en Slack para la colaboración, lo que lo convierte en un destino best para alertas urgentes. Un sistema de registro personalizado aborda esto por:
- Filtrado de registros basados en marcadores como
[CRITICAL]
o[ALERT]
. - Enviar notificaciones inmediatas a un canal de holgura designado.
- Almacenamiento de registros filtrados en una base de datos para auditoría y análisis.
- Operando como un componente AWS separado para la modularidad.
Este sistema se desarrolló después de que un error de base de datos crítico pasó desapercibido en CloudWatch, lo que provocó la necesidad de una detección más rápida y una notificación del equipo.
Arquitectura del sistema
La arquitectura aprovecha los servicios sin servidor AWS y la API webhook de Slack:
- Logs de CloudWatch: Recopila registros sin procesar de aplicaciones.
- AWS Lambda: Procesa registros, filtros por marcadores, envía notificaciones flojas y escribe a la base de datos.
- Amazon Dynamodb: Tiendas de registros filtrados para persistencia (RDS es una alternativa para las necesidades relacionales).
- Slack Webhook: Ofrece alertas formateadas a un canal especificado.
Flujo de trabajo:
- Las aplicaciones envían registros a CloudWatch con marcadores (por ejemplo,
[CRITICAL]
). - CloudWatch desencadena una función Lambda a través de un filtro de suscripción.
- Lambda filtra los registros, envía notificaciones a Slack y almacena datos en DynamoDB.
La arquitectura se puede visualizar como:
[Application] → [CloudWatch Logs] → [Lambda] → [Slack]
↓
[DynamoDB]
Pasos de implementación
Los siguientes pasos asumen una cuenta de AWS, un espacio de trabajo flojo y familiaridad con los servicios de AWS. La función Lambda usa Python, aunque se puede adaptar a otros tiempos de ejecución.
Paso 1: Configurar registros de CloudWatch
Asegúrese de que las aplicaciones envíen registros a CloudWatch usando:
- AWS SDK (por ejemplo,
boto3
para Python). - Registro de bibliotecas como
python-logging
owinston
con integración de CloudWatch. - Agente CloudWatch para registros del sistema EC2.
Crear un grupo de registro (por ejemplo, /aws/app/myapp
) e incluye marcadores en registros, como:
2025-06-29T10:00:00Z [INFO] Person login profitable
2025-06-29T10:01:00Z [CRITICAL] Database connection failed
Paso 2: crea la función lambda
Configure una función Lambda en la consola AWS:
- Tiempo de ejecución: Python 3.9 o posterior.
- Papel de iam: Permisos de subvención para los registros de CloudWatch, DynamoDB y Secrets and techniques Supervisor.
- Se acabó el tiempo: 30 segundos.
- Memoria: 128 MB.
A continuación se muestra el código Lambda:
import json
import base64
import zlib
import boto3
import requests
from datetime import datetime
def lambda_handler(occasion, context):
# Decode CloudWatch log information
log_data = base64.b64decode(occasion['awslogs']['data'])
log_json = json.hundreds(zlib.decompress(log_data, 16+zlib.MAX_WBITS))
# Initialize shoppers
slack_webhook = " # Use Secrets and techniques Supervisor
dynamodb = boto3.useful resource('dynamodb')
desk = dynamodb.Desk('AppLogs')
# Course of log occasions
for occasion in log_json['logEvents']:
message = occasion['message']
if '[CRITICAL]' in message or '[ALERT]' in message:
# Ship Slack notification
marker = 'CRITICAL' if '[CRITICAL]' in message else 'ALERT'
slack_payload = {
"textual content": f"{marker} Log: {message}",
"channel": "#app-alerts",
"username": "AWS Logger",
"icon_emoji": ":aws:"
}
requests.submit(slack_webhook, json=slack_payload)
# Retailer in DynamoDB
desk.put_item(
Merchandise={
'log_id': str(occasion['id']),
'timestamp': datetime.utcfromtimestamp(occasion['timestamp']/1000).isoformat(),
'marker': marker,
'message': message,
'app_name': log_json['logStream']
}
)
return {
'statusCode': 200,
'physique': json.dumps('Logs processed')
}
Detalles:
- La función decodifica los datos de registro de CloudWatch comprimidos.
- Filtra registros con
[CRITICAL]
o[ALERT]
marcadores. - Las notificaciones se envían a Slack con el marcador y el mensaje.
- Los registros se almacenan en DynamodB con metadatos como
log_id
ytimestamp
.
Paso 3: Configure Slack Webhook
Para habilitar las notificaciones de Slack:
- Crear una aplicación Slack en
api.slack.com/apps
y habilite los webhooks entrantes. - Genere una URL webhook para el canal de destino (por ejemplo,
#app-alerts
). - Almacene la URL en AWS Secrets and techniques Supervisor para la seguridad.
Prueba el webhook:
curl -X POST -H 'Content material-type: software/json'
--data '{"textual content":"Check alert from AWS"}'
Paso 4: Configurar DynamodB
Crear una tabla DynamodB llamada AppLogs
con:
- Clave de partición:
log_id
(Cadena). - Atributos:
timestamp
,marker
,message
,app_name
.
Use la capacidad a pedido de escalabilidad. Alternativamente, use Amazon RDS para el almacenamiento relacional.
Paso 5: Conectar componentes
Agregue un filtro de suscripción de registros de CloudWatch:
- Navegue al grupo de registro en la consola CloudWatch.
- Crear un filtro con un patrón como
[CRITICAL]
o[ALERT]
. - Establezca la función lambda como destino.
- Pruebe enviando registros con marcadores y verificando notificaciones flojas y entradas DynamodB.
Consideraciones de seguridad
Para asegurar el sistema:
- Almacenamiento de webhook: Almacene la URL Slack Webhook en AWS Secrets and techniques Supervisor. Actualizar lambda para recuperarlo:
secrets_client = boto3.shopper('secretsmanager')
slack_webhook = secrets_client.get_secret_value(SecretId='SlackWebhook')['SecretString']
- Permisos de iam: Asigne permisos de menos privilegios para los registros de CloudWatch (
logs:CreateLogStream
,logs:PutLogEvents
), Dynamodb (dynamodb:PutItem
), y Secrets and techniques Supervisor (secretsmanager:GetSecretValue
). - Desinfectación de registros: Elimine datos confidenciales de registros antes de enviar a Slack o Storing.
- Encriptación: Habilitar el cifrado para DynamodB y use HTTPS para Slack.
Mejoras
El sistema puede extenderse por:
- Agregar marcadores (por ejemplo,
[INFO]
) para diferentes canales. - Integrándose con PagerDuty o Jira para el seguimiento de incidentes.
- Uso de Amazon SNS para alertas de múltiples destino.
- Visualizando registros con paneles CloudWatch o Grafana.
Conclusión
Este sistema de registro personalizado, construido con AWS Lambda, CloudWatch, DynamoDB y Slack, mejora el monitoreo filtrando registros críticos, notificando a los equipos en tiempo actual y almacenando datos para auditorías. Es una solución práctica y escalable para aplicaciones AWS.