온프레미스 환경에서 AWS 클라우드 환경으로 이전 되고, EC2 인스턴스를 많이 활용하고 있다.
EC2 인스턴스는 활용하기에 편하고 좋은 도구 이지만, 정해진 시간에 인스턴스를 시작 또는 중지하는 기능을 제공하지 않아, 실수로 인스턴스를 중지 하지 않으면 가동한 시간만큼 과금이 발생하게 된다.
실수로 인한 과금을 방지 하기 위하여 Lambda를 이용하여 자동 인스턴스 시작, 종료를 작업해보려고 한다.
AWS Lambda는 이벤트에 대한 응답으로 코드를 실행하고 자동으로 기본 컴퓨팅 리소스를 관리하는 서버리스 컴퓨팅 서비스이다. 이때 응답으로 코드를 실행한다는 뜻은 특정 이벤트(상황)가 들어왔을 때 실행하는 코드가 Lambda 함수라는 의미다.
📢 Lambda 특징
완전 관리형 서비스
하드웨어, 네트워크, 운영체제까지 알아서 관리해주는 서비스
유연한 확장성
람다는 다른 AWS 서비스들을 호출하여 자신만의 서비스를 만들수 있다.
고가용성
AWS 람다는 99.9999% 가용성을 제공.
구현하고자 하는 프로세스는 아래와 같다.
Lambda를 호출하기 위해서는 트리거가 필요하다. 나는 CloudWatch Events를 이용해 스케줄링을 걸어 설정한 시간에 맞게 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 인스턴스를 자동으로 시작, 중지하는 작업을 완료하였다.
간단한 설정으로 폭탄과금을 예방할 수 있고, 업무 시간,퇴근 시간 맞춰 인스턴스를 시작,중지할 수 있어 조금이나마 업무에 도움이 될 것으로 생각한다.👏