Warum ruft Amazon SNS meine Lambda-Funktion nicht auf, wenn sie durch einen CloudWatch-Alarm ausgelöst wird?

Lesedauer: 5 Minute
0

Ich möchte, dass Amazon Simple Notification Service (Amazon SNS) meine AWS Lambda-Funktion aufruft, wenn sie durch einen Amazon CloudWatch-Alarm ausgelöst wird.

Kurzbeschreibung

Die folgenden Szenarien verhindern, dass Sie Ihre Lambda-Funktion aufrufen:

  • Die Ressourcenrichtlinie Ihrer Lambda-Funktion hat keinen Zugriff auf den Aufrufen der Funktion über das SNS-Thema gewährt. Führen Sie für dieses Szenario die Schritte im Abschnitt Überprüfen Sie das ressourcenbasierte Richtliniendokument für Ihre Lambda-Funktion aus.
  • Ihre Lambda-Funktionsaufrufe werden verzögert. Für dieses Szenario führen Sie die Schritte im Abschnitt Überprüfen Sie Ihre Amazon SNS-Versandprotokolle aus.

Hinweis: Die Lösung geht davon aus, dass Sie die Publish-API für Ihr SNS-Thema aufrufen können, aber Fehler zwischen Amazon SNS und der Lambda-Integration erhalten. Wenn Sie keine Aktivitäten zu Ihrem SNS-Thema sehen, siehe Warum habe ich keine SNS-Benachrichtigung für meinen CloudWatch-Alarmauslöser erhalten? Diese Aktivität kann die folgenden CloudWatch-Metriken beinhalten: NumberOfMessagesPublished, NumberOfNotificationsDelivered, oder NumberOfNotificationsFailed

Behebung

Hinweis: Wenn bei der Ausführung von AWS Command Line Interface (AWS CLI)-Befehlen Fehler auftreten, lesen Sie bitte den Abschnitt Fehlerbehebung bei AWS CLI-Befehlen. Stellen Sie außerdem sicher, dass Sie die neueste Version von AWS CLI verwenden.

Überprüfen Sie das ressourcenbasierte Richtliniendokument für Ihre Lambda-Funktion

Wenn Amazon SNS eine Lambda-Funktion asynchron aufruft, gibt Lambda einen 202 HTTP-Statuscode an Amazon SNS zurück. Der Statuscode zeigt an, dass Lambda die Nachricht zur weiteren Verarbeitung angenommen hat. Weitere Informationen finden Sie unter Asynchroner Aufruf. Wenn Sie eine fehlgeschlagene Antwort erhalten, überprüfen Sie Ihren Amazon SNS-Zustellungsprotokolle für weitere Informationen.

Wählen Sie eine Lösung, die auf dem Szenario in Ihrem Konto basiert.

Wenn sich Ihr SNS-Thema und Ihre Lambda-Funktion demselben Konto angehören:

  1. Öffnen Sie die Lambda-Konsole.

  2. Wählen Sie im Navigationsbereich Funktionen aus, und wählen Sie dann Ihre Funktion aus.

  3. Wählen Sie die Registerkarte Konfiguration und anschließend Berechtigungen aus.

  4. Wählen Sie im Abschnitt Ressourcen-basierte Richtlinie die Richtlinien-aussage aus der Spalte Kontoauszugs-ID aus, um Ihr Richtliniendokument anzuzeigen. Sie sehen das folgende Richtliniendokument:

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

Hinweis: Um Ihr Richtliniendokument in JSON anzuzeigen, wählen Sie Richtliniendokument anzeigen im Abschnitt Ressourcen-basierte Richtlinie.

Wenn Ihnen die Lambda-Ressourcenrichtlinie fehlt, die Amazon SNS Zugriff zum Aufrufen der Funktion gewährt, fügen Sie Ihrem Richtliniendokument die folgende Funktion hinzu. Verwenden Sie die Lambda-Konsole oder die AWS CLI oder AWS CloudShell.

Verwenden Sie die Befehlszeile wie unten gezeigt:

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

Hinweis: Ersetzen Sie Ihr-lambda-Funktionsname, Ihre-aws-region, Ihre-aws-konto-id, und your-sns-topic-name durch Ihre Werte. Der AWS CLI-Befehl verwendet die standardmäßige AWS-Region. Sie können die Standardregion mit der Flag --region überschreiben, wenn sich Ihre Lambda-Funktion in einer anderen Region befindet.

