FinOps

[Lambda] 업무시간 외 EC2 Stop/Start

김붕어87 2025. 4. 14. 13:47
반응형

 

개요
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