Como posso fazer com que minha assinatura do Amazon SQS receba com êxito uma notificação de um tópico do Amazon SNS?

7 minuto de leitura
0

Minha assinatura do Amazon Simple Queue Service (Amazon SQS) não recebe notificações de um tópico do Amazon Simple Notification Service (Amazon SNS).

Breve descrição

Antes de começar, configure o registro em log de status de entrega do Amazon CloudWatch para seu tópico do SNS. Para obter mais informações, consulte Monitorar tópicos do Amazon SNS usando o CloudWatch.

Observação:

Resolução

Valide o status da assinatura

Verifique se a assinatura está no estado Confirmada e não no estado Confirmação pendente ou Excluída. Se o status for Confirmação pendente, confirme a assinatura. Se o status for Excluída, recrie a assinatura excluída.

Os motivos a seguir explicam por que uma assinatura está no estado Confirmada, mas as mensagens não são entregues às filas:

  • Você não configurou a política de acesso da fila SQS ou a política de chaves do AWS Key Management Service (AWS KMS).
  • As mensagens são filtradas.
  • As mensagens são tópicos primeiro a entrar, primeiro a sair (FIFO) desduplicados.
  • Você ativou a entrega de mensagens brutas para as assinaturas.
  • As mensagens foram entregues, mas você não as vê no Amazon SQS.

Você recebe um erro de acesso negado

Configure a política de acesso da fila do SQS para permitir que o Amazon SNS envie mensagens

Para visualizar a política de acesso da fila do SQS, configure sua política de acesso.

Se a política de acesso da fila do SQS não incluir a ação de API SendMessage para o tópico do SNS, atualize a política com as permissões corretas. As permissões devem permitir que o Amazon SNS envie mensagens para a fila do SQS.

Configure sua política de chaves do AWS KMS para trabalhar com SSE em sua fila do SQS

Se a criptografia do lado do servidor (SSE) estiver ativada para sua fila SQS, siga estas etapas:

1.    Certifique-se de que a chave do AWS KMS esteja ativada.

2.    Verifique se sua fila do SQS está usando uma chave do KMS gerenciada pelo cliente. A política de chaves deve conceder permissões kms:Decrypt e kms:GenerateDataKey ao tópico do SNS.

Observação: você não pode usar chaves gerenciadas da AWS em assinaturas entre contas.

3.    Para permitir que o serviço do Amazon SNS execute ações de API kms:GenerateDataKey e kms:Decrypt, adicione a seguinte declaração à política de chaves do KMS:

{    "Sid": "Allow Amazon SNS to use this key",
    "Effect": "Allow",
    "Principal": {
        "Service": "sns.amazonaws.com"

    },
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey*"
    ],
    "Resource": "*"
}

Se a política de chaves do KMS não conceder acesso à entidade principal do Amazon SNS, os logs de status de entrega de mensagens mostrarão o erro KMS.AccessDeniedException:

{    "notification": {
        "messageMD5Sum": "9ecb1c62c0de86ac894c5fd6c447fe1f",
        "messageId": "f762cbcb-8643-5ef3-95c8-9739fe5f07f6",
        "topicArn": "arn:aws:sns:::",
        "timestamp": "2023-06-01 10:41:32.114"
    },
    "delivery": {
        "deliveryId": "f7a48fb3-1d98-5fe8-ae45-d34165842b39",
        "destination": "arn:aws:sqs:::",
        "providerResponse": "{\"ErrorCode\":\"KMS.AccessDeniedException\",\"ErrorMessage\":\"null (Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException; Request ID: 00df5c7d-1834-4cfb-bc05-e5a7fccfa816; Proxy: null)\",\"sqsRequestId\":\"Unrecoverable\"}",
        "dwellTimeMs": 59,
        "statusCode": 400
    },
    "status": "FAILURE"
}

Para obter mais informações, consulte Why aren't messages that I publish to my Amazon SNS topic getting delivered to my subscribed Amazon SQS queue that has server-side encryption activated?

As mensagens são filtradas

No console do CloudWatch, verifique as métricas do CloudWatch para o Amazon SNS. Para confirmar se as mensagens foram filtradas, verifique a métrica NumberOfNotificationsFilteredOut. Se as mensagens forem filtradas, verifique a política de filtro de assinatura do tópico do SNS da sua fila do SQS.

