Ec2 스케줄링 작업

Ec2 서버를 항상 켜두지 않아도 될시 스케줄링을 통한 인스턴스의 비용을 줄이자
참고 문헌 : https://aws.amazon.com/ko/premiumsupport/knowledge-center/start-stop-lambda-eventbridge/ 
 

Lambda를 사용하여 EC2 인스턴스를 설정 간격으로 중지 및 시작하기

EC2 인스턴스를 자동으로 중지 및 시작하여 Amazon Elastic Compute Cloud(Amazon EC2) 사용량을 줄이려고 합니다. 이를 위해 AWS Lambda 및 Amazon EventBridge를 사용하려면 어떻게 해야 하나요? 중요: 리전에서 ‘us

aws.amazon.com

테스트 

1. Lambda 사용할 IAM 생성

Lambda를 사용하여 ec2를 제어해야 하므로, Lambda에서는 Ec2에 대한 목록확인,시작 및 종료 권한이 필요합니다.

Lambda함수에서 ec2에 대한 start/stop 동작을 하게끔 하기위한 정책부여

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

 

2. Tag 기반으로 Ec2 생성

특정 tag를 사용해서 인스턴스를 동작시킬것이기 때문에 tag를 지정해준다.나머지 값은 기본으로 생성했으므로 스킵한다(key는 본인의 key를 이용)

 

3. Lambda 함수 생성 

  • start 함수
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))
  • stop 함수
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('stopped your instances: ' + str(instances))

Start Ec2 Function

코드 배포 시간 20초로 수정
코드 배포 후 Test 진행

Stop Ec2 Function

start 함수와 동일하게 설정 진행
코드 작성 후 배포 진행

TEST 확인

Start
Stop

4. EventBridge 생성

기존 Cloudwatch Event 가 Event Bridge와 통합이 되어 UI만 다른 점 참고!!
  • 규칙 세부 정보

  • Cloudwatch를 이용하여 특정 시간 조정

Cron 작업을 이용하여 동작시킨다. 해당 시간은 한국시간 UTC - 9 로 기입을 해야한다.                                     다음 테스트는 월~금 15:38분으로 설정된것이다.
특정 시간 Event 패턴에 따른 Lambda Ec2 start 함수 시작 연동

  • 람다 이벤트 트리거 연동 확인

  • 동작 확인 (실행)

위에서 중지 되어있던 인스턴스 재실행 확인(중지 또한 동일하게 확인하면 된다)

5. 추가

 위의 과정을 이용하여 특정 시간대에 따른 Ec2 서버의 시작과 중지가 이루어 졌다..
 하지만, 수동으로 중지시간에 인스턴스를 강제로 구동 시킬 시 자동으로 중지가 되지 않기 때문에 해당 방법또한  추가로 구현해보았다.

Auto Stop Function

import boto3
from datetime import datetime
from datetime import time
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):
    curr_datetime = datetime.now()
    curr_time = curr_datetime.time()

    if (curr_time.hour >= 7): 
        if len(instances) > 0:
        #perform the shutdown
            ec2.stop_instances(InstanceIds=instances)
        
            print('stopped your instances: ' + str(instances))

EventBridge를 이용하여 시작중인 인스턴스 대상으로 트리거

  • 인스턴스 수동 재시작

이전 챕터에서 진행된 Stop 함수 EventBridge 특정 시간에 따라 중지됨을 확인

  • 수동 시작 진행 시 

강제로 시작을 진행하였을시, AutoStop함수에 의하여 다시 중지가 되는것을 확인할 수 있다.

 

결과

해당 테스트를 통하여 Lambda 함수 작성을 통한 Ec2 의 스케줄링 작업을 해보았으며,
주 서비스가 아닌 서버들에 한해서 유휴 리소스를 줄이기 위해 사용한다면 유용할 것 같다.
더나아가 해당 설정들을 CloudFormation 이나 Terraform을 이용한다면 좀더 유연한 작업이 될 것이다.

 

'Automation' 카테고리의 다른 글

SSM Automation을 통한 자동화  (0) 2022.08.23
image builder 2  (0) 2021.06.16
Image Builder -golden ami 생성  (0) 2021.03.29
auto-scaling scale-out시 run-command동작  (0) 2021.03.29

+ Recent posts