[Lambda] EC2 인스턴스 자동 시작/중지

asws1457·2021년 9월 22일
2
post-thumbnail

서론

온프레미스 환경에서 AWS 클라우드 환경으로 이전 되고, EC2 인스턴스를 많이 활용하고 있다.
EC2 인스턴스는 활용하기에 편하고 좋은 도구 이지만, 정해진 시간에 인스턴스를 시작 또는 중지하는 기능을 제공하지 않아, 실수로 인스턴스를 중지 하지 않으면 가동한 시간만큼 과금이 발생하게 된다.
실수로 인한 과금을 방지 하기 위하여 Lambda를 이용하여 자동 인스턴스 시작, 종료를 작업해보려고 한다.


Lambda란?

AWS Lambda는 이벤트에 대한 응답으로 코드를 실행하고 자동으로 기본 컴퓨팅 리소스를 관리하는 서버리스 컴퓨팅 서비스이다. 이때 응답으로 코드를 실행한다는 뜻은 특정 이벤트(상황)가 들어왔을 때 실행하는 코드가 Lambda 함수라는 의미다.

📢 Lambda 특징

  • 완전 관리형 서비스

    하드웨어, 네트워크, 운영체제까지 알아서 관리해주는 서비스

  • 유연한 확장성

    람다는 다른 AWS 서비스들을 호출하여 자신만의 서비스를 만들수 있다.

  • 고가용성

    AWS 람다는 99.9999% 가용성을 제공.

Lambda 사용하기

구현하고자 하는 프로세스는 아래와 같다.

  1. 특정 시간에 Lambda 호출
  2. Lambda가 호출되는 시점에 ec2 인스턴스에 등록된 모든 태그를 조회 후
    특정 태그값이 있는 인스턴스만 인스턴스 상태를 확인하여 start_instances 또는 stop_instances 함수를 호출

Lambda 호출

Lambda를 호출하기 위해서는 트리거가 필요하다. 나는 CloudWatch Events를 이용해 스케줄링을 걸어 설정한 시간에 맞게 Lambda를 호출하도록 하였다.

  • 트리거 생성
    - 규칙 이름 : EC2AutoStart, EC2AutoStop
    - 규칙 유형 : 예약 표현식 ( CronJob )
    UTC 기준으로 계산해야 한다. KST와 9시간 차이 나기 때문에 고려해줘야 한다.
    EC2AutoStart 월요일 ~ 금요일 아침 9시에 해당 Lambda를 Trigger한다.
    EC2AutoStop 월요일 ~ 금요일 저녁 6시에 해당 Lambda를 Trigger한다.

  • 트리거 적용 화면

Lambda 실행 코드

import json
import boto3
ec2 = boto3.client('ec2', 'ap-northeast-2')

def lambda_handler(event, context):
    reservations = ec2.describe_instances()
    ec2_list = []
    ec2_list_start = []
    ec2_list_stop = []
    #인스턴스 조회 
    for attr in reservations["Reservations"]:
       for instance in attr["Instances"]:
     	   #인스턴스 태그 조회      
           for tag in instance["Tags"]:
                #특정 태그 값 있는
                if tag["Key"] == "AUTOSTATE" and tag["Value"] == "Yes" :
                    ec2_list.append(instance)

     
    for tagInstance in ec2_list:
        #인스턴스가 실행중인경우 
        if tagInstance["State"]["Name"] == 'running':
            ec2_list_start.append(tagInstance["InstanceId"])
            #인스턴스 중지
            ec2.stop_instances(InstanceIds=ec2_list_start)
	#인스턴스가 중지인경우
    	elif tagInstance["State"]["Name"] == 'stopped':
            ec2_list_stop.append(tagInstance["InstanceId"])
            #인스턴스 시작
            ec2.start_instances(InstanceIds=ec2_list_stop)
        else:
            print("Nothing to see here")
     

정리

Lambda 이용하여 ec2 인스턴스를 자동으로 시작, 중지하는 작업을 완료하였다.
간단한 설정으로 폭탄과금을 예방할 수 있고, 업무 시간,퇴근 시간 맞춰 인스턴스를 시작,중지할 수 있어 조금이나마 업무에 도움이 될 것으로 생각한다.👏

profile
어제의 나를 이기자 🔥

0개의 댓글