AWS 노트

Lambda 함수 실행기 (4) AWS Cloud Watch 이용해서 주기적으로 Lambda 함수 실행시키는 CDK Stack 구축하기

Jonchann 2020. 4. 9. 15:03

오늘의 과제:

5분 간격으로 기동되는 Lambda handler를 CDK stack 안에서 구현하기

 

(handler를 5분 간격으로 기동되게 하는 것이 아니라 5분 동안 축적된 쿼리를 handler가 처리하게 하려면 aws-lambda-event-source 사용해야 함)

AWS 설명서: Amazon Cloud Watch

 

Amazon Cloud Watch


  • AWS 리소스와 AWS에서 기동하는 프로그램을 실시간으로 모니터링 할 수 있음

지표

  • 모니터링할 변수
  • 데이터 요소: 시간에 따른 변수 값
    • 순서 상관 없이 추가 가능
    • 정렬된 시계열 집합으로 검색 가능
    • 타임스탬프, 측정 단위
  • CloudWatch에 게시된 시간순 데이터 요소 세트
    • e.g. EC2 인스턴스의 CPU 사용량
  • AWS 서비스는 CloudWatch에 지표를 전송
    • 사용자 지정 지표 전송 가능
  • 15개월이 지나면 순서대로 만료
  • 0개 이상의 차원으로 고유하게 정의
  • 모든 지표에 대해 CloudWatch에서 통계 검색 가능

네임스페이스

  • CloudWatch 지표용 컨테이너
    • 기본 없이 각 데이터 요소마다 네임스페이스 지정해야
      • 지표 생성할 때 이름 지정 가능
      • 유효한 XML 문자 포함
      • 길이가 256자 미만
      • 영숫자
  • 네임스페이스마다 지표는 격리
    • 다른 어플리케이션의 지표가 동일하게 집계되는 실수는 일어나지 않음

 

@aws-cdk/aws-events


AWS서비스를 실행할 때 일정 시간을 두고 반복 실행하고 싶다거나 정해진 시간마다 실행되게 하고 싶은 경우에 @aws-cdk/aws-events를 사용한다.

npm install @aws-cdk/aws-events

CDK 스택 안에 스케쥴을 지정하기 위한 코드를 적어주자.

export class ExampleDirStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const func = new lambda.Function(this, 'Example-lambda', {
        code: lambda.Code.fromAsset('src'),
        handler: 'lambda_handler.lambda_handler',
        runtime: lambda.Runtime.PYTHON_3_7,
        timeout: Duration.seconds(300)
    });

    new event.Rule(this, "Example-rule", {
      schedule: event.Schedule.rate(Duration.minutes(5)),
      targets: [new targets.LambdaFunction(func)]
    });
  }
}

이벤트를 발생시키는 규칙은 어디서 다시 호출하고 그럴 일 없기 때문에 변수로(const event_rule =) 만들지 않고 new로 바로 시작해주면 된다.
schedule:에는 이벤트 실행 주기를 지정해주면 된다.

 

event.Schedule

event.Schedule에는 cron, rate, expression모듈이 있는데 자주 쓸 것 같은 cronrate만 적어보겠다.

 

 

cron

  • day, hour, minute, month, weekDay, year를 지정
  • 지정한 일시에 반드시 이벤트를 실행

아래 코드는 매 정시마다 실행시키는 코드이다.
매일 12시에 실행시키고 싶다면 hour: "12"로 바꿔주면 된다.

new event.Rule(stack, "Example-rule", {
        schedule: event.Schedule.cron({
            minute: "0",
            hour: "*",
            day: "*",
            month: "*",
            year: "*"
        }),
        targets: [new targets.LambdaFunction(RedshiftDailyMonitor)]
    });

 

rate

  • 시간 간격을 정해주는 모듈

아래 코드는 5분에 한번씩 실행시키도록 하는 코드이다.

new event.Rule(this, "Example-rule", {
      schedule: event.Schedule.rate(Duration.minutes(5)),
      targets: [new targets.LambdaFunction(func)]
    });

rate안에는 인수로 Duration값을 주어야 한다.
Duration으로 아래 것들을 이용해 시간 간격을 지정할 수 있다.

  • days: 며칠에 한번씩 실행하는지 지정 가능
  • hours: 몇 시간에 한번씩 실행하는지 지정 가능
  • minutes: 몇 분에 한번씩 실행하는지 지정 가능
  • seconds: 몇 초에 한번씩 실행하는지 지정 가능

이 외에도 여러 가지 있는데 AWS CDK API - class Duration을 참고하면 된다.