Como solucionar problemas de inscrição de um endpoint HTTP(S) em meu tópico Amazon SNS?

5 minuto de leitura
0

Não consigo receber uma notificação de confirmação de assinatura quando inscrevo meu endpoint HTTP ou HTTPS em um tópico do Amazon Simple Notification Service (Amazon SNS).

Resolução

Antes de inscrever um endpoint HTTP(S) em um tópico do SNS, você deve verificar se o endpoint HTTP(S) está pronto para processar as mensagens do Amazon SNS.

Observação: as etapas a seguir também se aplicam a cenários em que sua assinatura HTTP(S) está no estado confirmado, mas você ainda não está recebendo notificações.

Verifique se seu endpoint HTTP(S) está acessível ao público antes de assinar um tópico do SNS

O Amazon SNS não é compatível com endpoints HTTP(S) privados. O Amazon SNS faz uma solicitação HTTP POST para o seu endpoint por meio da Internet pública quando você inscreve um endpoint HTTP(S) em um tópico do SNS. Para obter mais informações e exemplos de solicitações POST, consulte Analisar formatos de mensagens.

Para verificar se o seu endpoint está acessível ao público, faça um exemplo de solicitação POST em sua máquina local. Por exemplo:

curl -X POST your_HTTPS_endpoint -H "Content-Type:text/plain; charset=UTF-8" --data {"x":"y"} -v

se o seu endpoint estiver acessível ao público, o comando retornará o seguinte código de status HTTP:

200 OK

Se você estiver assinando um endpoint HTTP que não está acessível ao público a um tópico do SNS, você receberá o seguinte erro:

An error occurred (InvalidParameter) when calling the Subscribe operation: Invalid parameter: Unreachable Endpoint

Importante: seu nome de host não deve possuir um sublinhado. Por exemplo, o seguinte nome de host não é permitido: seu_nomedehost

Valide seu cabeçalho de resposta do endpoint

Conclua as etapas a seguir com base no tipo de autenticação que você está usando: autenticação de acesso básica ou digest. Certifique-se de que seu endpoint seja ‘https’ e que seja compatível com a resposta de cabeçalho não autorizada HTTP/1.1 401.

Autenticação de acesso básica:

Quando seu endpoint recebe uma solicitação não autenticada, ele retorna a resposta de cabeçalho não autorizada HTTP/1.1 401 junto com um cabeçalho "WWW-Authenticate". O valor do cabeçalho deve conter a palavra-chave "Basic" e outros parâmetros opcionais compatíveis no RFC 2617 (do site do Editor RFC). Por exemplo:

WWW-Authenticate: Basic

Autenticação de acesso digest:

Quando seu endpoint recebe uma solicitação não autenticada, ele deve retornar uma resposta de cabeçalho não autorizada HTTP/1.1 401 junto com um cabeçalho "WWW-Authenticate". O valor do cabeçalho deve conter a palavra-chave "Digest", um valor de uso único gerado aleatoriamente chamado "nonce", uma região de autenticação e outros parâmetros opcionais compatíveis no RFC 2617 (do site do Editor RFC). Por exemplo:

WWW-Authenticate: Digest realm="testrealm@host.com",
                        qop="auth,auth-int",
                        nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
                        opaque="5ccc069c403ebaf9f0171e9517f40e41"

Configure o registro em log de status de entrega

1.    Configure logs de status de entrega do seu tópico do SNS. 

2.    Visualize os dados de log da entrega da notificação de confirmação de assinatura do SNS que são gerados quando você tenta assinar um endpoint HTTP(S).

Os logs de falhas, se houver, serão gerados em um grupo de logs no seguinte formato:

sns/your_aws_region/your_account_ID/your_topic_name/Failure

Observação: para ver por que sua notificação de confirmação de assinatura falhou na entrega, verifique providerResponse em seus logs de status de entrega do Amazon CloudWatch.

Verifique o certificado SSL do seu endpoint HTTPS

Se você estiver usando um endpoint HTTPS, conclua as seguintes etapas de solução de problemas:

1.    Confirme se o certificado SSL retornado pelo endpoint é válido e assinado por uma autoridade de certificação confiável da Amazon SNS.

2.    Verifique se o seu endpoint retorna a cadeia completa de certificados. A cadeia completa inclui todos os certificados intermediários.

Observação: você pode usar ferramentas de terceiros para verificar se o certificado SSL retornado pelo seu endpoint é confiável e completo. Por exemplo, você pode usar o SSL Server Test no site do SSL Labs.

Ou, para verificar se o certificado SSL retornado pelo seu endpoint é confiável e completo, execute o seguinte comando OpenSSL:

openssl s_client -connect yourHostname:443 -servername yourHostname -showcerts

Se o certificado SSL retornado pelo endpoint não for confiável ou completo, você poderá ver o seguinte providerResponse em seus logs do CloudWatch:

{
    "notification": {
        "messageId": "...",
        "topicArn": "arn:aws:sns:ap-northeast-1:***:***",
        "timestamp": "2021-05-12 06:41:20.778"
    },
    "delivery": {
        "deliveryId": "***",
        "destination": "https://***",
        "providerResponse": "SSLPeerUnverifiedException in HttpClient",
        "dwellTimeMs": 66171,
        "attempts": 4
    },
    "status": "FAILURE"
}

Verifique se um firewall está bloqueando seu endpoint HTTP(S)

Se um firewall estiver impedindo a entrega da notificação de confirmação da assinatura do SNS aos seus endpoints HTTP (S), permita endereços IP específicos da região da AWS.

Verifique se o seu endpoint HTTP(S) tem uma política de filtro de assinatura

Se o seu endpoint estiver com estado de inscrito, mas não estiver recebendo notificações de tópicos, conclua as seguintes etapas:

1.    Verifique se o seu endpoint tem uma política de filtro de assinatura configurada. Se sua assinatura HTTP(S) tiver uma política de filtro, as notificações podem estar sendo filtradas.

2.    Para confirmar que suas mensagens do SNS estão sendo filtradas, verifique as seguintes métricas do CloudWatch: NumberOfNotificationsFilteredOutNumberOfNotificationsFilteredOut-InvalidAttributesNumberOfNotificationsFilteredOut-NoMessageAttributes.


AWS OFICIAL
AWS OFICIALAtualizada há 3 anos