Essa configuração monitora determinadas métricas de uma tabela DynamoDB e envia uma notificação para um canal Discord se forem detectados eventos de throttling.
Primeiro Passo - Configuração da Lambda
Amostragem geral:
Runtime:
Variáveis de Ambiente:
Resource-based - Policy Statements (Importante para o alarme conseguir triggar a lambda)
Configuração da resource-based policy: (ARN do alarme criado para triggar a lambda)
Permissões necessárias:
Código Lambda:
import json
import boto3
import requests
import os
from datetime import datetime, timedelta
# Configurações do Discord Webhook
DISCORD_WEBHOOK_URL = os.environ['DISCORD_WEBHOOK_URL']
# Cliente boto3 para o CloudWatch
cloudwatch = boto3.client('cloudwatch')
def send_discord_notification(message):
data = {
"content": message
}
response = requests.post(DISCORD_WEBHOOK_URL, json=data)
if response.status_code != 204:
raise ValueError(f"Falha ao enviar notificação para o Discord: {response.status_code}, {response.text}")
def lambda_handler(event, context):
# print("Evento recebido:", json.dumps(event))
print(event)
# Métricas a serem monitoradas
metrics_to_monitor = [
'WriteThrottleEvents',
'ReadThrottleEvents'
]
# Nome da tabela DynamoDB a ser monitorada
table_name = os.environ['TABLE_NAME']
print(f"Tabela a ser monitorada: {table_name}")
for metric_name in metrics_to_monitor:
print(f"Verificando métrica: {metric_name}")
response = cloudwatch.get_metric_statistics(
Namespace='AWS/DynamoDB',
MetricName=metric_name,
Dimensions=[
{
'Name': 'TableName',
'Value': table_name
}
],
StartTime=datetime.utcnow() - timedelta(minutes=5),
EndTime=datetime.utcnow(),
Period=60,
Statistics=['Sum']
)
print(f"Resposta da CloudWatch: {response}")
data_points = response.get('Datapoints', [])
if data_points:
for point in data_points:
print(f"Ponto de dados: {point}")
if point['Sum'] > 0:
message = f"Evento de throttle ({metric_name}) detectado na tabela {table_name} com {int(point['Sum'])} eventos."
print(f"Enviando mensagem para o Discord: {message}")
try:
send_discord_notification(message)
except Exception as e:
print(f"Erro ao enviar notificação para o Discord: {e}")
else:
print("Notificação enviada com sucesso.")
else:
print(f"Nenhum evento de throttle detectado para {metric_name}.")
else:
print(f"Nenhum ponto de dados encontrado para {metric_name}.")
print("Processo de verificação concluído.")
return {
'statusCode': 200,
'body': json.dumps('Notificações enviadas se algum evento de throttle for detectado.')
}
Download Lambda Code [dynamo-throttle-events.zip]
https://github.com/aldeiacloud/DynamoThrottleEvents/raw/refs/heads/main/ecbb053f-e092-4059-b39d-f8f184166e76.zip
-
Função principal (lambda_handler):
- Recebe o evento e o contexto quando acionada.
- Define as métricas a serem monitoradas: WriteThrottleEvents e ReadThrottleEvents.
- Obtém o nome da tabela DynamoDB a ser monitorada a partir das variáveis de ambiente.
- Para cada métrica, consulta o CloudWatch para obter estatísticas sobre eventos de throttling nos últimos 5 minutos.
- Analisa os pontos de dados retornados:
- Se houver eventos de throttling (soma maior que 0), envia uma notificação para o Discord com detalhes.
- Caso contrário, indica que não foram detectados eventos de throttling.
- Finaliza o processo de verificação e retorna um status de sucesso.
A função envia uma notificação ao Discord somente se detectar eventos de throttling nas métricas monitoradas da tabela DynamoDB especificada.
Segundo Passo - Configuração do Alarme CloudWatch
Amostragem geral:
Table Name / Statistic / Period:
Condições:
Lambda action:
Feito, agora quando o alarme triggar algum throttle na leitura ou escrita da tabela configurada no alerta e nas variáveis do lambda, ele vai enviar para o grupo de texto no discord.
Após forçar um throttle, conseguimos receber o evento no Discord:
Top comments (0)