EC2 인스턴스 1대 이상 준비
인스턴스 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 인스턴스만 실행되어야 한다. ( 현재 시간 14시 )
Test 클릭
now >> date : 현재요일, hour: 현재시간 표시
스크립트 실행 결과 test 인스턴스만 실행된 것 확인
'Infra > AWS' 카테고리의 다른 글
AWS VPC private subnet & public subnet NAT gateway, Internet gateway (0) | 2024.07.10 |
---|---|
lambda - available EBS volume 목록 message to slack (0) | 2024.07.04 |
AWS S3 버킷 생성 JS, React 배포, 데이터 백업 (0) | 2023.10.23 |
AWS EC2 생성 (ubuntu 프리티어) (0) | 2023.10.23 |
EC2 - S3 파일 복사 (1) | 2023.10.23 |