Verwenden Sie die Lambda-Konsole wie unten gezeigt:

  1. Öffnen Sie die Lambda-Konsole.

  2. Wählen Sie im Navigationsbereich Funktionen aus, und wählen Sie dann Ihre Funktion aus.

  3. Wählen Sie die Registerkarte Konfiguration und anschließend Berechtigungen aus.

  4. Wählen Sie im Abschnitt Ressourcen-basierte Richtlinie die Option Berechtigungen hinzufügen aus.

  5. Wählen Sie für Prinzipal sns.amazonaws.com aus.

  6. Wählen Sie für Aktionen Lambda:InvokeFunction aus.

  7. Geben Sie für Kontoauszugs-ID eine eindeutige ID ein.

  8. Wählen Sie Speichern aus.

Wenn sich Ihr SNS-Thema und Ihre Lambda-Funktion in unterschiedlichen Konten befinden:

  1. Einrichten von kontoübergreifende Berechtigungen.

  2. Verwenden Sie in Ihren CloudWatch-Protokollen die Protokollierung des Versandstatus, um zu überprüfen, ob Amazon SNS erfolgreich eine Nachricht an Lambda oder die CloudWatch-Metrik NumberOfNotificationsDelivered gesendet hat.

Beispiel für eine erfolgreiche Antwort zwischen Amazon SNS und 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"
}

Prüfen Sie Ihre Amazon SNS-Versandprotokolle

Überprüfen Sie die Versandprotokolle Ihres SNS-Themas für Ihre Lambda-Funktion. Wenn die Antwort erfolgreich ist, wird ein 202-Statuscode angezeigt.

Gehen Sie wie folgt vor, um CloudWatch-Protokolle für Ihr SNS-Thema anzuzeigen:

  1. Öffnen Sie die CloudWatch-Konsole.

  2. Wählen Sie im Navigationsbereich Protokolle und dann Protokollgruppen aus.

  3. Geben Sie im Filtersuchfeld den Namen Ihres SNS-Themas ein. Es werden zwei Protokollgruppen für Ihr SNS-Thema angezeigt, eine für Erfolge und eine für Misserfolge.

  4. Wählen Sie die Erfolgsprotokollgruppe aus.

  5. Wählen Sie im Protokollstream -Abschnitt die Option Alles durchsuchen aus.

Hinweis: Sie können den Zeitstempel der Anfrage auch in der Spalte Zeit des letzten Ereignisses überprüfen. Suchen Sie dann nach dem Amazon-Ressourcennamen (ARN) und dem Namen der Lambda-Funktion.

  1. Wählen Sie in der Spalte Protokollstream den Protokollstream aus, um ihn zu öffnen.

Wenn Sie keine Ergebnisse sehen, gehen Sie wie folgt vor:

  1. Wählen Sie Protokollgruppen und dann die Fehlerprotokollgruppen aus.

  2. Wählen Sie im Protokollstream-Abschnitt die Option Alles durchsuchen aus.

  3. Wählen Sie in der Spalte Protokollstream den Protokollstream aus, um ihn zu öffnen.

Gehen Sie wie folgt vor, um Fehler in Protokollgruppen zu beheben:

  1. Prüfen Sie, ob die Röntgenkurve Ihrer Lambda-Funktion eine hohe Verweilzeit hat. Ist dies der Fall, überprüfen Sie mithilfe der CloudWatch-Konsole, ob Ihre Lambda-Funktionen in dieser Region die geringste Anzahl von Fehlern und Drosselungen aufweisen. Achten Sie darauf, alle Funktionen auszuwählen, und wählen Sie dann die Metriken Fehler und Drosselungen aus.

Hinweis: Die interne Lambda-Warteschlange kann gesichert werden, wenn Hunderte von Fehler und Drosselungen für alle Funktionen asynchron aufgerufen werden. Dieses Backup kann Funktionsaufrufe verzögern. Es hat sich bewährt, die Fehler- und Drosselungsrate so gering wie möglich zu halten, um unerwünschte Verzögerungen zu vermeiden. Weitere Informationen finden Sie unter Asynchroner Aufruf.

  1. Legen Sie eine Amazon Simple Queue Service (Amazon SQS)-Zielwarteschlange oder eine Lambda-Funktion für die separate Behandlung fest. Dies verhindert den Verlust von Nachrichten und wird durchgeführt, weil das maximale Alter der asynchronen Ereignisse für eine Lambda-Funktion sechs Stunden betragen kann.
AWS OFFICIAL
AWS OFFICIALAktualisiert vor 4 Monaten