[AWS] EC2 일정 시간에 자동으로 켜고 끄기, CloudWatch와 Lambda 사용

     

 

AWS를 사용하면서 가장 문제가 되는 것은 비용입니다. 사용하기 편리하지만 그렇다고 돈을 왕창 낼 수는 없으니까 ㅋㅋ

 

최근에 회사에서 AWS를 사용하면서 개발에 사용되는 EC2를 일과 중에만 사용하게 하기 위해 지정된 시간에 자동으로 Start, Stop을 시키는 기능을 만들었습니다. AWS에서 제공하는 람다(Lambda)와 클라우드 와치(CloudWatch)를 사용하면 쉽게 만들 수 있습니다.

 

 

람다 (Lambda)

먼저 AWS 람다에서 EC2를 켜고 끄는 스크립트를 만들어야 합니다.

여기서 주의할 점은, EC2를 켜고 끄는 기능의 역할(IAM)을 만들어서 할당해주어야 Lambda에서 EC2를 키고 끌 수 있습니다.

 

따라서 가장 먼저 IAM메뉴에 가서 새로울 역할(Role)을 만들어야 됩니다.

 

AWS 콘솔 IAM 화면

 

역할 만들기를 선택하고 AWS 서비스에서 람다를 선택합니다.

 

일반 사용 사례에서 Lambda를 선택

 

다음으로 넘어가면 이제 어떤 권한을 줄지 선택하는 화면이 나오는데요, 여기서 EC2 전체접근권한을 줄 수 있지만 우리에게 필요한 건 단순히 EC2를 켜고 끄는 것이기 때문에 새로 정책을 만듭니다. 정책 생성을 선택하면 정책을 만드는 화면으로 넘어갑니다.

 

정책 생성 클릭

정책을 만드는 것은 GUI(시각적 편집기)를 이용해서 만들 수 있고, JSON을 편집해서 만들 수 있습니다. 처음하면 JSON은 어려우니까 GUI를 이용해 만들어보겠습니다.

 

시각적 편집기를 이용해서 만들기

각각의 내용을 아래와 같이 채워줍니다.

 

하나하나 채웁니다.

위에는 EC2를 켜고 끄는 정책을 추가한것이고 람다를 사용하려면 클라우드 와치 로그 생성 권한도 있어야 합니다. 권한 추가를 누른 후 하나를 더 추가합니다.

 

여기도 채웁니다

 

다음을 누르면 이제 정책 이름을 정하는데요, 나중에 알아볼 수 있게 이름을 정하면 됩니다.

 

EC2StartStop

 

이제 정책이 생성됬기 때문에 다시 이전 화면에서 EC2StartStop이라는 정책을 찾아서 선택해줍니다.

 

새로고침을 하면 우리가 만든 정책이 생깁니다.

 

다음을 누르면 태그값을 정하는데 넣으셔도 되고 안 넣으셔도 됩니다.

 

마지막으로 역할이름을 정하는데, 권한이랑 똑같이 EC2StartStop으로 만들도록 하겠습니다.

생성완료

 

이제 역할을 만들었으니 람다 서비스에서 서버를 켜고 끄는 스크립트를 만들어보겠습니다.

 

함수 생성

함수 생성을 눌러서 람다를 만들어봅시다.

Start와 Stop을 따로 만들어줘야 되서 Start먼저 만들겠습니다.

함수 이름은 StartEC2Instances로~

 

함수이름과 런타임 언어를 설정합니다.

 

저는 파이썬이 편한데,, 편한 언어를 쓰시면 됩니다. ㅋㅋㅋ

 

만들고 나서 별칭이나 버전에서 최신 버전을 누르면 상세 화면으로 이동됩니다.

여기서 코드를 누르면 스크립트를 수정할 수 있습니다.

 

코드를 넣습니다

스크립트에 위와 같이 코드를 넣으면 되는데요, 그림은 복붙이 안되니까 코드 에디터에 써보겠습니다.

 

import boto3
# 리전
region = 'ap-northeast-2' 
# EC2 인스턴스 ID
instances = ['i-0013d1b642951cb56']
ec2 = boto3.client('ec2', region_name=region)

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

주석은 지우고 넣어주세요~

region과 instances을 각자 넣어주시면 됩니다.

코드를 수정하고 우측 상단에 배포를 눌러주셔야 코드가 반영됩니다.

 

이제 마지막으로 **권한을 추가하면 되는데요, 아까 EC2를 켜고 끌 수 있는 권한을 가진 역할을 만들었습니다. 

상단에 버전 구성 화면을 가면 왼쪽 메뉴에 권한이 있습니다. 여기서 EC2를 켜고 끄는 역할을 추가하면 됩니다.

 

EC2StartStop을 선택

사실 만들고 선택하지 않고, 람다를 만들 때 권한을 선택할 수 있습니다. ㅎㅎㅎㅎㅎㅎㅎㅎㅎ

 

같은 방법으로 StopEC2Instance도 만들어줍니다. 코드에서 start_instances를 stop_instances로 바꾸면 됩니다. 

 

import boto3
region = 'ap-northeast-2' 
instances = ['i-0013d1b642951cb56']
ec2 = boto3.client('ec2', region_name=region)

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

 

 

 

CloudWatch 설정

 

이제 AWS CloudWatch 서비스로 가서 지정된 시간에 람다를 실행하도록 만들면 됩니다.

 

규칙 생성

 

이벤트>규칙 에서 규칙 생성 버튼을 누릅니다.

 

일정으로 스케쥴을 정하고 대상에 람다 함수를 선택합니다.

 

이벤트 소스에서 일정을 누르면 crontab에서 정하던 방식으로 스케줄을 정할 수 있습니다. 사용법을 잘 모르겠으면 아래 자세히 알아보십시오 링크를 누르면 예제가 나오니 참고하세요~

 

대상에는 우리가 만들었던 람다 함수를 링크해줍니다. 

 

이게 시간이 GMT 기준이라 한국시간 -9시간을 해야 합니다. 위에는 03:00으로 되어있는데 실제로는 12시에 실행됩니다. 

 

이름 정하면 끝

이름 적당히 지으면 완료!!

같은 방법으로 StopEC2Instances도 만듭니다.

 

새벽 3시에 꺼지도록 설정

저는 보통 작업시간이 오후 12시~새벽 3시 일 것 같아서... ㅋㅋㅋㅋ

이렇게 바꿨습니다 ^^

 

이제 지정된 시간에 EC2가 제대로 내려가고 올라가는지 확인하면 끝~!

 

만약 문제가 생기면 CloudWatch에 로그가 남으니 에러 메시지를 확인하면 됩니다~!

 

 

 

 

 

 

 

 

 

 

 

반응형

댓글(0)

Designed by JB FACTORY