Invocar uma função do Lambda de um alarme - Amazon CloudWatch

Invocar uma função do Lambda de um alarme

Os alarmes do CloudWatch garantem uma invocação assíncrona da função do Lambda para uma determinada alteração de estado, exceto nos seguintes casos:

  • Quando a função não existe.

  • Quando o CloudWatch não está autorizado a invocar a função do Lambda.

Se o CloudWatch não conseguir acessar o serviço do Lambda ou se a mensagem for rejeitada por outro motivo, o CloudWatch tentará novamente até que a invocação seja bem-sucedida. O Lambda enfileira a mensagem e processa novas tentativas de execução. Para obter mais informações sobre esse modelo de execução, incluindo informações sobre como o Lambda lida com erros, consulte Invocação assíncrona no Guia do desenvolvedor do AWS Lambda.

Você pode invocar uma função do Lambda na mesma conta ou em outras contas da AWS.

Ao especificar um alarme para invocar uma função do Lambda como uma ação de alarme, é possível optar por especificar o nome da função, o alias da função ou uma versão específica de uma função.

Ao especificar uma função do Lambda como uma ação de alarme, você deve criar uma política de recursos para a função com a finalidade de permitir que a entidade principal de serviço do CloudWatch invoque a função.

Uma maneira de fazer isso é ao usar a AWS CLI, como no seguinte exemplo:

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, é possível criar uma política semelhante a um dos exemplos apresentados a seguir e, em seguida, atribuí-la à função.

O exemplo apresentado a seguir especifica a conta na qual o alarme está localizado, portanto, somente os alarmes dessa conta (111122223333) podem invocar a função.

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

O exemplo apresentado a seguir tem um escopo mais restrito, permitindo que somente o alarme especificado na conta indicada invoque a função.

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

Não recomendamos a criação de uma política que não especifique uma conta de origem, porque essas políticas são vulneráveis ​​a problemas de “confused deputy”.

Adicionar métricas do Lambda às investigações do CloudWatch

Você pode adicionar métricas do Lambda às suas investigações ativas do CloudWatch. Ao investigar um problema, as métricas do Lambda podem fornecer insights valiosos sobre performance e comportamento da função. Por exemplo, se você estiver investigando um problema de performance da aplicação, as métricas do Lambda, como duração, taxas de erro ou controles de utilização, podem ajudar a identificar a causa raiz.

Para adicionar métricas do Lambda às investigações do CloudWatch:

  1. Abra o console AWS Lambda em https://console.aws.amazon.com/lambda/.

  2. Na seção Monitorar, encontre a métrica.

  3. Abra o menu de contexto da métrica, escolha Investigar, Adicionar à investigação. Em seguida, no painel Investigar, selecione o nome da investigação.

Objeto de evento enviado do CloudWatch para o Lambda

Ao configurar uma função do Lambda como uma ação de alarme, o CloudWatch entrega uma carga JSON à função do Lambda quando invoca a função. Essa carga JSON serve como o objeto de evento para a função. É possível extrair dados desse objeto em JSON e usá-los em sua função. Veja a seguir um exemplo de um objeto de evento de um alarme de métrica.

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

Veja a seguir um exemplo de um objeto de evento de um alarme composto.

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