EC2 인스턴스 1대 이상 준비

https://yes5.tistory.com/29

 

AWS EC2 생성 (ubuntu 프리티어)

EC2 검색 > 인스턴스 인스턴스 시작 클릭 이름 지정 OS 선택 (여기선 ubuntu Server 22.04 LTS ) 인스턴스 유형 t2.micro 키 페어 선택 없다면 새 키 페어 생성 .pem으로 생성 putty 사용자라면 .ppk 네트워크 설

yes5.tistory.com

인스턴스 ID 클릭 > 태그 > 태그 관리

DAY : 정지, 가동 기능을 사용 할 요일 선택

TIME : 가동 할 시간 선택 (범위 밖의 시간은 정지 상태)

AUTOSTOP_ENABLE : true 사용, false 미사용

저장

 

IAM 검색 > 액세스 관리 > 정책

 

정책 생성

 

정책 편집기 > JSON

 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": "arn:aws:ec2:*:*:instance/*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "ec2:DescribeInstances",
                "ec2:DescribeTags",
                "logs:CreateLogGroup",
                "logs:PutLogEvents",
                "ec2:DescribeInstanceStatus"
            ],
            "Resource": "*"
        }
    ]
}

위 코드 내용 복붙

 

다음

 

정책 이름 : EC2_Auto_Start_Stop

설명 : EC2_Auto_Start_Stop

> 정책 생성

 

IAM > 엑세스 관리 > 역할 > 역할 만들기

 

AWS 서비스

 

사용 사례 > Lambda

 

다음

 

권한정책 > 검색창 EC2_Auto_Start_Stop 입력 > 선택 > 다음

 

역할 이름 : EC2_Auto_Start_Stop_Role > 역할 생성

 

Lambda 검색 >  함수 > 함수 생성

 

함수 이름 : EC2_Auto_Start_Stop_Lambda

런타임 : Python 3.8

 

기본 실행 역할 변경 > 기존 역할 사용 

 

EC2_Auto_Start_Stop_Role 선택 > 함수 생성

 

# -*- coding: utf-8 -*-
import boto3
from datetime import datetime

# 서울 리전
region = 'ap-northeast-2'
# 월 ~ 일요일 
t = ["월", "화", "수", "목", "금", "토", "일"]

def lambda_handler(event, context):
    # 람다 호출된 시점의 시간을 구합니다.
    print("start")
    now_date = t[datetime.today().weekday()]
    now_hour = int(datetime.now().strftime('%H')) + 9
    print(f"now >> date: {now_date}, hour: {now_hour}")

    # ec2 인스턴스의 모든 태그를 조회합니다.
    ec2 = boto3.client('ec2', region_name=region)
    response = ec2.describe_tags(
        Filters=[
            {
                'Name': 'resource-type',
                'Values': ['instance']
            }
        ]
    )
    
    # 값 임시 저장
    enable_instances = []
    day_instances = {}
    time_instances = {}
    
    # AUTO_STOP_ENABLE 태그가 true인 값만 추출합니다
    for tag in response['Tags']:
        if tag['Key'] == "AUTOSTOP_ENABLE" and tag['Value'].lower() == "true":
            enable_instances.append(tag['ResourceId'])
        if tag['Key'] == "DAY":
            day_instances[tag['ResourceId']] = tag['Value']
        if tag['Key'] == "TIME":
            time_instances[tag['ResourceId']] = tag['Value']

    for instance in enable_instances:
        try:
            # 요일이 일치하는지 확인합니다.
            days = day_instances[instance].split(",")            
            is_day = False
            for d in days:
                if now_date == d:
                    is_day = True
            
            # 시간이 일치하는지 확인합니다.
            times = time_instances[instance].split("~")
            is_start_time = False
            is_end_time = False
            if int(times[1].strip()) == now_hour:
                is_end_time = True
            elif int(times[0].strip()) == now_hour:
                is_start_time = True

            if is_day == True and is_end_time == True:
                # 중지 인스턴스 호출
                ec2.stop_instances(InstanceIds=[instance])
            elif is_day == True and is_start_time == True:
                # 시작 인스턴스 호출
                ec2.start_instances(InstanceIds=[instance])
        except Exception as ex:
            print(ex)
    
    print("end")

코드 소스 > 코드 복붙 > Deploy

 

트리거 추가 

 

EventBridge 선택

 

룰 이름 : EC2_Auto_Start_Stop

cron(0 */1 * * ? *) 매시 정각에 람다 호출 

추가

 


설정 끝 테스트 시작

 

먼저 test, auto-start-stop 인스턴스 모두 종료

test 인스턴스의 태그
auto-start-stop 인스턴스의 태그

람다 함수가 실행 되면 test 인스턴스만 실행되어야 한다. ( 현재 시간 14시 )

 

Test 클릭

 

now >> date : 현재요일, hour: 현재시간 표시

 

스크립트 실행 결과 test 인스턴스만 실행된 것 확인

+ Recent posts