

# 경보에서 Lambda 함수 간접 호출
<a name="alarms-and-actions-Lambda"></a>

CloudWatch 경보는 주어진 상태 변경에 대해 Lambda 함수의 비동기 호출을 보장합니다. 단, 다음과 같은 경우는 예외입니다.
+ 함수가 존재하지 않는 경우.
+ CloudWatch가 Lambda 함수를 호출할 권한이 없는 경우.

CloudWatch가 Lambda 서비스에 연결할 수 없거나 다른 이유로 메시지가 거부된 경우, CloudWatch는 호출이 성공할 때까지 재시도합니다. Lambda는 메시지를 대기열에 추가하여 실행 재시도를 처리합니다. Lambda가 오류를 처리하는 방법에 대한 정보 등 이 실행 모델에 대한 자세한 내용은 AWS Lambda 개발자 안내서의 [비동기 호출](https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html)을 참조하세요.

동일한 계정이나 다른 AWS 계정에서 Lambda 함수를 호출할 수 있습니다.

Lambda 함수를 경보 작업으로 간접적으로 호출하도록 경보를 지정하는 경우 함수 이름, 함수 별칭 또는 특정 버전의 함수를 지정하도록 선택할 수 있습니다.

Lambda 함수를 경보 작업으로 지정할 때 CloudWatch 서비스 보안 주체가 함수를 호출할 수 있도록 함수에 대한 리소스 정책을 생성해야 합니다.

이를 수행하는 한 가지 방법은 다음 예제와 같이 AWS CLI를 사용하는 것입니다.

```
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
```

또는 다음 예제 중 하나와 비슷한 정책을 생성한 다음, 함수에 할당할 수 있습니다.

다음 예제에서는 경보가 있는 계정을 지정하여 해당 계정(111122223333)의 경보만 함수를 간접적으로 호출할 수 있도록 합니다.

------
#### [ 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"
            }
        }
    }]
}
```

------

다음 예제는 범위가 좁아 지정된 계정의 지정된 경보만 함수를 간접적으로 호출할 수 있습니다.

------
#### [ 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}}"
        }
      }
    }]
}
```

------

소스 계정을 지정하지 않는 정책은 혼동된 대리자 문제에 취약하므로 이러한 정책은 생성하지 않는 것이 좋습니다.

## CloudWatch 조사에 Lambda 지표 추가
<a name="Lambda-metrics-investigation"></a>

활성 CloudWatch 조사에 Lambda 지표를 추가할 수 있습니다. 문제를 조사할 때 Lambda 지표는 함수 성능 및 동작에 대한 중요한 인사이트를 제공할 수 있습니다. 예를 들어 애플리케이션 성능 문제를 조사하는 경우 기간, 오류율 또는 스로틀과 같은 Lambda 지표가 근본 원인을 식별하는 데 도움이 될 수 있습니다.

CloudWatch 조사에 Lambda 지표를 추가하는 방법:

1. [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)에서 AWS Lambda 콘솔을 엽니다.

1. **모니터링** 섹션에서 지표를 찾습니다.

1. 지표의 컨텍스트 메뉴를 열고 **조사**, **조사에 추가**를 선택하세요. 그런 다음 **조사** 창에서 조사 이름을 선택하세요.

## CloudWatch에서 Lambda로 전송된 이벤트 객체
<a name="Lambda-action-payload"></a>

Lambda 함수를 경보 작업으로 구성하면 CloudWatch는 함수를 간접적으로 호출할 때 Lambda 함수에 JSON 페이로드를 전송합니다. 이 JSON 페이로드는 함수의 이벤트 객체 역할을 합니다. 이 JSON 객체에서 데이터를 추출하여 함수에 사용할 수 있습니다. 다음은 지표 경보의 이벤트 객체에 대한 예제입니다.

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

다음은 복합 경보의 이벤트 객체에 대한 예제입니다.

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