블로그 릴레이 - CDK 로 Lambda의 CloudWatch Monitoring 리소스 구현해 보기

블로그 릴레이 - CDK 로 Lambda의 CloudWatch Monitoring 리소스 구현해 보기

안녕하세요 생산지원 그룹 리테일 어플리케이션부의 김승연입니다. 본 블로그는 당사의 한국어 블로그 릴레이의 2025년 열 번째 블로그입니다. 이번 블로그의 주제는 「CDK 로 Lambda의 CloudWatch Monitoring 리소스 구현해 보기」 입니다.
Clock Icon2025.04.05

안녕하세요 생산지원 그룹 리테일 어플리케이션부의 김승연입니다.

본 블로그는 당사의 한국어 블로그 릴레이의 2025년 열 번째 블로그입니다.
이번 블로그의 주제는 「CDK 로 Lambda의 CloudWatch Monitoring 리소스 구현해 보기」 입니다.

준비

먼저 CloudWatch 리소스를 준비하기 전에 Lambda 와 ApiGateway 을 CDK로 만들어 보겠습니다.

먼저 CDK을 생성합니다.

Step1.

npx cdk init --language typescript

다음으로 아래 코드를 main stack에 넣어주세요.

Step2.

...
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const lambdaFunc = new cdk.aws_lambda_nodejs.NodejsFunction(
      this,
      'LambdaFunc',
      {
        architecture: cdk.aws_lambda.Architecture.ARM_64,
        runtime: cdk.aws_lambda.Runtime.NODEJS_20_X,
        handler: 'index.handler',
        code: cdk.aws_lambda.Code.fromInline(`
          exports.handler = async function(event, context) {
            return {
              statusCode: 200,
              body: JSON.stringify('Hello Lambda')
            };
          }
      `),
      }
    );

    const restApi = new cdk.aws_apigateway.RestApi(this, 'RestApi', {
      defaultCorsPreflightOptions: {
        allowOrigins: cdk.aws_apigateway.Cors.ALL_ORIGINS,
        allowMethods: cdk.aws_apigateway.Cors.ALL_METHODS,
        allowHeaders: cdk.aws_apigateway.Cors.DEFAULT_HEADERS,
        maxAge: cdk.Duration.minutes(5),
      }, 
      deployOptions: {
        tracingEnabled: false, 
      },
    });

    restApi.root.addMethod('GET', new cdk.aws_apigateway.LambdaIntegration(lambdaFunc));

    new cdk.CfnOutput(this, 'RestApiEndpoint', {
      value: restApi.deploymentStage.urlForPath(),
    });
  }

...

마지막으로 Deploy 후 문제없이 API가 호출되는지 확인해 주세요.

Step3.

npm run cdk bootstrap
npm run cdk deploy

문제 없다면 "Hello Lambda" 라는 텍스트가 출력됩니다.

코드 작성

준비가 끝났다면 다음으로는 CloudWatch 리소스를 만들어 보겠습니다.

Step1. logGroup 생성

Lambda 리소스의 LogGroup 을 생성합니다.
LogGroup 은 Metric Filter 의 참조 대상이 됩니다.

...

    const logGroup = new cdk.aws_logs.LogGroup(this, 'LogGroup', {
      logGroupName: `/aws/lambda/${lambdaFunc.functionName}`,
      removalPolicy: cdk.RemovalPolicy.DESTROY,
    });
...

Step2. Metric filter 생성

확인하고 싶은 Metrics(지표) 를 생성 합니다.
Metrics(지표) 에 반영되도록 Filter 를 설정할 수 있습니다.
이번에는 간단하게 "ERROR" 문자열이 포함된 경우 Metrics (지표) 에 반영되도록 하였습니다.

Filter pattern 에 관해서 상세하게 알고 싶으신 경우에는 아래의 링크를 참고해 주세요.
https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html

...
    const metricFilter = new cdk.aws_logs.MetricFilter(this,`ErrorMetricFilter`,{
        logGroup,
        metricNamespace: `Lambda/${lambdaFunc.node.id}`,
        metricName: "ERROR",
        filterPattern: { logPatternString: "ERROR" }, 
      },
    );
...

Step3. Alarm 생성

...
    const alarm = new cdk.aws_cloudwatch.Alarm(this, "ErrorAlarm", {
      alarmName: `${lambdaFunc.node.id}ErrorLog`,
      metric: metricFilter.metric({
        period: cdk.Duration.minutes(1), // 1분 마다 에러를 집계
        statistic: cdk.aws_cloudwatch.Stats.SUM, // 1분 동안 발생 한 에러 수를 집계
      }),
      threshold: 1, // 에러가 threshold 회 이상 발생하면 알람
      evaluationPeriods: 1, // 알람 발생을 평가하는 기간
      treatMissingData: cdk.aws_cloudwatch.TreatMissingData.NOT_BREACHING,
    });
...

Step4. Lambda Function 에 로그 추가

...
    const lambdaFunc = new cdk.aws_lambda_nodejs.NodejsFunction(
      this,
      'LambdaFunc',
      {
        architecture: cdk.aws_lambda.Architecture.ARM_64,
        runtime: cdk.aws_lambda.Runtime.NODEJS_20_X,
        handler: 'index.handler',
        code: cdk.aws_lambda.Code.fromInline(`
          exports.handler = async function(event, context) {
            console.error('ERROR: This is a error message'); // 로그를 추가.
            return {
              statusCode: 200,
              body: JSON.stringify('Hello Lambda')
            };
          }
      `),
      }
    );
...

Step5.

마지막으로 Deploy 후 실제 Lambda 함수를 실행한 후 Metrics(지표) 와 Alerm 에 결과가 반영되었는지 Dashboard 에서 확인해 주세요.

npm run cdk deploy

보충

이상으로 리소스 생성은 끝났습니다만, Dashboard 는 즉각적인 확인에는 조금 불편한 점이 있습니다.
그래서 마지막으로 Amazon SNS(Simple Notification Service) 을 활용해서 등록된 메일에 통지하는 기능을 추가로 구현해 보도록 하겠습니다.

Step1.

Amazon SNS 리소스를 생성 alarm에 등록합니다.

...
    const alertNotificationTopic = new cdk.aws_sns.Topic(this,'AlertNotificationTopic');

    const notificationSnsAction = new cdk.aws_cloudwatch_actions.SnsAction(
      alertNotificationTopic,
    );

    alarm.addAlarmAction(notificationSnsAction);
    alarm.addOkAction(notificationSnsAction);
...

Step2.

다음으로 Amazon SNS(Simple Notification Service) 서비스로 이동
Topics → Subscriptions→ Create subscription 에서

Protocol: email
Endpoint: "your email"

로 등록해 줍니다.

문제없이 등록되었다면, AWS Notification - Subscription Confirmation 이라는 타이틀로 확인 이메일을 받으실 수 있습니다.
그럼 Confirm 후 Lambda 을 실행해 Alerm 통지가 이메일로 오는지 확인해 주세요.

성공했다면 아래와 같은 타이틀의 이메일이 통지됩니다.
ALARM: "LambdaFuncErrorLog" in ..

이 외에도 Slack 등의 외부 서비스와의 연계를 통해 즉각적으로 통지를 받도록 기능을 추가해 볼 수도 있습니다.

마무리

이상, 한국어 블로그 릴레이의 2025년 열 번째 블로그 「CDK 로 Lambda의 CloudWatch Monitoring 리소스 구현해 보기」였습니다.
다음 열한 번째 블로그 릴레이는 4월 둘째 주에 공개됩니다.

참고

https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.