Invocación de una función de Lambda desde una alarma - Amazon CloudWatch

Invocación de una función de Lambda desde una alarma

Las alarmas de CloudWatch garantizan una invocación asíncrona de la función de Lambda para un cambio de estado determinado, excepto en los siguientes casos:

  • Cuando la función no existe.

  • Cuando CloudWatch no está autorizado a invocar la función de Lambda.

Si CloudWatch no puede acceder al servicio de Lambda o el mensaje se rechaza por otro motivo, CloudWatch lo volverá a intentar hasta que la invocación se realice correctamente. Lambda pone en cola el mensaje y maneja los reintentos de ejecución. Para obtener más información sobre este modelo de ejecución, incluida la información sobre cómo Lambda gestiona los errores, consulte Invocación asíncrona en la Guía para desarrolladores de AWS Lambda.

Puede invocar una función de Lambda en la misma cuenta o en otras cuentas de AWS.

Al especificar una alarma para invocar una función de Lambda como acción de alarma, puede elegir especificar el nombre de la función, el alias de la función o una versión específica de la función.

Al especificar una función de Lambda como acción de la alarma, debe crear una política de recursos para la función para permitir que la entidad principal del servicio de CloudWatch invoque la función.

Una forma de hacerlo es utilizar AWS CLI, como en el siguiente ejemplo:

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

Como alternativa, puede crear una política similar a uno de los ejemplos siguientes y, a continuación, asignarla a la función.

El siguiente ejemplo especifica la cuenta en la que se encuentra la alarma, de modo que solo las alarmas de esa cuenta (111122223333) pueden invocar la función.

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

El siguiente ejemplo tiene un ámbito más limitado, lo que permite que solo la alarma especificada en la cuenta especificada invoque la función.

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

No recomendamos crear una política que no especifique una cuenta de origen, ya que dichas políticas son vulnerables a errores del suplente confuso.

Adición de métricas de Lambda a las investigaciones de CloudWatch

Puede agregar métricas de Lambda a sus investigaciones activas de CloudWatch. Al investigar un problema, las métricas de Lambda pueden proporcionar información valiosa sobre el rendimiento y el comportamiento de las funciones. Por ejemplo, si investiga un problema de rendimiento de una aplicación, las métricas de Lambda, como la duración, las tasas de error o las limitaciones, pueden ayudar a identificar la causa raíz.

Adición de métricas de Lambda a las investigaciones de CloudWatch:

  1. Abra la consola de AWS Lambda en https://console.aws.amazon.com/lambda/.

  2. En la sección Monitorear, busque la métrica.

  3. Abra el menú contextual de la métrica y elija Investigar y, a continuación, Agregar a la investigación. A continuación, en el panel Investigar, seleccione el nombre de la investigación.

Objeto de evento enviado desde CloudWatch a Lambda

Al configurar una función de Lambda como acción de la alarma, CloudWatch entrega una carga útil de JSON a la función de Lambda cuando la invoca. Esta carga útil de JSON sirve como objeto de evento para la función. Puede extraer datos de este objeto JSON y utilizarlo en la función. El siguiente ejemplo muestra un objeto de evento de una alarma de métricas.

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

El siguiente ejemplo muestra un objeto de evento de una alarma compuesta.

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