Home Ciencia y Tecnología Cómo crear registro personalizado para aplicaciones AWS con integración Slack

Cómo crear registro personalizado para aplicaciones AWS con integración Slack

34
0

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:

  1. Las aplicaciones envían registros a CloudWatch con marcadores (por ejemplo, [CRITICAL]).
  2. CloudWatch desencadena una función Lambda a través de un filtro de suscripción.
  3. 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 o winston 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 y timestamp.

Paso 3: Configure Slack Webhook

Para habilitar las notificaciones de Slack:

  1. Crear una aplicación Slack en api.slack.com/apps y habilite los webhooks entrantes.
  2. Genere una URL webhook para el canal de destino (por ejemplo, #app-alerts).
  3. 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:

  1. Navegue al grupo de registro en la consola CloudWatch.
  2. Crear un filtro con un patrón como [CRITICAL] o [ALERT].
  3. Establezca la función lambda como destino.
  4. 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.

fuente