IT

AWS에서 Lambda를 이용한 EC2 Instance 스케줄링 구현하기

고소한도톰발바닥 2025. 2. 10. 22:31
728x90
반응형
SMALL

소개

 Lambda는 AWS에서 지원하는 이벤트 기반의 코드 실행이 가능한 컴퓨팅 서비스입니다. AWS에서 설명하는 Lambda의 이점은 아래와 같은데요. 별도의 Server나 Instance를 생성하지 않고도 코드를 실행해 이벤트를 처리할 수 있다는 것이 가장 큰 기능이 되겠습니다.

 

 

 Lambda를 소개하는 이유는 이를 이용한 EC2 Instance에 대해 다뤄보기 위해서입니다. 2021년부터 현재까지 햇수로 5년간의 EC2 서비스를 이용하고 있는데요. 최근 환율의 상승으로 AWS 서비스의 전체적인 비용이 증가했습니다. (달러 기준 청구) 

 

 

 25년 1월 이용료를 보면 107,447원의 청구된것을 볼 수 있는데요. 현재 3개의 Instance를 24시간 사용중이고, 이를 단순 계산 해봐도 1년이면 130만원 가량의 비용이 발생하는 셈입니다. 24년 10월만 해도 아래와 같이 65,200원이 청구되었는데, 몇 개월 사이 비용이 30% 가량 증가한 셈입니다.

 

 

 서비스 이용료 절감에 대한 고민은 이전에도 해왔었는데요. 이 때 생각한 방안은 크게 두 가지였습니다.

  • EC2 서비스를 필요한 시간에만 기동
  • 집에서 윈도우 컴퓨팅 환경 구성 (PC, 노트북, 태블릿 등)

 방안들을 생각해 두었음에도 실행되지 않았던 이유는 첫째, AWS에서 EC2 서비스를 스케줄링을 구현하기 위한 정보 부족, 둘째, 집에서 윈도우 컴퓨팅 환경을 구성하기 위한 추가 비용 발생 이었습니다. 집에서 안정적인 컴퓨팅 환경을 구성하기 위해서는 24시간 전원 공급과 인터넷 연결이 되어야하는데, 이를 위해 별도의 전력 공급 장치와 통신 장비를 구성하기 위한 비용이 적지 않았습니다. EC2 서비스를 스케줄링하는 방안은 당시 관련 정보들이 충분히 공유되지 않아 시도 중에 중단되었었습니다. 최근 관련 자료들을 다시 찾아보니 정보의 공유가 활발하게 이루어져있어 시스템 구현을 어렵지않게 해낼 수 있었습니다.

 

 AWS에서 Lambda가 동작하기 위해서는 3가지가 필요합니다. [코드 (Lambda)] - [권한 (IAM)] - [이벤트 (Event Bridge)] Lambda를 이용해 실행할 코드를 작성하고, 이 때 필요한 권한들을 IAM을 통해 정의합니다. 그리고 Event Bridge에서 동작 이벤트를 설정하고 Lambda를 연결합니다., 즉, 코드와 권한을 사전에 연결해두고, 사용자가 정의한 이벤트가 발생했을 때, 권한을 가진 코드가 동작하는 형태입니다.

 

EC2 사전 설정

 먼저 스케줄링을 적용할 Instance를 분류하기 위한 태그 부착 작업이 필요합니다.

 

 EC2에 생성된 Instance를 선택합니다.

 

 

[태그] 탭의 [태그 관리]로 이동합니다.

 

 [키] 에 "auto-schedule", [값]에 "true"를 입력하고 [저장]을 선택합니다.

 

IAM 역할 생성

 

 AWS에 로그인 후 [IAM] - [역할] - [역할 생성] 으로 이동합니다.

 

 

 [신뢰할 수 있는 엔터티 유형] - [사용자 지정 신뢰 정책]을 선택하고 아래의 명세를 작성합니다.

 

{
        "Version": "2012-10-17",
        "Statement": [
                {
                        "Sid": "EC2Actions",
                        "Effect": "Allow",
                        "Action": [
                                "ec2:Describe*",
                                "ec2:Start*",
                                "ec2:Stop*"
                        ],
                        "Resource": "*"
                }
        ]
}

 

 

 [권한 추가] 에서는 별도 작업 없이 [다음]으로 이동합니다.

 

 

 [역할 이름]에 "my_Lambda_Role"을 입력하고 [역할 생성]을 선택해 작업을 마무리합니다. 

 

