본문 바로가기
공부/AWS

[AWS] Lambda로 EC2 Start/Stop + CloudWatch 규칙으로 트리거

by haejang 2021. 1. 19.
728x90
728x90

 

>> Lambda 코드만 모아둔 GitHub

 

0. 기본 구성

기본 VPC에 EC2 2개 만들어놓고 진행하겠다

EC2 인스턴스 id들은 복사해두자

 

1. IAM 정책 생성

Lambda 함수에서 EC2를 시작/중지 시킬 수 있는 role을 만들어야 하기 때문에 정책을 먼저 만들어주겠다

IAM > 정책 > 정책 생성 > JSON으로 들어가 아래의 코드로 변경

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2:Start*",
        "ec2:Stop*"
      ],
      "Resource": "*"
    }
  ]
}

 

 

정책 검토 > 이름 대충 설정 후 정책 생성

 

생성 완료

 

2. IAM role 생성

IAM > 역할 > 역할 만들기 > 사용사례에서 Lambda 선택 > 다음

 

 

방금 만든 정책 검색 > 선택 후 다음 > 이름 설정 후 역할 만들기

 

role도 생성 끝

 

3. Lambda 함수 생성

3-2) EC2 Stop

서비스 > Lambda > 함수 생성

 

 

이름 설정해주고 Python으로 설정, 기존 역할 사용 > 방금 만든 역할 선택 후 함수 생성

함수 코드에 아래 코드 작성

import boto3

region = 'ap-northeast-2'
instances = ['인스턴스id1','인스턴스id2']

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name=region)
    ec2.stop_instances(InstanceIds=instances)
    print ('stop your instances: ' + str(instances))

 

리전과 인스턴스 ID만 본인에게 바꿔서 작성하면 된다

 

 

작성이 끝나면 배포를 눌러준다

함수가 생성되었다는 메세지가 뜨면 테스트를 한번 해보자

오른쪽 상단의 테스트를 눌러 이벤트 이름만 대충 설정해 준 후 생성을 누른다

 

 

생성 후 테스트 버튼을 다시 눌러보면

 

 

실행이 성공했다고 한다

EC2 탭으로 가서 확인해보자

 

 

EC2들이 중지되고 있다

 

3-2) EC2 Start

Stop 만들때와 마찬가지로 함수 생성 후 아래 코드를 작성해주자

import boto3

region = 'ap-northeast-2'
instances = ['인스턴스id1','인스턴스id2']

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name=region)
    ec2.start_instances(InstanceIds=instances)
    print ('start your instances: ' + str(instances))

 

리전과 인스턴스 ID도 똑같이 바꿔서 적어주자

 

 

마찬가지로 배포 후 테스트를 해보면

 

 

 

인스턴스들도 다시 살아났다

 

4. CloudWatch로 Lamda 정기적으로 트리거하기

CloudWatch > 이벤트 > 규칙 > 규칙 생성

이벤트 소스에서 일정을 누른 후 Cron 표현식을 선택해주자

(고정 비율로 하면 그냥 몇분/몇시간에 한번씩 트리거되는듯)

현재 시간이 오후 4시 23분이기 때문에, 4시 26분에 트리거되도록 설정해보겠다 : 26 7 * * ? *

이는 매년 매월 매일 7시 26분 (GMT 시간이라 한국시간에서 -9 해야함) 마다 트리거 하겠다는 뜻이다

자세한 Cron 표현식은 여기를 참조하자

 

그리고 대상  추가를 눌러 ec2-stop 함수를 선택해준 후 세부 정보 구성을 누른다

 

 

이름만 설정해주고 규칙 생성을 완료하자

 

 

이제 26분에 아마 ec2들이 꺼질 것이다

ec2-start 함수는 Cron식을 28 7 * * ? * 로 설정해주고 규칙을 생성해줬다

 

5. 함수가 잘 트리거됐는지 확인

26분이 되었다

 

 

인스턴스들이 꺼지는걸 확인했다

 

28분이 되니

 

 

인스턴스들이 켜지는걸 확인했다

 

CloudWatch의 로그 > 로그 그룹으로 들어가보면 함수가 트리거될 때 작성된 로그도 확인할 수 있다

 

 

 

728x90
728x90

댓글