Perché Amazon SNS non richiama la mia funzione Lambda quando viene attivata da un allarme CloudWatch?

6 minuti di lettura
0

Desidero che Amazon Simple Notification Service (Amazon SNS) richiami la mia funzione AWS Lambda quando viene attivata da un allarme Amazon CloudWatch.

Breve descrizione

I seguenti scenari ti impediscono di richiamare la tua funzione Lambda:

  • La policy delle risorse della tua funzione Lambda non ha concesso l'accesso per richiamare la funzione dall'argomento SNS. Per questo scenario, completa i passaggi descritti nella sezione Verifica il documento di policy basato sulle risorse per la tua funzione Lambda.
  • Le chiamate alla funzione Lambda sono ritardate. Per questo scenario, completa i passaggi descritti nella sezione Verifica i log di consegna di Amazon SNS.

Nota: la risoluzione presuppone che tu possa chiamare l'API Pubblica sull'argomento SNS, ma si verificano errori tra Amazon SNS e l'integrazione Lambda. Se non riesci a visualizzare alcuna attività sul tuo argomento SNS, consulta la sezione Why doesn't Amazon SNS invoke my Lambda function when triggered by a CloudWatch alarm? Tale attività può includere i seguenti parametri di CloudWatch: NumberOfMessagesPublished, NumberOfNotificationsDelivered o NumberOfNotificationsFailed

Risoluzione

Nota: se ricevi messaggi di errore durante l'esecuzione dei comandi dell'interfaccia della linea di comando AWS (AWS CLI), consulta la sezione Risolvi gli errori AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

Consulta il documento di policy basato sulle risorse per la tua funzione Lambda

Quando Amazon SNS richiama una funzione Lambda in modo asincrono, Lambda restituisce ad Amazon SNS un codice di stato HTTP 202. Il codice di stato indica che Lambda ha accettato il messaggio per una successiva elaborazione. Per ulteriori informazioni, consulta la sezione Invocazione asincrona. Se ricevi una risposta non riuscita, controlla i log di consegna di Amazon SNS per ulteriori informazioni.

Scegli una risoluzione in base allo scenario del tuo account.

Se l'argomento SNS e la funzione Lambda sono nello stesso account:

1.    Apri la console Lambda.

2.    Nel pannello di navigazione, scegli Funzioni, quindi scegli la tua funzione.

3.    Seleziona la scheda Configurazione, quindi scegli Autorizzazioni.

4.    Nella sezione Policy basata sulle risorse, scegli l'istruzione di policy dalla colonna ID istruzione per visualizzare il documento di policy. Verrà visualizzato il seguente documento di policy:

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" }

Nota: per visualizzare il documento di policy in JSON, scegli Visualizza documento di policy nella sezione Policy basata sulle risorse.

Se ti manca la policy delle risorse Lambda che concede ad Amazon SNS l'accesso per richiamare la funzione, aggiungi la seguente funzione al documento di policy. Usa la console Lambda o l'interfaccia AWS CLI o AWS CloudShell.

Usa la linea di comando come mostrato di seguito:

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

Nota: sostituisci your-lambda-function-name, your-aws-region, your-aws-account-id e your-sns-topic-name con i tuoi valori. Il comando AWS CLI utilizza la Regione AWS predefinita. Se la tua funzione Lambda si trova in una regione diversa, puoi sovrascrivere la regione predefinita con il flag --region.

Usa la console Lambda come mostrato di seguito:

1.    Apri la console Lambda.

2.    Nel pannello di navigazione, scegli Funzioni, quindi scegli la tua funzione.

3.    Seleziona la scheda Configurazione, quindi scegli Autorizzazioni.

4.    Nella sezione Policy basata sulle risorse, scegli Aggiungi autorizzazioni.

5.    In Principale, seleziona sns.amazonaws.com.

6.    In Azioni, seleziona Lambda:InvokeFunction.

7.    In ID istruzione inserisci un ID univoco.

8.    Scegli Salva.

Se l'argomento SNS e la funzione Lambda si trovano in account diversi:

1.    Configura le autorizzazioni multi-account..

2.    Nei tuoi log di CloudWatch, utilizza la registrazione dello stato della consegna per verificare che Amazon SNS abbia inviato correttamente un messaggio a Lambda o il parametro NumberOfNotificationsDelivered di CloudWatch.

Esempio di risposta andata a buon fine tra Amazon SNS e 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"
}

Controlla i log di consegna di Amazon SNS

Controlla i log di consegna del tuo argomento SNS alla funzione Lambda. Se la risposta ha esito positivo, verrà visualizzato un codice di stato 202.

Per visualizzare i log di CloudWatch relativi al tuo argomento SNS, procedi come segue:

1.    Apri la console CloudWatch.

2.    Nel pannello di navigazione, scegli Log, quindi scegli Gruppi di log.

3.    Nella casella di ricerca con filtro, inserisci il nome del tuo argomento SNS. Verranno visualizzati due gruppi di log per l'argomento SNS: uno per le operazioni riuscite e uno per le operazioni non andate a buon fine.

4.    Scegli il gruppo di log delle operazioni riuscite.

5.    Nella sezione Flussi di log, scegli Cerca tutto.

Nota: puoi anche controllare il timestamp della richiesta nella colonna Ora ultimo evento. Quindi, cerca l'Amazon Resource Name (ARN) e il nome della funzione Lambda.

6.    Dalla colonna Flusso di log, scegli il flusso di log per aprirlo.

Se non vedi alcun risultato, procedi come segue:

1.    Scegli Gruppi di log, quindi scegli i gruppi di log delle operazioni non riuscite.

2.    Nella sezione Flussi di log, scegli Cerca tutto.

3.    Dalla colonna Flusso di log, scegli il flusso di log per aprirlo.

Per risolvere i problemi relativi ai gruppi di log delle operazioni non riuscite, procedi come segue:

1.    Controlla se la traccia X-Ray della tua funzione Lambda ha un tempo di dimora elevato. In tal caso, utilizza la console CloudWatch per verificare che le tue funzioni Lambda in quella regione abbiano il minor numero di errori e limitazioni. Assicurati di selezionare tutte le funzioni, quindi seleziona i parametri Errori e Limitazioni.

Nota: la coda interna a Lambda può eseguire il backup quando centinaia di errori e limitazioni tra le funzioni vengono richiamati in modo asincrono.  Questo backup può ritardare le invocazioni delle funzioni. È consigliabile mantenere la frequenza di errori e limitazioni al minimo per evitare ritardi indesiderati. Per ulteriori informazioni, consulta la sezione Invocazione asincrona.

2.    Imposta una coda di destinazione Amazon Simple Queue Service (Amazon SQS) o una funzione Lambda per una gestione separata. Ciò impedirà la perdita di messaggi e viene fatto perché la durata massima degli eventi asincroni può essere di sei ore per una funzione Lambda.

AWS UFFICIALE
AWS UFFICIALEAggiornata 3 mesi fa