개요
DEV환경은 업무시간에만 사용하는 테스트 환경입니다.
업무시간(09:00 ~ 18:00) 외 모든 리소스를 Stop하고 업무시간에는 모든 리소스를 Start 해서 요금을 줄입니다.
업무시간 : 09:00 ~ 18:00 (총 9시간)
업무시간 외 : 24시간 - 업무시간 (총 15시간)
1DAY : 업무시간 외 Stop을 하면 하루에 15시간 요금을 줄일 수 있습니다.
365DAY : 15 * 365 = 5475시간 ( 5475시간 / 24시간 = 228.125일)
1년 기준으로 하면 228일 요금을 줄일 수 있습니다.
1. 요금을 줄일 수 있는 리소스
- EC2
- RDS DB
- WorkerNode
- Fargate
- 등
2. 요금을 줄이는 스케쥴링 방식
Stop & Start 스케쥴링은 여러 방식이 있습니다.
이 글에서는 Lambda + EventBrige 방식으로 진행합니다.
ex)
EventBridge Rule : 09:00시 -> Start EC2 instance Lambda 실행
EventBridge Rule : 18:00시 -> Stop EC2 instance Lambda 실행
3. EC2 스케쥴링
3-1. IAM Role 생성
[ Lambda에서 사용할 Role Policy 생성 ]
Lambda 함수에서 EC2 Instance Stop & Start 권한 넣기
AWS Consoel -> IAM -> Policy -> policy 생성
Policy Name : dev-lambda-ec2-Policy
{
"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": "*"
}
]
}
AWS Consoel -> IAM -> Role -> Role 생성
Role Name : dev-lambda-schedule-role
Policy Attach : dev-lambda-ec2-Policy
[ EventBridge에서 사용할 Role & Policy 생성 ]
EventBridge에서 Lambda 함수를 실행할 권한 넣기
AWS Consoel -> IAM -> Policy -> policy 생성
Policy Name : dev-Amazon-EventBridge-Scheduler-Execution-Policy
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": [
"arn:aws:lambda:ap-northeast-2:xxx:function:StopEC2Instances:*",
"arn:aws:lambda:ap-northeast-2:xxx:function:StopEC2Instances",
"arn:aws:lambda:ap-northeast-2:xxx:function:StartEC2Instances:*",
"arn:aws:lambda:ap-northeast-2:xxx:function:StartEC2Instances",
]
}
]
}
AWS Consoel -> IAM -> Role -> Role 생성
Role Name : dev-Amazon_EventBridge_Scheduler_LAMBDA_role
Policy Attach : dev-Amazon-EventBridge-Scheduler-Execution-Policy
3-2. Lambda 함수 생성
- EC2StopInstance Lambda 함수 만들기
AWS Console -> Lambda -> 함수 -> 함수 생성
함수 이름 : StopEC2Instances
런타임 : Python 3.9
기본 실행 역할 변경 -> 실행 역할 : 기존 역할 사용 클릭
기존 역할 : dev-lambda-schedule-role 클릭
함수 생성
코드 소스
import boto3
region = 'ap-northeast-2'
instances = ['i-instance-idxxxxxxxx']
ec2 = boto3.client('ec2', region_name=region)
def lambda_handler(event, context):
ec2.stop_instances(InstanceIds=instances)
print('stopped your instances: ' + str(instances))
Deploy 코스 업로드
TEST 실행
AWS -> AWS CloudTrail -> 이벤트 기록 클릭
속성 조회 : 이벤트 이름
값 : StopInstances
Lambda가 EC2 stop되었는지 감사로그 확인 가능
- EC2StartInstance Lambda 함수 만들기
AWS Console -> Lambda -> 함수 -> 함수 생성
함수 이름 : StartEC2Instances
런타임 : Python 3.9
기본 실행 역할 변경 -> 실행 역할 : 기존 역할 사용 클릭
기존 역할 : dev-lambda-schedule-role 클릭
함수 생성
코드 소스
import boto3
region = 'ap-northeast-2'
instances = ['i-instnace-idxxxxx']
ec2 = boto3.client('ec2', region_name=region)
def lambda_handler(event, context):
ec2.start_instances(InstanceIds=instances)
print('started your instances: ' + str(instances))
Deploy 코스 업로드
TEST 실행
3-1. EventBridge 생성
AWS Console -> Amazon EventBridge -> 일정 -> 일정 생성
일정 이름 : StopInstances
설명 : Scheduling server off outside of business hours
일정 그룹 : 선택
일정 패턴 : 반복 일정 선택
시간대 : (UTC+09:00) Asia/Seoul)
일정 유형 : Cron 기반 일정
Cron 표현식 : 0 18 ? * MON-FRI *
유연한 기간 : 꺼짐
대상 세부 정보 : AWS Lambda 선택
Lambda 함수 : StopInstances 선택
일정 완료 후 작업 : NONE
재시도 정책 : No
DLQ : 없음
기존 역할 사용 : dev-Amazon_EventBridge_Scheduler_LAMBDA_role 선택
'FinOps' 카테고리의 다른 글
[Lambda] awscli Layer 설정 (0) | 2025.04.16 |
---|---|
[Lambda] 업무시간 외 Fargate Stop/Start (0) | 2025.04.16 |
[Lambda] 업무시간 외 AuroraDB Stop/Start (0) | 2025.04.14 |