Aufrufen einer Lambda-Funktion von einem Alarm - Amazon CloudWatch

Aufrufen einer Lambda-Funktion von einem Alarm

CloudWatch-Alarme garantieren einen asynchronen Aufruf der Lambda-Funktion für eine bestimmte Statusänderung, außer in den folgenden Fällen:

  • Wenn die Funktion nicht vorhanden ist.

  • Wenn CloudWatch nicht berechtigt ist, die Lambda-Funktion aufzurufen.

Wenn CloudWatch den Lambda-Service nicht erreichen kann oder die Nachricht aus einem anderen Grund zurückgewiesen wird, versucht CloudWatch es erneut, bis der Aufruf erfolgreich ist. Lambda legt die Nachricht in eine Warteschlange und verarbeitet Ausführungswiederholungen. Weitere Informationen zu diesem Ausführungsmodell, einschließlich Informationen darüber, wie Lambda mit Fehlern umgeht, finden Sie unter Asynchroner Aufruf im Entwicklerhandbuch zu AWS Lambda.

Sie können eine Lambda-Funktion in demselben oder in anderen AWS-Konten aufrufen.

Wenn Sie einen Alarm angeben, um eine Lambda-Funktion als Alarmaktion aufzurufen, können Sie wählen, ob Sie den Funktionsnamen, den Funktionsalias oder eine bestimmte Version einer Funktion angeben möchten.

Wenn Sie eine Lambda-Funktion als Alarmaktion angeben, müssen Sie eine Ressourcenrichtlinie für die Funktion erstellen, damit der CloudWatch-Service-Prinzipal die Funktion aufrufen kann.

Eine Möglichkeit dies zu tun ist mit der AWS CLI, wie im folgenden Beispiel gezeigt:

aws lambda add-permission \ --function-name my-function-name \ --statement-id AlarmAction \ --action 'lambda:InvokeFunction' \ --principal lambda.alarms.cloudwatch.amazonaws.com \ --source-account 111122223333 \ --source-arn arn:aws:cloudwatch:us-east-1:111122223333:alarm:alarm-name

Alternativ können Sie eine Richtlinie erstellen, die einem der folgenden Beispiele ähnelt, und sie dann der Funktion zuweisen.

Im folgenden Beispiel wird das Konto angegeben, in dem sich der Alarm befindet, sodass nur Alarme in diesem Konto (111122223333) die Funktion aufrufen können.