Para verificar a política de assinatura de tópicos do SNS, conclua as seguintes etapas:

1.    Abra o console do Amazon SNS.

2.    No painel de navegação, escolha Assinaturas.

3.    Selecione sua assinatura e, em seguida, escolha Editar.

4.    Expanda a seção Política de filtro de assinatura. Verifique se os Atributos da mensagem ou o Corpo da mensagem correspondem ao ](https://docs.aws.amazon.com/sns/latest/dg/sns-message-filtering-scope.html)escopo da política do filtro de assinatura do SNS[. Se os atributos ou o corpo não corresponderem, atualize a política de filtro.

5.    Escolha Salvar alterações.

Para obter mais informações, consulte Filtragem de mensagens do Amazon SNS.

As mensagens são desduplicadas

Com base no conteúdo da mensagem ou em um ID de desduplicação, os tópicos FIFO do Amazon SNS e as filas FIFO do Amazon SQS oferecem suporte à desduplicação de mensagens. Se o tópico tiver ContentBasedDeduplication definido, o sistema gerará um MessageDeduplicationId com base no conteúdo da mensagem. Se ContentBasedDeduplication não estiver definido, cada mensagem publicada no tópico deverá ter um MessageDeduplicationId exclusivo.

Use o parâmetro MessageDeduplicationId para desduplicar mensagens publicadas nos tópicos do SNS dentro do intervalo de desduplicação de 5 minutos. Para obter mais informações, consulte Desduplicação de mensagens para tópicos FIFO.

Você ativou a entrega de mensagens brutas para as assinaturas

Se você usar a entrega de mensagens brutas, verifique se não enviou mais do que 10 atributos de mensagem na notificação publicada. Para mensagens que você ativa com a entrega de mensagens brutas, o Amazon SNS mapeia os atributos das mensagens para atributos de mensagem do SQS.

O exemplo a seguir é um log de status de entrega com mais de 10 atributos de mensagem:

{    "notification": {
        "messageMD5Sum": "8fa14cdd754f91cc6554c9e71929cce7",
        "messageId": "22540375-973d-5c6d-8d9e-5f870de34c49",
        "topicArn": "arn:aws:sns:<region>:<account>:<topic name>",
        "timestamp": "2023-06-01 13:09:50.947"
    },
    "delivery": {
        "deliveryId": "9ccf7066-19e5-5bbb-a973-2c94833bc5fc",
        "destination": "arn:aws:sqs:<region>:<account>:<queue name>",
        "providerResponse": "{\\"ErrorCode\\":\\"InvalidParameterValue\\",\\"ErrorMessage\\":\\"Number of message attributes \[13\] exceeds the allowed maximum \[10\].\\",\\"sqsRequestId\\":\\"Unrecoverable\\"}",
        "dwellTimeMs": 31,
        "statusCode": 400
    },
    "status": "FAILURE"
}

As mensagens foram entregues, mas você não as vê no Amazon SQS

Uma mensagem pode ser entregue à fila, mas não estar disponível para pesquisa por esses motivos:

A assinatura do SNS não está visível no console do SQS

Se você criou a assinatura do SQS a partir da conta de tópico do SNS, não poderá ver a assinatura no console do SQS. Isso ocorre porque a conta do SNS é proprietária da assinatura, então você pode ver a assinatura somente no console do SNS.

Se você criou a assinatura do SNS a partir do console do Amazon SQS, a conta de tópico do SQS é proprietária da assinatura. Você poderá, então, ver a assinatura do SNS no console do SNS e no console do SQS.

A assinatura do SQS não está visível na assinatura de tópicos do SNS

Esse problema ocorre quando você exclui e recria o tópico do SNS com o mesmo nome e não exclui a assinatura do SQS. Você pode ver a assinatura do SQS no console do SNS na lista Assinaturas ou a partir da chamada de API ListSubscriptions do SNS. Para verificar o carimbo de data e hora em que as operações foram realizadas, examine os eventos do AWS CloudTrail relativos às chamadas de API DeleteTopic e CreateTopic do SNS.

Informações relacionadas

Como configuro meu endpoint do Amazon SQS em uma conta cruzada para o tópico do Amazon SNS?

AWS OFICIAL
AWS OFICIALAtualizada há 6 meses