Alertas por Email con SNS: Por qué No Recibes los Mensajes y Cómo Solucionarlo
Configuraste un tema SNS, añadiste tu dirección de correo como suscriptor, y publicaste un mensaje de prueba — pero tu bandeja de entrada sigue vacía. Antes de revisar políticas de acceso o configuraciones de red, la causa más frecuente es la más simple: el enlace de confirmación de suscripción nunca fue cliqueado. SNS no entrega ningún mensaje a una suscripción de email que permanezca en estado PendingConfirmation.
TL;DR: Diagnóstico Rápido de Alertas SNS por Email
| Síntoma | Causa más probable | Acción inmediata |
|---|---|---|
| No llega ningún email tras publicar | Suscripción sin confirmar | Verificar estado con aws sns list-subscriptions-by-topic |
| El email de confirmación no llegó | Filtro de spam o dirección incorrecta | Revisar spam; re-suscribir con dirección correcta |
| Suscripción confirmada pero sin mensajes | Política de acceso al tema restrictiva | Revisar política del tema con aws sns get-topic-attributes |
| Mensajes publicados pero no entregados | Filtro de suscripción activo | Verificar FilterPolicy en los atributos de suscripción |
Cómo Funciona la Suscripción de Email en SNS
SNS utiliza un modelo de publicación/suscripción donde los mensajes publicados en un tema se entregan a todos los suscriptores confirmados. Para el protocolo email, el flujo tiene una etapa de confirmación obligatoria que muchos omiten al configurar alertas por primera vez.
Estado: PendingConfirmation"] B --> C["SNS envía email
con enlace de confirmación"] C --> D{"¿Usuario hizo clic
en el enlace?"} D -- No --> E["Estado permanece:
PendingConfirmation"] D -- Sí --> F["Estado: Confirmed"] E --> G["SNS NO entrega mensajes"] F --> H["SNS entrega mensajes
al publicar en el tema"] style E fill:#ff6b6b,color:#fff style G fill:#ff6b6b,color:#fff style F fill:#51cf66,color:#fff style H fill:#51cf66,color:#fff
- Creación de suscripción: Al ejecutar
aws sns subscribe, SNS registra la suscripción en estado PendingConfirmation y envía un email con un enlace único de confirmación. - Ventana de confirmación: El enlace de confirmación tiene una validez limitada. Si no se confirma a tiempo, la suscripción expira y debe recrearse.
- Estado Confirmed: Solo tras hacer clic en el enlace, la suscripción pasa a Confirmed y SNS comienza a entregar mensajes.
- Entrega de mensajes: Cada publicación al tema genera un intento de entrega a todos los suscriptores confirmados. SNS reintenta en caso de fallo transitorio según su política de reintentos para email.
Paso 1: Verificar el Estado de la Suscripción de Email en SNS
El primer diagnóstico siempre es confirmar el estado real de la suscripción. Una suscripción en PendingConfirmation es funcionalmente invisible para el sistema de entrega — SNS no le enviará nada hasta que esté confirmada. Este paso descarta el 80% de los casos antes de ir más lejos.
aws sns list-subscriptions-by-topic \
--topic-arn arn:aws:sns:us-east-1:123456789012:MisAlertas \
--query 'Subscriptions[?Protocol==`email`].{Endpoint:Endpoint,Estado:SubscriptionArn}' \
--output table
Si el campo SubscriptionArn muestra PendingConfirmation en lugar de un ARN real, la suscripción no está activa. Revisa la bandeja de spam del correo destino. Si el email de confirmación no aparece, elimina la suscripción pendiente y vuelve a crearla.
Paso 2: Re-suscribir y Confirmar Correctamente
Si la suscripción está pendiente o el enlace expiró, el camino más limpio es eliminarla y crearla de nuevo. No hay forma de reenviar el email de confirmación original desde la CLI — hay que generar una nueva suscripción.
# Eliminar la suscripción pendiente (requiere el ARN completo si ya fue asignado,
# o simplemente crear una nueva si aún muestra PendingConfirmation)
aws sns unsubscribe \
--subscription-arn arn:aws:sns:us-east-1:123456789012:MisAlertas:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# Crear nueva suscripción
aws sns subscribe \
--topic-arn arn:aws:sns:us-east-1:123456789012:MisAlertas \
--protocol email \
--notification-endpoint tu-email@ejemplo.com
Tras ejecutar el segundo comando, revisa el correo destino en los próximos minutos. El asunto del email de confirmación es 'AWS Notification - Subscription Confirmation'. Haz clic en el enlace 'Confirm subscription' dentro del mensaje.
Paso 3: Confirmar que la Suscripción Quedó Activa
Después de hacer clic en el enlace, verifica que el estado cambió a Confirmed. Este paso cierra el ciclo — si el estado sigue en PendingConfirmation después de haber cliqueado el enlace, puede indicar que el enlace ya había expirado y necesitas repetir el paso anterior.
aws sns list-subscriptions-by-topic \
--topic-arn arn:aws:sns:us-east-1:123456789012:MisAlertas \
--query 'Subscriptions[?Protocol==`email`]' \
--output json
Una suscripción activa mostrará un ARN completo en el campo SubscriptionArn, con el formato arn:aws:sns:us-east-1:123456789012:MisAlertas:xxxxxxxx-....
Paso 4: Revisar la Política de Acceso del Tema SNS
Con la suscripción confirmada, si los mensajes aún no llegan, el siguiente sospechoso es la política de acceso del tema. Una política restrictiva puede bloquear silenciosamente las publicaciones de ciertos servicios o cuentas — no hay error visible en el publicador, simplemente el mensaje no se entrega.
aws sns get-topic-attributes \
--topic-arn arn:aws:sns:us-east-1:123456789012:MisAlertas \
--query 'Attributes.Policy' \
--output text
Examina el campo Policy resultante. Verifica que el principal que publica mensajes (tu cuenta, un servicio como CloudWatch Alarms, u otro servicio AWS) tenga permiso explícito para la acción sns:Publish. Si el tema fue creado con una política por defecto y solo publicas desde la misma cuenta, esto generalmente no es el problema — pero si CloudWatch u otro servicio dispara las alertas, la política debe permitirlo explícitamente.
Ejemplo de política mínima para permitir que CloudWatch publique en el tema:
🔽 Ver política IAM de ejemplo para CloudWatch → SNS
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCloudWatchPublish",
"Effect": "Allow",
"Principal": {
"Service": "cloudwatch.amazonaws.com"
},
"Action": "sns:Publish",
"Resource": "arn:aws:sns:us-east-1:123456789012:MisAlertas"
}
]
}
Paso 5: Verificar el Filtro de Suscripción (FilterPolicy)
Un detalle que pasa desapercibido: si la suscripción tiene un FilterPolicy configurado, SNS solo entregará mensajes cuyo atributo coincida con el filtro. Mensajes publicados sin los atributos correctos son descartados silenciosamente — la suscripción está activa, el mensaje fue publicado, pero el email nunca llega.
aws sns get-subscription-attributes \
--subscription-arn arn:aws:sns:us-east-1:123456789012:MisAlertas:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Busca el campo FilterPolicy en la respuesta. Si está presente y contiene condiciones, tus mensajes de prueba deben incluir los atributos de mensaje correspondientes para ser entregados. Si no necesitas filtrado, elimina la política de filtro actualizando el atributo a una cadena vacía.
Paso 6: Monitorear Entregas Fallidas con CloudWatch
Una vez que la configuración parece correcta pero todavía hay dudas sobre si los mensajes están siendo entregados, las métricas de SNS en CloudWatch son la fuente de verdad. SNS publica métricas como NumberOfNotificationsDelivered y NumberOfNotificationsFailed bajo el namespace AWS/SNS.
Estas métricas no están disponibles a través de aws sns — deben consultarse desde CloudWatch. La forma más directa desde la CLI es con aws cloudwatch get-metric-statistics:
aws cloudwatch get-metric-statistics \
--namespace AWS/SNS \
--metric-name NumberOfNotificationsFailed \
--dimensions Name=TopicName,Value=MisAlertas \
--start-time 2024-01-15T00:00:00Z \
--end-time 2024-01-15T23:59:59Z \
--period 3600 \
--statistics Sum \
--region us-east-1
Ajusta --start-time y --end-time al intervalo donde publicaste mensajes de prueba. Si NumberOfNotificationsFailed muestra valores mayores a cero, SNS intentó entregar pero falló — en ese punto, habilitar el registro de entrega en CloudWatch Logs para el tema te dará el detalle del error.
Pensar en SNS como un cartero ayuda: el cartero solo entrega cartas a direcciones confirmadas. Si la dirección nunca fue verificada (PendingConfirmation), la carta va a la papelera interna antes de salir del edificio. Las métricas de CloudWatch son el registro del edificio — te dicen cuántas cartas salieron y cuántas rebotaron.
Caso Real: La Suscripción Estaba Confirmada, Pero las Alertas No Llegaban
La suscripción mostraba estado Confirmed, el tema existía, y los mensajes de prueba publicados manualmente desde la consola llegaban sin problema. Pero las alertas de CloudWatch Alarms nunca aparecían en el correo.
El diagnóstico inicial apuntó a un problema de entrega intermitente o a un filtro de suscripción. Ambas hipótesis eran incorrectas.
La causa real: la política del tema SNS había sido modificada para restringir el acceso solo a la cuenta principal, sin incluir el principal de servicio cloudwatch.amazonaws.com. CloudWatch intentaba publicar en el tema, pero la política lo rechazaba silenciosamente — sin error visible en la alarma de CloudWatch, sin métrica de fallo inmediata, sin log.
La verificación llegó al consultar NumberOfNotificationsFailed en CloudWatch para el período de las alarmas disparadas: el contador mostraba exactamente tantos fallos como alarmas habían cambiado de estado. Añadir el permiso sns:Publish para cloudwatch.amazonaws.com en la política del tema resolvió el problema de inmediato.
La lección operacional: cuando la suscripción está confirmada y los mensajes manuales llegan pero las alertas automatizadas no, el problema casi siempre está en los permisos del publicador — no en la suscripción.
Flujo Completo de Diagnóstico de Alertas SNS por Email
list-subscriptions-by-topic"] S1 --> D1{"¿Estado es
PendingConfirmation?"} D1 -- Sí --> Fix1["Re-suscribir y confirmar
enlace del email"] Fix1 --> S1 D1 -- No --> S2["Paso 2: Verificar política
get-topic-attributes"] S2 --> D2{"¿Publicador tiene
permiso sns:Publish?"} D2 -- No --> Fix2["Añadir permiso en
política del tema"] Fix2 --> S2 D2 -- Sí --> S3["Paso 3: Verificar
FilterPolicy"] S3 --> D3{"¿FilterPolicy
activo?"} D3 -- Sí --> Fix3["Ajustar atributos
del mensaje o eliminar filtro"] Fix3 --> S3 D3 -- No --> S4["Paso 4: Consultar métricas
CloudWatch AWS/SNS"] S4 --> D4{"¿NotificationsFailed
> 0?"} D4 -- Sí --> Fix4["Habilitar delivery logs
en CloudWatch Logs"] D4 -- No --> End["Publicar mensaje de prueba
y re-verificar"] style Fix1 fill:#74c0fc,color:#000 style Fix2 fill:#74c0fc,color:#000 style Fix3 fill:#74c0fc,color:#000 style Fix4 fill:#74c0fc,color:#000
- Inicio: No se reciben emails tras publicar en el tema SNS.
- Verificar estado de suscripción: Si es PendingConfirmation, re-suscribir y confirmar el enlace del email.
- Verificar política del tema: Si el publicador es un servicio AWS (CloudWatch, etc.), asegurar que tiene permiso
sns:Publish. - Verificar FilterPolicy: Si existe, los mensajes deben incluir los atributos de mensaje correspondientes.
- Consultar métricas en CloudWatch:
NumberOfNotificationsFailedconfirma si SNS intentó entregar y falló.
Permisos IAM Necesarios para Diagnosticar SNS
Para ejecutar todos los comandos de diagnóstico de este artículo, el usuario o rol necesita al menos los siguientes permisos:
🔽 Ver política IAM mínima para diagnóstico SNS
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DiagnosticoSNS",
"Effect": "Allow",
"Action": [
"sns:ListSubscriptionsByTopic",
"sns:GetTopicAttributes",
"sns:GetSubscriptionAttributes",
"sns:Subscribe",
"sns:Unsubscribe",
"sns:Publish"
],
"Resource": "arn:aws:sns:us-east-1:123456789012:MisAlertas"
},
{
"Sid": "MetricasCloudWatch",
"Effect": "Allow",
"Action": [
"cloudwatch:GetMetricStatistics"
],
"Resource": "*"
}
]
}
Nota: cloudwatch:GetMetricStatistics requiere "Resource": "*" — no admite restricción a nivel de recurso específico según la Service Authorization Reference de AWS.
Próximos Pasos y Recursos para Alertas SNS por Email
Si después de seguir estos pasos los emails siguen sin llegar, el siguiente nivel de diagnóstico es habilitar el registro de estado de entrega de SNS hacia CloudWatch Logs — esto captura el detalle de cada intento de entrega fallido con el código de error específico. La documentación oficial de AWS sobre atributos de temas SNS y la guía de notificaciones por email cubren la configuración de logging de entrega en detalle.
Glosario de Términos Clave
| Término | Definición |
|---|---|
| PendingConfirmation | Estado de una suscripción SNS que aún no ha sido confirmada mediante el enlace enviado al endpoint. SNS no entrega mensajes a suscripciones en este estado. |
| FilterPolicy | Atributo de suscripción SNS que define condiciones sobre los atributos de mensaje. Solo los mensajes que coincidan con el filtro son entregados al suscriptor. |
| Política de acceso del tema | Política basada en recursos adjunta al tema SNS que controla qué principales (usuarios, roles, servicios) pueden publicar o suscribirse. |
| NumberOfNotificationsFailed | Métrica de CloudWatch bajo el namespace AWS/SNS que cuenta los intentos de entrega fallidos para un tema. |
| Principal de servicio | Identificador de un servicio AWS (ej: cloudwatch.amazonaws.com) usado en políticas IAM para otorgar permisos a servicios que actúan de forma autónoma. |
Comentarios
Publicar un comentario