Invocation d’une fonction Lambda à partir d’une alarme - Amazon CloudWatch

Invocation d’une fonction Lambda à partir d’une alarme

Les alarmes CloudWatch garantissent une invocation asynchrone de la fonction Lambda lorsqu’un changement d’état se produit, sauf dans les cas suivants :

  • Lorsque la fonction n’existe pas.

  • Lorsque CloudWatch n’est pas autorisé à invoquer la fonction Lambda.

Si CloudWatch ne parvient pas à contacter le service Lambda ou si le message est rejeté pour une autre raison, CloudWatch réessaie jusqu’à ce que l’invocation soit réussie. Lambda met le message en file d’attente et gère les nouvelles tentatives d’exécution. Pour plus d’informations sur ce modèle d’exécution, y compris la gestion des erreurs par Lambda, consultez Invocation asynchrone dans le Guide du développeur AWS Lambda.

Vous pouvez invoquer une fonction Lambda dans le même compte ou dans d’autres comptes AWS.

Lorsque vous spécifiez une alarme pour invoquer une fonction Lambda en tant qu’action d’alarme, vous pouvez choisir de spécifier le nom de la fonction, son alias ou une version spécifique d’une fonction.

Lorsque vous spécifiez une fonction Lambda comme action d’alarme, vous devez créer une politique de ressources pour la fonction afin d’autoriser le principal du service CloudWatch à invoquer la fonction.

Pour ce faire, vous pouvez utiliser l’AWS CLI, comme dans l’exemple suivant :

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

Vous pouvez également créer une politique similaire à l’un des exemples suivants, puis l’attribuer à la fonction.

L’exemple suivant spécifie sur quel compte se trouve l’alarme, de sorte que seules les alarmes de ce compte (111122223333) peuvent invoquer la fonction.

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

L’exemple suivant a un champ d’application plus restreint, ne permettant qu’à l’alarme spécifiée dans le compte indiqué d’invoquer la fonction.

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

Nous ne recommandons pas la création d’une politique ne spécifiant aucun compte source, car ce type de politique est vulnérable aux problèmes d’adjoints confus.

Ajout des métriques Lambda aux enquêtes CloudWatch

Vous pouvez ajouter des métriques Lambda à vos enquêtes CloudWatch actives. Lors de l’analyse d’un problème, les métriques Lambda peuvent fournir des renseignements utiles sur la performance et le comportement de la fonction. Par exemple, si vous analysez un problème de performance d’une application, les métriques Lambda comme la durée, le taux d’erreurs ou la limitation peuvent aider à en identifier la cause profonde.

Pour ajouter des métriques Lambda aux enquêtes CloudWatch :

  1. Ouvrez la console AWS Lambda à l’adresse https://console.aws.amazon.com/lambda/.

  2. Dans la section Surveillance, recherchez la métrique.

  3. Ouvrez le menu contextuel de la métrique, sélectionnez Enquêter, puis Ajouter à l’enquête. Ensuite, dans le volet Enquêter, sélectionnez le nom de l’enquête.

Objet d’événement envoyé de CloudWatch à Lambda

Lorsque vous configurez une fonction Lambda en tant qu’action d’alarme, CloudWatch fournit une charge utile JSON à la fonction Lambda lorsqu’elle l’invoque. Cette charge utile JSON sert d’objet d’événement pour la fonction. Vous pouvez extraire des données de cet objet JSON et les utiliser dans votre fonction. Voici un exemple d’objet d’événement provenant d’une alarme de métrique.

{ '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 } ] } } }

Voici un exemple d’objet d’événement provenant d’une alarme composite.

{ '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 } } }