[AWS] EC2 자동 스케쥴링

2023. 8. 16. 14:32AWS/AWS_Service

반응형

 

안녕하세요, 달콤한달팽이입니다.🐌😎


오늘은 EC2를 원하는 시간대에 자동으로 중지, 시작하는 자동 스케줄링을 설정하는 방법에 대해 알아보겠습니다.


자동 스케줄링 생성 방법

개발용 서버 혹은 특정 시간에만 사용이 필요한 서버를 24시간 켜두기에는 비용적으로 큰 부담이 될 수 있습니다.

 

때문에 원하는 요일, 원하는 시간에만 서버를 켜둠으로써 비용절감의 효과를 노려보는 실습을 진행해보도록 하겠습니다.

 


1) IAM Role 생성

Lambda가 CloudWatch 로그를 남기거나, EC2를 중지/시작하기 위해서는 이에 대한 권한을 가지고 있어야합니다.

때문에 Lambda에게 부여할 Role을 생성하는 것이 우선적으로 진행되어야 합니다.

 

우선, Lambda 기반의 Role을 생성합니다.

 

해당 Role 안에 2개의 Policy를 연결하며, 각 Policy의 이름과 역할은 아래와 같습니다.

  1) AWSLambdaBasicExecutionRole(기본 정책) - Lambda 사용에 대한 로그를 생성할 수 있는 권한

  2) lambda_ec2+auto+stop+start_policy(인라인 정책) - Lambda가 EC2를 제어할 수 있는 권한

 

2) Lambda 생성

이후 실질적으로 코드를 수행시켜 원하는 작업(이번 경우에는 EC2를 중지/시작 해주는 작업이겠죠?)을 수행시켜주는 Lambda를 생성합니다.

 

Lambda에 사용될 언어는 자신에게 가장 편한 언어로 선택하고, 역할은 앞서 생성한 IAM Role을 선택합니다.

 

저는 Python이 가장 편하므로 Python 3.9를, IAM Role은 앞서 생성한 lambda_ec2+auto+stop+start_role을 사용했습니다!

이후 Lambda에서 수행할 코드를 작성합니다.

 

아래 코드의 주요 기능은 Tag의 Key값이 AutoSchedule인 EC2를 찾아 Value값을 시간단위로 분류해 EC2를 자동으로 중지하고, 시작해주는 기능이 포함되어 있습니다.

import boto3
from datetime import datetime

def lambda_handler(event, context):
    ec2_client = boto3.client('ec2')
    current_hour = datetime.utcnow().hour + 9
    response = ec2_client.describe_instances()
    for reservation in response['Reservations']:
        for instance in reservation['Instances']:
            instance_id = instance['InstanceId']

            ## EC2의 Tag 가져오기
            tags = {tag['Key']: tag['Value'] for tag in instance.get('Tags', [])}
            auto_time_value = tags.get('AutoSchedule')
            if auto_time_value is not None:
                ## 형식이 올바르지 않을 경우 무시
                if "-" not in auto_time_value:
                    continue

                ## 형식이 올바를 경우 시작시간, 중지시간 분할
                start_hour, stop_hour = auto_time_value.split("-")
                try:
                    start_hour = int(start_hour)
                    stop_hour = int(stop_hour)
                except ValueError:
                    continue

                ## 현재 시간이 시작 시간일 경우 시작, 중지 시작일 경우 중지 수행
                if start_hour == current_hour:
                    ec2_client.start_instances(InstanceIds=[instance_id])
                elif stop_hour == current_hour:
                    ec2_client.stop_instances(InstanceIds=[instance_id])

    return {
        'statusCode': 200,
        'body': 'Auto Start/Stop process completed.'
    }

 

해당 코드가 정상적인 코드인지 테스트하고, 테스트에 이상이 없다면 Deploy를 선택해 Lambda가 수행할 코드를 배포해주세요.

 

3) EventBridge 생성

이제 Lambda를 원하는 시간대에 수행할 수 있도록 트리거를 생성해주도록 합니다.

 

"EventBridge - Scheduler - 일정"에서 일정 생성을 선택합니다.

 

CRON 표현식을 통해 해당 스케줄러가 실행될 시간을 지정합니다.

(저 같은 경우, 평일 일과시간에만 서버가 실행되도록 평일 08시~19시로 CRON을 설정해두었습니다.)

 

지정한 시간대에 앞서 생성한 Lambda를 사용할 것이므로, AWS Lambda-Invoke를 선택하여 미리 생성해둔 Lambda 함수를 선택합니다.

 

4) EC2 태그 설정 및 동작 확인

이제 마지막으로 저희가 생성한 기능이 정상적으로 동작하는지 테스트해보는 단계를 수행해봅시다!

 

스케줄링을 진행할 EC2에 TAG를 설정합니다.

물론 형식은 Lambda에서 설정한 것과 동일하게 Key:AutoSchedule, Value:{start_time}-{end_time} 형식으로 지정 되어야겠죠?

 

이후 "CloudWatch - 로그 - 로그 그룹"에서 Lambda에 대한 로그 그룹 생성여부를 확인합니다.

 

로그를 통해 Lambda가 언제 수행되었는지, 실패했다면 어떤 에러 발생으로 인해 실패했는지 확인이 가능합니다.

아래의 경우 이벤트 기간을 통해 08시 ~ 19시 동안 Lambda가 수행되었다는 것이 확인됩니다!

 


 

반응형