Por que o Amazon SNS não invoca minha função do Lambda quando acionado por um alarme do CloudWatch?

6 minuto de leitura
0

Quero que o Amazon Simple Notification Service (Amazon SNS) invoque minha função do AWS Lambda quando acionado por um alarme do Amazon CloudWatch.

Resumo

Os cenários a seguir impedem que você invoque sua função do Lambda:

  • A política de recursos da sua função do Lambda não concedeu acesso para invocar a função a partir do tópico do SNS. Para esse cenário, conclua as etapas na seção Verificar o documento de política baseada em recursos para sua função do Lambda.
  • Suas invocações de funções do Lambda estão atrasadas. Para esse cenário, conclua as etapas na seção Verificar seus registros de entrega do Amazon SNS.

Observação: a resolução pressupõe que você possa chamar a API Publish em seu tópico de SNS, mas está recebendo erros entre a integração do Amazon SNS e do Lambda. Se não consegue ver nenhuma atividade em seu tópico de SNS, consulte Por que não recebi uma notificação de SNS para meu gatilho de alarme do CloudWatch? Essa atividade pode incluir as seguintes métricas do CloudWatch: NumberOfMessagesPublished, NumberOfNotificationsDelivered ou NumberOfNotificationsFailed

Resolução

Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solucionar erros da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.

Verifique o documento de política baseado em recursos para sua função do Lambda

Quando o Amazon SNS invoca uma função do Lambda de forma assíncrona, o Lambda retorna um código de status HTTP 202 para o Amazon SNS. O código de status mostra que o Lambda aceitou a mensagem para processamento posterior. Para obter mais informações, consulte Invocação assíncrona. Se receber uma resposta falhada, verifique seus registros de entrega do Amazon SNS para obter mais informações.

Escolha uma resolução com base no cenário da sua conta.

Se o tópico do SNS e a função do Lambda estiverem na mesma conta:

1.Abra o console do Lambda.

2.No painel de navegação, escolha Funções e, em seguida, escolha sua função.

3.Selecione a guia Configuração e, em seguida, escolha Permissões.

4.Na seção Política baseada em recursos, escolha a declaração de política na coluna ID da declaração para visualizar seu documento de política. Você vê o seguinte documento de política:

statement id
your-statement-id

principal:
sns.amazonaws.com

effect
allow

action
Lambda:InvokeFunction

conditions
{ "arnlike": { "aws:sourcearn": "arn:aws:sns:your-aws-region:your-aws-account-id:your-sns-topic-name" }

Observação: para ver seu documento de política em JSON, escolha Exibir documento de política na seção Política baseada em recursos.

Se não tiver a política de recursos do Lambda que concede acesso ao Amazon SNS para invocar a função, adicione a função a seguir ao seu documento de política. Use o console do Lambda, a AWS CLI ou o AWS CloudShell.

Use a linha de comando conforme mostrado abaixo:

aws lambda add-permission \
--function-name your-lambda-function-name \
--statement-id triggerfromsns-statement-id \
--action lambda:invokefunction \
--principal sns.amazonaws.com \
--source-arn arn:aws:sns:your-aws-region:your-aws-account-id:your-sns-topic-name

Observação: substitua your-lambda-function-name, your-aws-region, your-aws-account-id e your-sns-topic-name com seus valores. O comando AWS CLI usa a região padrão da AWS. Você pode substituir a região padrão pela sinalização**--region** se sua função do Lambda estiver em uma região diferente.

Use o console Lambda conforme mostrado abaixo:

1.Abra o console do Lambda.

2.No painel de navegação, escolha Funções e, em seguida, escolha sua função.

3.Selecione a guia Configuração e, em seguida, escolha Permissões.

4.Na seção Política baseada em recursos, escolha Adicionar permissões.

5.Em Entidade principal, selecione sns.amazonaws.com.

6.Em Ações, selecione Lambda:InvokeFunction.

7.Em ID da declaração, insira um ID único.

8.Escolha Salvar.

Se o tópico do SNS e a função do Lambda estiverem em contas diferentes:

1.Configure permissões entre contas.

2.Em seus logs do CloudWatch, use registro de dados de logs para verificar se o Amazon SNS enviou com sucesso uma mensagem para o Lambda ou a métrica NumberOfNotificationsDelivered do CloudWatch.

Exemplo de uma resposta bem-sucedida entre o Amazon SNS e o Lambda:

{
    "notification": {
        "messagemd5sum": "your-md5-sum",
        "messageid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "topicarn": "arn:aws:sns:your-aws-region:your-aws-account-id:your-sns-topic",
        "timestamp": "2021-04-04 14:08:48.083"
    },
    "delivery": {
        "deliveryid": "your-sns-delivery-id",
        "destination": "arn:aws:lambda:your-aws-region:your-aws-account-id:function:your-function-name",
        "providerresponse": "{\ "lambdarequestid\":\ "your-lambda-request-id\"}",
        "dwelltimems": 92,
        "attempts": 1,
        "statuscode": 202
    },
        "status": "success"
}

Verificar seus registros de entrega do Amazon SNS

Verifique os registros de entrega do seu tópico do SNS para sua função do Lambda.Se a resposta for bem-sucedida, você verá um código de status 202.

Para visualizar os logs do CloudWatch para seu tópico do SNS, faça o seguinte:

1.Abra o console do CloudWatch.

2.No painel de navegação, escolha Logs e, em seguida, escolha Grupos de logs.

3.Na caixa de pesquisa do filtro, insira o nome do seu tópico do SNS. Dois grupos de logs para seu tópico do SNS aparecem: um para sucessos e outro para falhas.

4.Escolha o grupo de logs de sucesso.

5.Na seção Fluxos de logs, escolha Buscar todos.

Observação: você também pode verificar a data e hora da solicitação na coluna Hora do último evento. Em seguida, pesquise o nome do recurso da Amazon (ARN) e o nome da função do Lambda.

6.Na coluna Fluxo de logs, escolha o fluxo de logs para abrir.

Se você não vir nenhum resultado, faça o seguinte:

1.Escolha Grupos de logs e então selecione os grupos de logs com falha.

2.Na seção Fluxo de logs, selecione Buscar todos.

3.Na coluna Fluxo de logs, escolha o fluxo de logs para abrir.

Para solucionar problemas de grupos de logs com falha, faça o seguinte:

1.Verifique se o rastreamento de raios-X da sua função do Lambda tem um tempo de permanência alto. Se isso acontecer, use o console do CloudWatch para verificar se suas funções do Lambda nessa região têm o menor número de erros e limitações. Certifique-se de selecionar todas as funções e, em seguida, selecionar as métricas Errors e Throttles.

Observação: a fila interna do Lambda pode fazer backup quando centenas de erros e acelerações em todas as funções são invocadas de forma assíncrona.Esse backup pode atrasar as invocações de funções. Como melhor prática, mantenha a taxa de erro e aceleração no mínimo para evitar atrasos indesejados. Para obter mais informações, consulte Invocação assíncrona.

2.Defina uma fila de destino do Amazon Simple Queue Service (Amazon SQS) ou uma função do Lambda para tratamento separado. Isso evita a perda de mensagens e é feito porque a duração máxima dos eventos assíncronos pode ser de seis horas para uma função do Lambda.

AWS OFICIAL
AWS OFICIALAtualizada há 4 meses