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

SintomaCausa ProvávelAção
Nenhum e-mail recebido após publicaçãoAssinatura pendente (não confirmada)Confirmar o link recebido ou recriar a assinatura
E-mail de confirmação nunca chegouFiltrado como spam ou link expiradoVerificar spam; recriar a assinatura via CLI
Status da assinatura é 'PendingConfirmation'Link de confirmação não foi clicadoRecriar a assinatura para gerar novo link
Assinatura confirmada mas sem entregaPolítica de filtro de mensagens ativaVerificar 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.

graph LR A["aws sns subscribe chamado"] --> B["Assinatura criada PendingConfirmation"] B --> C["SNS envia e-mail com link único"] C --> D{"Usuário clicou no link?"} D -- "Sim (em até 3 dias)" --> E["Status: Confirmed Entrega ativa"] D -- "Não / Link expirado" --> F["Mensagens descartadas Recriar assinatura"] F --> A
  1. Subscribe chamado: a assinatura é criada com status PendingConfirmation.
  2. SNS envia e-mail: contém o link único de confirmação com validade de 3 dias.
  3. Usuário confirma: ao clicar no link, o status muda para Confirmed.
  4. Entrega ativa: a partir desse momento, publicações no tópico chegam ao e-mail.
  5. 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

graph TD START["E-mail de alerta não chegou"] --> Q1{"Status da assinatura?"} Q1 -- "PendingConfirmation" --> Q2{"E-mail de confirmação encontrado no spam?"} Q2 -- "Sim, link válido" --> FIX1["Clicar no link de confirmação"] Q2 -- "Não ou link expirado" --> FIX2["Recriar assinatura via CLI (Passo 3)"] FIX1 --> VERIFY["Verificar status: Confirmed"] FIX2 --> VERIFY Q1 -- "Confirmed" --> Q3{"FilterPolicy configurado?"} Q3 -- "Sim" --> FIX3["Remover ou ajustar FilterPolicy"] Q3 -- "Não" --> FIX4["Publicar mensagem de teste (Passo 5)"] VERIFY --> FIX4 FIX3 --> FIX4 FIX4 --> DONE["Entrega funcionando"]
  1. Assinatura pendente: caminho mais comum — o link nunca foi clicado.
  2. E-mail não encontrado: verifique spam antes de recriar a assinatura.
  3. Link expirado: recriar via CLI é a única opção sem o Console.
  4. 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 NumberOfNotificationsFailed para 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

TermoDefinição
Tópico SNSCanal de comunicação pub/sub no Amazon SNS para o qual publicadores enviam mensagens e assinantes recebem notificações.
PendingConfirmationStatus de uma assinatura SNS que foi criada mas cujo endpoint ainda não confirmou o recebimento via link de confirmação.
FilterPolicyAtributo 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-inModelo 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.
SubscriptionArnARN único atribuído a uma assinatura SNS confirmada; assinaturas pendentes retornam a string literal 'PendingConfirmation' no lugar do ARN.

Related Posts

Comentários

Postagens mais visitadas deste blog

Variáveis de Ambiente no Lambda: Configuração, Acesso e Criptografia com KMS

Monitoramento de Memória RAM no EC2: Por que o CloudWatch Agent é Obrigatório

S3 Access Denied: Por que 'Bloquear Acesso Público' impede seu objeto mesmo após torná-lo público