[AWS] 태그로 인스턴스 스케쥴링 (Feat. Lambda)

KKK·2023년 5월 24일
0

AWS

목록 보기
6/10
post-thumbnail

인스턴스를 항상 켜놓지 않아도 되는 경우, ex) 개발 or 스테이징 서버
스케줄링을 통해 인스턴스 사용 시간을 줄여 비용을 절약할 수 있습니다.

AWS에서 제공하는 CloudFormation을 사용해도 되지만, 본인은 EC2 태그로 스케쥴링을 했다.

각 인스턴스는 Key=schedule, Value는 True&False를 태그로 가지고 있다.
schedule 값이 True인 인스턴스에 대해 자동으로 시작 & 종료되도록 하려고 한다.


람다에서 사용할 IAM Role & Policy 생성

Lambda를 사용하여 인스턴스를 관리하므로, Lambda에는 인스턴스 목록, 시작 및 종료 권한이 필요하다.

IAM Console > 역할 > 역할 생성
AWS 서비스 중 람다 선택 후 다음 클릭.
역할을 먼저 생성하고나서 정책을 추가할 예정이니 아무런 권한도 지정하지 않고 다음 선택

마찬가지로 이름만 지정 후 생성 버튼을 클릭하면 역할이 생성된다.

새로 만든 역할을 검색하여 인라인 정책 생성 선택 후, JSON 탭에서 아래 코드를 입력하고 정책 검토

사용할 정책 이름을 입력하고 정책을 생성해 주면 된다.

여기까지 설정하면 람다가 사용할 IAM Role 설정은 끝


람다 함수 생성

이제 람다 콘솔에 접속하여 인스턴스를 실행시키는 람다 함수를 생성해보자
위에서 생성한 Role을 선택하고 함수를 생성하면 아래와 같이 함수 코드를 직접 수정할 수 있다.

아래 코드를 입력한 후 Depoly를 클릭

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'] == 'schedule':     //'schedule'는 인스턴스 태그의 Key 값
            if tag['Value'] == 'True':   //'True'는 인스턴스 태그의 Value 값을 입력
                instances.append(instance.id)

def lambda_handler(event, context):
    ec2.start_instances(InstanceIds=instances)
    print('started your instances: ' + str(instances))

Deploy 후 구성 > 일반 구성에서 제한 시간을 넉넉하게 지정해준다. (기본 값은 3초)

이제 코드가 정상적으로 동작하는지 테스트 해보면 된다. TEST 클릭하여 이벤트를 생성해 준다.

저장 후 다시 TEST 클릭

작성한 코드가 정상적이면 Status가 Succeeded로 뜬다. 실패 시 Failed

여기까지가 인스턴스를 시작하는 람다 코드 설정이다.
인스턴스를 중지하는 함수도 마찬가지로 동일하게 생성하고 코드만 약간 변경해주면 된다.

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'] == '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_Instance_Lambda와 동일하게 Depoly 후 제한시간 설정 및 TEST 해보면 된다.

테스트가 성공적으로 완료되면, 실제 EC2 콘솔에 접속해서 잘 동작했는지 확인해보자

인스턴스의 태그 값이 True인 인스턴스만 중지된 것을 확인할 수 있다.


스케줄링 등록

마지막으로 인스턴스를 자동으로 시작 및 중지할 수 있도록 EventBridge를 생성해보자

본인 같은 경우엔 업무 시간 동안 인스턴스가 가동되게할 것이기 때문에 스케줄링은 아래처럼 설정했다.

  • 월~금 오전 8시 인스턴스 시작
  • 월~금 오후 6시 인스턴스 종료

Amazon EventBridge Console > Scheduler > 일정 > 일정 생성

일정 생성 시, 크론 기반으로 표현된다다. UTC 기준이므로 한국 시간(UTC+9) 기준으로 잘 계산해서 하자

일정 생성을 누르고 일정 이름을 지정한 후 일정 패턴 설정을 하면 된다. 23:00(UTC)은 한국시간으로 오전 8시이다. 정각이 넘어가기 때문에 일요일 ~ 목요일로 지정했다.

다음으로 일정을 지정할 대상으로 위에서 생선한 인스턴스를 실행시키는 람다를 선택한다.
이후 나머지 부분은 모두 기본 값으로 설정하고 생성하면 된다.

마찬가지로 인스턴스를 중지시키는 람다에 대한 일정도 동일하게 생성해주면 된다.

여기까지 설정이 끝나면 인스턴스를 시작하고 중지시키는 람다가 지정한 시간에 자동으로 실행된다.

이제 다음날 출근해서 인스턴스가 잘 켜졌는지 확인하면 된다.


참고

확인해 보니, 정상적으로 실행이 안됐다. 찾아 보니 원래 미국 기준으로 생성해야 됐었는데 이젠 그냥 한국 시간으로 생성하면 된다고 한다.

0개의 댓글