Alertas por E-mail via SNS: Por Que Você Não Está Recebendo as Notificações
Você configurou um tópico SNS, adicionou um endpoint de e-mail e aguardou os alertas chegarem — mas a caixa de entrada continua vazia. Na maioria dos casos, o problema não está na configuração do tópico em si: está na confirmação de assinatura que o SNS exige antes de começar a entregar mensagens.
TL;DR — Diagnóstico Rápido de Alertas SNS por E-mail
| Sintoma | Causa Provável | Ação |
|---|---|---|
| Nenhum e-mail recebido após publicação | Assinatura pendente (não confirmada) | Confirmar o link recebido ou recriar a assinatura |
| E-mail de confirmação nunca chegou | Filtrado como spam ou link expirado | Verificar spam; recriar a assinatura via CLI |
| Status da assinatura é 'PendingConfirmation' | Link de confirmação não foi clicado | Recriar a assinatura para gerar novo link |
| Assinatura confirmada mas sem entrega | Política de filtro de mensagens ativa | Verificar FilterPolicy no atributo da assinatura |
Como o SNS Gerencia Assinaturas de E-mail
O Amazon SNS utiliza um modelo de confirmação dupla para endpoints de e-mail e e-mail-json. Quando você cria uma assinatura, o SNS envia imediatamente um e-mail contendo um link de confirmação único para o endereço cadastrado. Até que o destinatário clique nesse link, a assinatura permanece no estado PendingConfirmation e o SNS não entrega nenhuma mensagem publicada no tópico para aquele endpoint.
Esse comportamento é intencional: protege contra inscrições não autorizadas em listas de e-mail. O link de confirmação tem validade de 3 dias. Após esse período, ele expira e a assinatura pendente precisa ser recriada para gerar um novo link.
- Subscribe chamado: a assinatura é criada com status
PendingConfirmation. - SNS envia e-mail: contém o link único de confirmação com validade de 3 dias.
- Usuário confirma: ao clicar no link, o status muda para
Confirmed. - Entrega ativa: a partir desse momento, publicações no tópico chegam ao e-mail.
- Link expirado: se não confirmado em 3 dias, a assinatura precisa ser recriada.
Diagnóstico Passo a Passo para Alertas SNS por E-mail
Passo 1 — Verificar o Status da Assinatura
Antes de qualquer outra ação, confirme o estado atual da assinatura. Uma assinatura com status PendingConfirmation não entrega mensagens, independentemente de quantas publicações forem feitas no tópico. Este é o ponto de falha mais comum e o primeiro a eliminar.
aws sns list-subscriptions-by-topic \
--topic-arn arn:aws:sns:us-east-1:123456789012:meu-topico-alertas \
--query 'Subscriptions[*].{Endpoint:Endpoint,Status:SubscriptionArn,Protocol:Protocol}' \
--output table
Se o campo SubscriptionArn retornar o valor literal PendingConfirmation em vez de um ARN real, a assinatura ainda não foi confirmada. Um ARN confirmado tem o formato arn:aws:sns:us-east-1:123456789012:meu-topico-alertas:uuid.
Passo 2 — Verificar a Caixa de Spam e o Prazo do Link
O e-mail de confirmação do SNS frequentemente é classificado como spam por filtros corporativos e provedores como Gmail. Antes de recriar a assinatura, verifique a pasta de spam procurando por um remetente no domínio sns.amazonaws.com com assunto contendo 'AWS Notification - Subscription Confirmation'. Se o e-mail estiver lá e o link ainda não expirou (menos de 3 dias desde a criação da assinatura), basta clicar no link para confirmar.
Se o e-mail não foi encontrado ou o link já expirou, a única forma de obter um novo link de confirmação via AWS CLI é remover a assinatura pendente e recriá-la — o que é descrito no Passo 3. Vale mencionar que o Console AWS oferece a opção 'Request confirmation' diretamente na interface de gerenciamento de assinaturas, mas essa ação não possui um comando CLI equivalente documentado.
Passo 3 — Recriar a Assinatura para Gerar Novo Link
Assinaturas no estado PendingConfirmation não possuem um ARN de assinatura real — elas retornam a string literal PendingConfirmation no lugar do ARN. Por isso, o comando sns unsubscribe não pode ser usado para removê-las, pois ele exige um ARN de assinatura válido como parâmetro.
Para forçar o reenvio do e-mail de confirmação via CLI, a abordagem é criar uma nova assinatura para o mesmo endpoint. O SNS detecta que já existe uma assinatura pendente para aquele par tópico+endpoint e envia um novo e-mail de confirmação:
aws sns subscribe \
--topic-arn arn:aws:sns:us-east-1:123456789012:meu-topico-alertas \
--protocol email \
--notification-endpoint seu-email@exemplo.com
Após executar o comando, um novo e-mail de confirmação será enviado. Verifique a caixa de entrada (e o spam) e clique no link dentro de 3 dias.
Passo 4 — Confirmar que a Assinatura Está Ativa
Após clicar no link de confirmação, valide que o status mudou para Confirmed antes de testar a entrega de mensagens. Isso elimina qualquer dúvida sobre se o clique foi processado corretamente.
aws sns list-subscriptions-by-topic \
--topic-arn arn:aws:sns:us-east-1:123456789012:meu-topico-alertas \
--query 'Subscriptions[?Protocol==`email`].{Endpoint:Endpoint,ARN:SubscriptionArn}' \
--output table
O campo ARN deve agora exibir um ARN completo no formato arn:aws:sns:.... Se ainda mostrar PendingConfirmation, o link não foi processado.
Passo 5 — Publicar uma Mensagem de Teste
Com a assinatura confirmada, publique uma mensagem de teste diretamente no tópico. Isso isola se o problema era exclusivamente a confirmação pendente ou se existe outro fator bloqueando a entrega.
aws sns publish \
--topic-arn arn:aws:sns:us-east-1:123456789012:meu-topico-alertas \
--subject 'Teste de Alerta SNS' \
--message 'Mensagem de teste para verificar entrega de e-mail via SNS.'
O e-mail deve chegar em alguns segundos. Se não chegar, avance para o Passo 6.
Passo 6 — Verificar FilterPolicy na Assinatura
Aqui está um ponto que pega muita gente de surpresa: uma assinatura confirmada pode silenciosamente descartar mensagens se um FilterPolicy estiver configurado. Se os atributos da mensagem publicada não corresponderem ao filtro definido, o SNS simplesmente não entrega — sem erro, sem log visível no lado do publicador.
aws sns get-subscription-attributes \
--subscription-arn arn:aws:sns:us-east-1:123456789012:meu-topico-alertas:uuid-da-assinatura
Verifique o atributo FilterPolicy na resposta. Se ele contiver um JSON com condições de filtro, as mensagens publicadas precisam incluir atributos de mensagem correspondentes para serem entregues. Se o filtro não for intencional, remova-o:
aws sns set-subscription-attributes \
--subscription-arn arn:aws:sns:us-east-1:123456789012:meu-topico-alertas:uuid-da-assinatura \
--attribute-name FilterPolicy \
--attribute-value '{}'
Diagnóstico Visual do Fluxo de Falha
- Assinatura pendente: caminho mais comum — o link nunca foi clicado.
- E-mail não encontrado: verifique spam antes de recriar a assinatura.
- Link expirado: recriar via CLI é a única opção sem o Console.
- FilterPolicy ativo: descarta mensagens silenciosamente mesmo com assinatura confirmada.
Experiência Real: O Alerta que Nunca Chegou
Um cenário recorrente em ambientes corporativos: a equipe configura um tópico SNS para alertas de CloudWatch, testa a publicação via CLI, confirma que o comando retornou sem erro — e aguarda. Nada chega. O diagnóstico inicial aponta para permissões IAM ou configuração do tópico. Horas depois, alguém verifica a pasta de spam do e-mail corporativo e encontra o e-mail de confirmação do SNS bloqueado pelo filtro anti-phishing da empresa, com o link já expirado.
A suposição errada foi que 'o comando subscribe retornou sem erro, logo a assinatura está ativa'. O retorno sem erro apenas confirma que a assinatura foi criada — não que ela está confirmada. O status PendingConfirmation é o estado inicial, não um estado de erro.
Pense na confirmação de assinatura SNS como uma lista de e-mail com double opt-in: cadastrar o endereço é apenas o primeiro passo. A entrega só começa depois que o destinatário confirma explicitamente que quer receber as mensagens.
A correção foi recriar a assinatura via CLI, o que gerou um novo e-mail de confirmação. Desta vez, com o endereço do remetente SNS adicionado à lista de permissões do filtro corporativo, o e-mail chegou normalmente e o link foi confirmado em minutos.
IAM: Permissões Necessárias para Gerenciar Assinaturas SNS
Para executar os comandos de diagnóstico e correção descritos neste post, o principal IAM precisa das seguintes permissões mínimas:
🔽 Ver política IAM mínima necessária
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sns:ListSubscriptionsByTopic",
"sns:GetSubscriptionAttributes",
"sns:SetSubscriptionAttributes",
"sns:Subscribe",
"sns:Publish"
],
"Resource": "arn:aws:sns:us-east-1:123456789012:meu-topico-alertas"
}
]
}
Note que sns:Unsubscribe não está incluído porque, como explicado no Passo 3, ele não pode ser usado em assinaturas pendentes. Para remover assinaturas confirmadas, adicione sns:Unsubscribe à política conforme necessário.
Próximos Passos e Recursos para Alertas SNS por E-mail
Com a assinatura confirmada e a entrega funcionando, considere as seguintes melhorias para tornar seus alertas SNS mais robustos em produção:
- Monitorar entregas com falha: o SNS publica métricas de entrega no CloudWatch. Acompanhe
NumberOfNotificationsFailedpara detectar problemas de entrega antes que se tornem incidentes. - Usar e-mail corporativo com domínio verificado: endereços em domínios com SPF e DKIM configurados têm menor probabilidade de ter o e-mail de confirmação filtrado como spam.
- Considerar SES para entrega de e-mail em escala: para volumes altos ou necessidade de rastreamento de entrega detalhado, o Amazon SES oferece mais controle do que o endpoint de e-mail nativo do SNS.
- Documentação oficial: Amazon SNS — Sending email notifications.
Glossário
| Termo | Definição |
|---|---|
| Tópico SNS | Canal de comunicação pub/sub no Amazon SNS para o qual publicadores enviam mensagens e assinantes recebem notificações. |
| PendingConfirmation | Status de uma assinatura SNS que foi criada mas cujo endpoint ainda não confirmou o recebimento via link de confirmação. |
| FilterPolicy | Atributo de assinatura SNS que define condições baseadas em atributos de mensagem; mensagens que não correspondem ao filtro são descartadas silenciosamente. |
| Double Opt-in | Modelo de confirmação que exige ação explícita do destinatário para ativar a entrega de mensagens, protegendo contra inscrições não autorizadas. |
| SubscriptionArn | ARN único atribuído a uma assinatura SNS confirmada; assinaturas pendentes retornam a string literal 'PendingConfirmation' no lugar do ARN. |
Comentários
Postar um comentário