Lambda 함수 생성

 

 AWS에 로그인 후, [Lambda] - [함수] - [함수 생성] 으로 이동합니다.

 

 

 Instance 실행 시, [함수 이름]에 "StartEC2Instance"을 입력하고 [런타임] 에서 [Python 3.13]을 선택 후 [함수 생성]을 선택합니다.

 Instance 중지 시, [함수 이름]에 "StopEC2Instance"을 입력하고 [런타임] 에서 [Python 3.13]을 선택 후 [함수 생성]을 선택합니다.

 

 

 [코드] 탭에서 Instance를 실행하기 위한 파이썬 코드를 작성합니다. 코드는 아래와 같습니다. region 에는 현재 사용자의 리전(지역, region) 값을 넣어주면 됩니다.

import boto3

region = "ap-northeast-2"
instances = []
ec2_r = boto3.resource('ec2')
ec2 = boto3.client('ec2', region_name=region)

for instance in ec2_r.instances.all():
   for tag in instance.tags:
      if tag['Key'] == 'auto-schedule':
         if tag['Value'] == 'true':
            instances.append(instance.id)
 
def lambda_handler(event, context):
   ec2.start_instances(InstanceIds=instances)
   print('started your instances: ' + str(instances))

 

 Instance를 중지하기 위한 파이썬 코드는 아래와 같습니다. region 값도 실행 시와 같게 수정합니다.

import boto3

region = "ap-northeast-2"
instances = []
ec2_r = boto3.resource('ec2')
ec2 = boto3.client('ec2', region_name=region)

for instance in ec2_r.instances.all():
   for tag in instance.tags:
      if tag['Key'] == 'auto-schedule':
         if tag['Value'] == 'true':
            instances.append(instance.id)
 
def lambda_handler(event, context):
   ec2.stop_instances(InstanceIds=instances)
   print('started your instances: ' + str(instances))

 

 코드를 붙여넣은 후 [Deploy]를 눌러 코드를 업로드하고 [구성] 탭으로 이동합니다.

 

 [제한 시간]을 충분히 할당해야하는데  "30초" 정도로 설정하고, [기본 역할]에 앞서 정의한 IAM의 역할 이름을 선택 후 [저장]을 눌러줍니다.  (사진에서는 my_Lambda_Role, 실행과 중지 모두 동일)

 

 

 [테스트] 탭에서  [테스트]를 누르면 테스트 결과를 확인할 수 있습니다. 설정이 성공적으로 되었다면 [성공] 로그를 확인할 수 있습니다.

 

 

Amazon EventBridge

 

 [Amazon EventBridge]에서 [규칙 생성]으로 이동합니다.

 

 

 실행 규칙은 [이름]에 "EC2Start", [규칙 유형]에 [일정]을 선택 후 [규칙 생성으로 이동]을 선택합니다.

 중지 규칙은 [이름]에 "EC2Stop", [규칙 유형]에 [일정]을 선택 후 [규칙 생성으로 이동]을 선택합니다.

 

 

 [cron]에 표현식을 작성해야합니다. [0 23 ? * SUN-THU *] 예시를 입력해 실행, 중지 작업이 원하는 시간에 수행되도록 설정합니다.

 

 

 실행 규칙은 [대상 선택]에서 [Lambda 함수]를 선택하고 [함수]에서 앞서 정의한 "StartEC2Instance"를 선택 후 [다음]으로 이동합니다.

 중지 규칙은 [대상 선택]에서 [Lambda 함수]를 선택하고 [함수]에서 앞서 정의한 "StopEC2Instance"를 선택 후 [다음]으로 이동합니다.

 

 

 태그는 작성하지 않고 [다음]으로 이동합니다.

 

 

 [규칙 생성]으로 이동해 작업을 마무리합니다.

 

 여기까지 IAM, Lambda, EventBridge 설정 방법을 소개했습니다. 소개와 동일하게 설정을 완료했다면, EventBridge에서 지정한 시간에, Lambda에서 정의한 함수가 실행됩니다. 위 과정을 통해 기존의 24시간 동작하던 Instance를 08:00 - 19:00으로 줄일 수 있었는데, 기존 대비 60% 감소된 자원을 사용하는 셈입니다. 작업의 성과는 다음달 요금 청구서를 통해 확인할 수 있을것 같습니다. 요금 청구서가 도착하면 추가글로 공유해보겠습니다.

 

글이 도움이 되었다면 하단의 하트와 구독을 눌러주세요. 하트와 구독은 글을 쓰는데 큰 힘이 됩니다.
728x90
반응형
LIST