Lambda를 이용하여 EC2 정기적 중지, 시작

Joshua_s·2022년 5월 2일
0
post-thumbnail

EC2 인스턴스를 정기적으로 시작,중지

AWS는 기본적으로 Pay per use이기 떄문에 사용하지 않는 인스턴스는 중지 시키는 것이 좋다. 하지만 이를 신경쓰는 것은 6시에 칼같이 퇴근을 하고 싶은 나의 입장에서는 너무 힘든 일이다. 따라서 미리 구축을 해놓고 퇴근시간에 알아서 정지되도록 구축하려고 한다.

IAM Role

먼저 IAM Role을 생성한다. 사용 사례는 Lambda로 적용한뒤 생성하면 된다. 또한 권한도 나중에 부여할 것이기 때문에 권한을 넣지 않고 이름만 부여해주고 바로 생성을 하면 된다.

역활을 생성하였으면 이제 역활에 권한을 부여해줄 차례이다. 방금만든 Role로 이동한뒤 권한 추가에 인라인 정책 생성으로 이동한다

정책 생성에서 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": "*"
        }
    ]
}

이후 정책 검토를 누르고 정책의 이름을 지정해주면 된다. 이렇게 하면 IAM Role은 끝이다.

Lambda

Lambda로 이동한뒤 함수 -> 함수 생성을 해준다. 그런 뒤에 이름을 지정하고 권한을 선택해준다. 또한 언어는 python으로 할 것이기 때문에 python을 지정해준다.

함수가 생성되었으면 구성 -> 일반구성으로 가서 제한 시간을 30초로 늘려주도록 하겠다.

이후에 코드로 이동한 뒤 python 스크립트를 넣어주면 끝이다.

import boto3
region = '본인 리전'
instances = ['EC2 인스턴스 ID']

ec2 = boto3.client('ec2', region_name=region)
def lambda_handler(event, context):
    if event['action'] == "start":
        ec2.start_instances(InstanceIds=instances, DryRun = False)
        print("instances start success")
    elif event['action'] == "stop":
        ec2.stop_instances(InstanceIds=instances, DryRun = False)
        print("instances stop success")

리전이랑 인스턴스 부분만 수정하면 된다. 코드에 대한 이야기를 잠깐 하자면 대충 보기만해도 action:start라는 내용이 들어오면 EC2가 실행되고 action:stop이 들어오면 EC2가 중지되는 것을 알 수 있다 이를 바탕으로 간단한 테스트를 진행해보자. Deploy를 한 후에 test를 눌러 테스트 이벤트를 구성한다. 위에서 말한 것과 같이 action:start or action:stop만 있으면된다.
이제 테스트를 진행하면 아주 잘 동작하는 것을 확인 할 수 있다.

EventBridge

원래 Cloudwatch에서 규칙을 지정해주던거 같은데 EventBridge라는 이름으로 옮겨진것 같다.. 먼저 EC2 Start부터 만들겠다. EventBridge에 가서 규칙 -> 규칙생성을 클릭한다. 그 후에 이름을 입력해주고 규칙 유형은 일정으로 변경한다.

이제 cron을 지정해주면 되는데 필자는 09시부터 18시까지로 진행할 것이기 때문에
(0 0 ? * MON-FRI *)로 지정해주었다. 참고로 그리니치 평균시 기준이기 때문에 -9를 해줘야 한국과 시간이 일치한다. 잘 모르겠으면 현지시간대로 선택한 뒤 시간을 계속 바꿔보자.

대상을 선택해주면 되는데 대상 = Lambda 그리고 함수는 방금 만든 Lambda함수, 추가설정에서 대상 입력 구성을 Json으로 변경한 뒤 Json을 만들어 준다. 이후에 대상을 검토하고 생성을 해주면 된다.

같은 방법으로 Stop도 만들어주면 된다.

18시 퇴근 기준으로 시간은 9로 지정해주면 된다.

action은 방금과 반대로 "action" : "stop"으로 지정해주면 된다.

이제 모든 것을 검토한 뒤 생성을 눌러주면 끝이난다.

이제 모든 구성이 끝났으므로 퇴근하기전에 EC2를 중지시키는 귀찮은 일은 안해도 된다. 퇴근하고 EC2를 껏나? 라는 생각에 AWS를 접속해보지 않아도 된다. 이제 자유로운 몸이 되었다.그러니 10분 전에 퇴근하자

profile
devops engineer가 되기 위해

0개의 댓글