JSON
{ "Version":"2012-10-17", "Id": "default", "Statement": [{ "Sid": "AlarmAction", "Effect": "Allow", "Principal": { "Service": "lambda.alarms.cloudwatch.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-1:444455556666:function:function-name", "Condition": { "StringEquals": { "AWS:SourceAccount": "111122223333" } } }] }

Das folgende Beispiel hat einen engeren Gültigkeitsbereich, sodass nur der angegebene Alarm im angegebenen Konto die Funktion aufrufen kann.

JSON
{ "Version":"2012-10-17", "Id": "default", "Statement": [ { "Sid": "AlarmAction", "Effect": "Allow", "Principal": { "Service": "lambda.alarms.cloudwatch.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-1:444455556666:function:function-name", "Condition": { "StringEquals": { "AWS:SourceAccount": "111122223333", "AWS:SourceArn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:alarm-name" } } }] }

Es wird nicht empfohlen, eine Richtlinie zu erstellen, in der kein Quellkonto angegeben ist, da solche Richtlinien anfällig für „Probleme durch verwirrte Stellvertreter“ sind.

Lambda-Metriken zu CloudWatch-Untersuchungen hinzufügen

Sie können Lambda-Metriken zu Ihren aktiven CloudWatch-Untersuchungen hinzufügen. Bei der Untersuchung eines Problems können Lambda-Metriken wertvolle Erkenntnisse über die Leistung und das Verhalten von Funktionen liefern. Wenn Sie beispielsweise ein Problem mit der Anwendungsleistung untersuchen, können Lambda-Metriken wie Dauer, Fehlerraten oder Drosselungen dabei helfen, die Ursache zu identifizieren.

So fügen Sie Lambda-Metriken zu CloudWatch-Untersuchungen hinzu

  1. Öffnen Sie die AWS Lambda-Konsole unter https://console.aws.amazon.com/lambda/.

  2. Suchen Sie im Abschnitt Monitor nach der Metrik.

  3. Öffnen Sie das Kontextmenü für die Metrik und wählen Sie Untersuchen, Zur Untersuchung hinzufügen aus. Wählen Sie dann im Bereich Untersuchen den Namen der Untersuchung aus.

Von CloudWatch an Lambda gesendetes Ereignisobjekt

Wenn Sie eine Lambda-Funktion als Alarmaktion konfigurieren, übermittelt CloudWatch eine JSON-Nutzlast an die Lambda-Funktion, wenn sie die Funktion aufruft. Diese JSON-Nutzlast dient als Ereignisobjekt für die Funktion. Sie können Daten aus diesem JSON-Objekt extrahieren und in Ihrer Funktion verwenden. Das folgende ist ein Beispiel eines Ereignisobjekts aus einem Metrikalarm.

{ 'source': 'aws.cloudwatch', 'alarmArn': 'arn:aws:cloudwatch:us-east-1:444455556666:alarm:lambda-demo-metric-alarm', 'accountId': '444455556666', 'time': '2023-08-04T12:36:15.490+0000', 'region': 'us-east-1', 'alarmData': { 'alarmName': 'lambda-demo-metric-alarm', 'state': { 'value': 'ALARM', 'reason': 'test', 'timestamp': '2023-08-04T12:36:15.490+0000' }, 'previousState': { 'value': 'INSUFFICIENT_DATA', 'reason': 'Insufficient Data: 5 datapoints were unknown.', 'reasonData': '{"version":"1.0","queryDate":"2023-08-04T12:31:29.591+0000","statistic":"Average","period":60,"recentDatapoints":[],"threshold":5.0,"evaluatedDatapoints":[{"timestamp":"2023-08-04T12:30:00.000+0000"},{"timestamp":"2023-08-04T12:29:00.000+0000"},{"timestamp":"2023-08-04T12:28:00.000+0000"},{"timestamp":"2023-08-04T12:27:00.000+0000"},{"timestamp":"2023-08-04T12:26:00.000+0000"}]}', 'timestamp': '2023-08-04T12:31:29.595+0000' }, 'configuration': { 'description': 'Metric Alarm to test Lambda actions', 'metrics': [ { 'id': '1234e046-06f0-a3da-9534-EXAMPLEe4c', 'metricStat': { 'metric': { 'namespace': 'AWS/Logs', 'name': 'CallCount', 'dimensions': { 'InstanceId': 'i-12345678' } }, 'period': 60, 'stat': 'Average', 'unit': 'Percent' }, 'returnData': True } ] } } }

Das folgende ist ein Beispiel eines Ereignisobjekts aus einem zusammengesetzten Alarm.

{ 'source': 'aws.cloudwatch', 'alarmArn': 'arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.Main', 'accountId': '111122223333', 'time': '2023-08-04T12:56:46.138+0000', 'region': 'us-east-1', 'alarmData': { 'alarmName': 'CompositeDemo.Main', 'state': { 'value': 'ALARM', 'reason': 'arn:aws:cloudwatch:us-east-1:111122223333:alarm:CompositeDemo.FirstChild transitioned to ALARM at Friday 04 August, 2023 12:54:46 UTC', 'reasonData': '{"triggeringAlarms":[{"arn":"arn:aws:cloudwatch:us-east-1:111122223333:alarm:CompositeDemo.FirstChild","state":{"value":"ALARM","timestamp":"2023-08-04T12:54:46.138+0000"}}]}', 'timestamp': '2023-08-04T12:56:46.138+0000' }, 'previousState': { 'value': 'ALARM', 'reason': 'arn:aws:cloudwatch:us-east-1:111122223333:alarm:CompositeDemo.FirstChild transitioned to ALARM at Friday 04 August, 2023 12:54:46 UTC', 'reasonData': '{"triggeringAlarms":[{"arn":"arn:aws:cloudwatch:us-east-1:111122223333:alarm:CompositeDemo.FirstChild","state":{"value":"ALARM","timestamp":"2023-08-04T12:54:46.138+0000"}}]}', 'timestamp': '2023-08-04T12:54:46.138+0000', 'actionsSuppressedBy': 'WaitPeriod', 'actionsSuppressedReason': 'Actions suppressed by WaitPeriod' }, 'configuration': { 'alarmRule': 'ALARM(CompositeDemo.FirstChild) OR ALARM(CompositeDemo.SecondChild)', 'actionsSuppressor': 'CompositeDemo.ActionsSuppressor', 'actionsSuppressorWaitPeriod': 120, 'actionsSuppressorExtensionPeriod': 180 } } }