메뉴 닫기

[Tech]Lambda를 사용해서 Amazon EC2 인스턴스를 정기적으로 중지 및 시작

안녕하세요,

이번 시간에는 EC2 인스턴스를 정기적으로 사용하지 않는 시간에 자동으로 중지하여 비용을 절감하는 방법을 소개해드리겠습니다.

 

예를 들어, 주말과 같이 사내에서 서버를 사용하지 않는 경우, 해당 시간에 인스턴스를 꺼두면 불필요한 비용을 줄일 수 있습니다.

이 작업은 **AWS Lambda + Amazon EventBridge 스케줄링을 사용하여 간단하게 자동화할 수 있습니다.

1. IAM  생성

  1. AWS 콘솔에 접속하신후  해당 Lambda에 권한을 부여할 IAM 정책을 생성합니다.
    아래 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 역할을 AWS 서비스 > Lambda를 사용사례로하여 역할을 생성합니다.
  •  1번에서 생성한 정책을 IAM 역할에 연결합니다.

2.Lambda  생성

Lambda에 연결할 역할을 생성하였으니 이제 Lambda페이지로 이동하여 Lambda 함수 생성합니다.
함수이름은 StopEC2,StartEC2와 같이 설명하는 이름을 입력합니다.
런타임은 Python 3.9
권한은 기존 역할 사용을 선택후 만들어 놓은 IAM역할 이름을 입력하여 연결합니다.

값을 전부 입력 하였다면 함수 생성을 선택합니다.

 

이제 생성된 Lambda 함수에 코드 탭의 코드 소스에 아래의 코드를 입력합니다.
‘리전’에는 대상 서버의 리전, ‘인스턴스ID’에는 대상 인스턴스의 id를 입력하빈다(i-xxxxx)

Stop_instance 코드

#Stop python
import boto3
region = ‘리전’
instances = [‘인스턴스ID’, ‘인스턴스ID’]
ec2 = boto3.client(‘ec2’, region_name=region)
def lambda_handler(event, context):
    ec2.stop_instances(InstanceIds=instances)
    print(‘stopped your instances: ‘ + str(instances))
Start_instance 코드
#Start python
import boto3
region = ‘리전’
instances = [‘인스턴스ID’,’인스턴스ID’]
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를 하여 해당 함수가 정상적으로 작동하는지 확인해보도록 하겠습니다.
Deploy 밑의 Test 버튼을 선택 혹은 코드 오른쪽 탭의 ‘테스트’탭을 선택합니다.
그러면 새 이벤트 생성을 선택후 이벤트 이름을 입력합니다.
참고 : 테스트 이벤트의 JSON코드를 변경하지 마세요
이후 테스트를 실행합니다.
그렇다면 아래와 같이 Status : Succeeded를 확인하실수 있으십니다.
이후 제대로 작동을 하였는지 EC2 서버에 가서 확인해보도록 하겠습니다.
ec2 서버가 중지가 정상적으로 작동하는것을 확인 할 수 있습니다.

3.EventBridge 생성 

이제 Lambda 함수 작성은 완료 하였습니다.
이제 서버를 정기적으로 사용하지 않는 시간대에는 중지되고 사용하는 기간에는 구동하도록 규칙을 만들어 보도록 하겠습니다.
AWS 콘솔에서 Amazon EventBridge 콘솔 > 일정 으로 이동합니다.
일정 생성을 선택후 해당 일정 패턴을 아래와 같이입력합니다.
해당일정은 Stop일정 이며
반복적으로 작업이 일어나길 원하시면 반복 일정, 일회성 작업을 원하시면 일회성 일정 선택
시간대는 해당 작업이 일어나는 시간대를 확인하기 편하게 해줍니다, 저는 서울 리전을 선택하겠습니다.
일정유형에서 Cron 기반 일정을 선택하여
매주 금요일 19시가 되면 서버가 중지되도록 하는 Cron 표현식입니다.
아래 표를 확인하여 원하시는 시간대에 맞게 크론식을 작성합니다
필드 범위 의미 예시
분 (Minute) 0–59 몇 분에 실행할지 0 → 매 시각 0분 (정시)
시 (Hour) 0–23 몇 시에 실행할지 9 → 오전 9시
일 (Day of Month) 1–31 매달 몇 일에 실행할지 15 → 매달 15일
월 (Month) 1–12 몇 월에 실행할지 1 → 1월
요일 (Day of Week) 0–6 또는 SUN–SAT 요일 지정 1-5 → 월~금 (0 또는 7은 일요일)
연도 (Year) (선택적) 예: 2025 특정 연도만 실행할 경우 2025

특수 기호

기호 의미 예시
* 모든 값 * * * * * → 매 분마다 실행
, 여러 값 지정 1,15 → 1일과 15일에 실행
- 범위 지정 1-5 → 월~금 실행
/ 간격 지정 */10 → 10분마다 실행
? 특정하지 않음 (요일/일 중 하나 생략 시 사용) AWS에서 주로 사용

크론값을 넣은 후 다음을 누르시면 대상 API 설정 창이 나옵니다.

우리는 Lambda를 사용하기로 하였으니 AWS Lambda를 선택후 아래 Invoke에서 대상 함수를 선택합니다.

설정일 완료 되었다면, 생성을 선택합니다.

이와 같은 방식으로, 사용하지 않는 시간대에 EC2 인스턴스를 자동으로 중지하고, 사용 시간에 자동으로 시작하도록 설정할 수 있습니다.
이를 통해 비용 절감 효과는 물론, 리소스 낭비 없이 효율적인 운영이 가능합니다.

 

지금까지 Lambda + EventBridge를 이용한 EC2 자동 시작/중지 구성 방법에 대해 알아보았습니다.
이 방식은 특히 업무 시간 외에는 서버를 사용하지 않는 환경에 매우 유용합니다.

앞으로도 AWS 인프라를 보다 효율적으로 운영하기 위한 꿀팁을 지속적으로 공유드리겠습니다.
감사합니다!

 

 


 

참고 문서

https://repost.aws/ko/knowledge-center/start-stop-lambda-eventbridge