티스토리 뷰

728x90
반응형

서론

Lambda는 AWS의 대표적인 Serverless 컴퓨팅으로 Function as a Service(FaaS)로 대표된다. (Azure Functions, Google Cloud Functions 대체)

Lambda는 Function 기반으로 짧은 시간안에 동작하는 가볍고 반복적인 업무를 정의하는데 용이한 서비스로 지금부터는 우리가 잊기 쉬운 일을 대신 처리해 주는 Lambda를 직접 구성해 보도록 하자.


본문

본 포스팅에서는 Lambda를 활용하여 EC2를 특정 시간에 기동하고 종료하는 StartInstance / StopInstance를 생성할 예정이다.

다음과 같은 과정을 기반으로 Lambda Function을 생성하고 CloudWatch와 연동하여 CronJob을 등록하는 과정에 대해 살펴보도록 한다.

1) IAM 정책 및 역할 생성

2) Lambda Function 생성

3) CloudWatch 규칙 등록


IAM 정책 및 역할 생성

1) 정책 생성

EC2를 기동하고 종료하기 위한 정책을 등록한다.

POLICY-EC2-START-STOP

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2:Start*",
        "ec2:Stop*"
      ],
      "Resource": "*"
    }
  ]
}

2) 역할 생성

Lambda에 등록하기 위해 역할을 생성한다. 역할은 앞서 생성한 POLICY-EC2-START-STOP 정책 권한을 부여한다.역할 생성 시 LAMBDA 형식을 사용한다.

ROLE-EC2-START-STOP

 


Lambda Function 생성

다음으로 Lambda Function을 생성해 보자.

1) 함수 생성

AWS Lambda > 함수 생성 > 새로 작성

 

 

- 함수 이름 : StopEC2Instances

- 런타임 : Python 3.7

- 실행 역할 > 기존 역할 사용 선택

- 기존 역할 : 앞서 생성한 ROLE-EC2-START-STOP 선택

위와 같이 입력 또는 선택 후 함수 생성 버튼을 클릭한다.

2) 함수 코드 생성

import boto3
region = 'ap-northeast-2'
instances = ['i-090c15880de784752']
ec2 = boto3.client('ec2', region_name=region)

def lambda_handler(event, context):
    ec2.stop_instances(InstanceIds=instances)
    print('stopped your instances: ' + str(instances))

위와 같이 region & instanceid를 본인의 환경에 맞게 입력한다.

하단의 기본 설정 > 제한 시간 : 10초로 변경 후 Deploy한다.

이와 동일한 과정으로 StartEC2Instance를 생성한다.

import boto3
region = 'ap-northeast-2'
instances = ['i-090c15880de784752']
ec2 = boto3.client('ec2', region_name=region)

def lambda_handler(event, context):
    ec2.start_instances(InstanceIds=instances)
    print('started your instances: ' + str(instances))

생성이 완료된 함수는 다음과 같다.

 

 

이제 생성된 Lambda 함수를 트리거하기 위해 CloudWatch를 활용해 보자.


CloudWatch 규칙 등록

1) 규칙 생성

CloudWatch > 이벤트 > 규칙 > 규칙 생성

 

 

규칙은 아래와 같이 구성한다.

 

 

이벤트 소스

- 일정 : 고정 비율 또는 Cron 표현식을 사용하여 규칙을 생성한다.

- Cron 표현식 : GMT 기준 Cron 표현식으로 규칙을 생성한다. 자세한 Cron 표현식은 다음을 참고하자.
(
Schedule Expressions for Rules)

대상

- Lambda 함수

- 함수 : 앞서 생성한 Lambda 함수 선택

위와 같이 구성 후 세부 정보 구성을 선택하여 Scheduler의 이름을 지정한 후 규칙을 생성한다.

이와 동일한 방법으로 StartEC2Instances를 대상으로 하는 규칙을 추가로 생성한다.

 

 

각각의 규칙은 다음과 같이 구성되어 있다.

 

 

2) 동작 확인

EC2STOPSCHEDULER는 GMT 로 14시 25분 한국 시간으로 23시 25분에 해당 EC2 인스턴스를 자동으로 다운시키는 규칙이다. 먼저 동작하는지 확인해 보자.

 

 

위와 같이 정상적으로 다운되는 것을 확인할 수 있다.

다음으로 EC2STARTSCHEDULER는 GMT 로 14시 30분 한국 시간으로 23시 30분에 해당 EC2 인스턴스를 자동으로 기동시키는 규칙이다. 동작하는지 확인해 보자.

 

 

위와 같이 특정 인스턴스가 자동으로 기동되는 것을 확인할 수 있다.

이를 적절히 사용하면, 아침 특정 시간에 인스턴스를 기동하고, 저녁 특정 시간에 인스턴스를 자동으로 다운하여, EC2 인스턴스의 기동/종료를 잊어 불필요한 과금이 발생되는 현상을 방지할 수 있다.

3) 모니터링

Lambda > 함수 > StopEc2Instances > 모니터링 탭

이제 마지막으로 Lambda 함수로 돌아와서 모니터링 항목을 살펴보자.

 

 

위와 같이 특정 함수가 실행된 횟수와 실행 시간 등으로 나타내는 그래프와 Insight를 제공하는 몇가지 로그 정보를 출력한다.


결론

Lambda는 그 활용 가치에 따라 다방면으로 적용할 수 있다. 특히 본 포스팅에서는 EC2 만을 대상으로 하였지만, AWS 서비스 대부분을 Lambda를 활용하여 자동으로 관리할 수 있다.

대표적인 활용 방법으로는 배치 스케줄링, 정기배포, 인스턴스 관리, 특정 이벤트 알람 설정(급격한 트래픽 증가 등) 등이 있다.

특히 AWS Telemetry 서비스와의 호환을 통해 투명한 추적과 관리가 가능하다. 앞서 살펴본 것과 같이 이벤트를 사용하여 함수를 동작하도록 예약하고 지표를 모니터링하는 CloudWatch, 트레이스를 추적하는 AWS X-Ray, CloudWatch를 통해 저장한 Lambda Insights Log를 분석하여 표출하는 ElasticSearch Service 등과 통합하여 하나의 Function이지만 하나의 완전한 서비스로써 동작할 수 있다.

728x90
반응형