본문 바로가기

Python/Boto3

AWS Lambda를 통해 EC2 서버 스케줄링 구성하기

AWS Lambda를 통해서 서버스케줄링을 해보도록 하겠습니다.

 

Cloudwatch Event를 통해 Lambda를 Cron으로 수행하여서 서버를 키고 끄는 형태입니다.

 

먼저 Lambda가 EC2를 크고 끄는 작업을 수행해야하므로, 해당 권한을 가진 Role을 구성해주겠습니다.

 

정책에서 아래와 같이 만들어주겠습니다.

 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": "*"
        }
    ]
}

 

 

그리고 Role에서 서비스를 람다로 고른 후 아래 정책들을 포함하여 만들어주시면 됩니다.

 

 


 

이제 Lambda를 구성해주면 됩니다.

아래 소스코드를 참고해주세요

 

밑의 코드에서 Tags 이후에는 설정한 태그 Key, Value 값대로 입력해서 사용하시면 됩니다.

저 같은 경우에는 Key:Name, Value:서버이름 을 설정한 상태이므로, 아래와 같이 수행했습니다.

 

만약 환경태그를 Key:Env, Value:DEV 이러한 형태로 설정했다면,

소스코드를 조금 바꿔 환경별로 서버 스케줄링하는 형태로 활용하실 수 있습니다.

import boto3
import datetime

def lambda_handler(event, context):
    client = boto3.client('ec2')
    response = client.describe_instances()
    now = datetime.datetime.now()
    hour = now.strftime('%H')
    
    ec2_list = []
    for ec2 in response['Reservations']:
        for instance in ec2['Instances']:
            for tags in instance['Tags']:
                if tags['Key'] == 'Name':
                    if '{EC2 이름}' in tags['Value']:
                        print(tags['Value'] + ':' + instance['InstanceId'])
                        ec2_list.append(instance['InstanceId'])
    
    if hour == '23':
        start_response = client.start_instances(InstanceIds=ec2_list)
    else:
        stop_response = client.stop_instances(InstanceIds=ec2_list)
    
    print(ec2_list)

 


 

마지막으로 Cloudwatch Event를 추가해서 크론으로 람다를 돌리게 하겠습니다.

 

직접 Cloudwatch -> Event -> 규칙에서 아래와 같이 사용하여 만드는 방법이 있습니다.

 

Cron 표현식은 아래 공식 다큐를 참고해주세요

참고로 시간대가 서울시간이 아닌 GMT 기준이기 때문에 9시간에 대해서 계산해서 작성해주셔야 합니다.

https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/services-cloudwatchevents-expressions.html

 

https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/services-cloudwatchevents-expressions.html

rate 또는 cron을 사용한 예약 표현식

docs.aws.amazon.com

 

 

 

혹은 Lambda 함수에서 아래와 같은 화면을 통해 트리거로 추가시키는 방법이 있습니다.

 

 

 

다음 포스트에서는 AWS Lambda를 통해 EC2 AMI / Snapshot 백업을 자동화하는것에 대해 알아보겠습니다.