운영 환경에서는 테스트용 EC2 인스턴스를 상시 실행해 둘 필요가 없다. 이를 고려하여 업무 시간 외에는 EC2를 자동으로 중지하고, 비용을 절감하기 위한 방안으로 AWS Lambda와 EventBridge를 연동하여 EC2를 자동 중단하는 구성을 아래와 같이 정리한다.
01. 주요 작업 요약
- IAM 신규 정책(Policy) 및 역할(Role)을 생성
- Lambda(Python) 기반으로, EC2 인스턴스 종료/시작 함수를 생성
- AWS Event Bridge를 활용하여 특정 시간 패턴에 따라 종료/시작 하도록 환경 구성
02. IAM 정책 및 역할 생성
02-1. IAM 정책 생성
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"logs:CreateLogGroup",
"logs:PutLogEvents"
],
"Resource": [
"arn:aws:logs:*:*:*"
]
},
{
"Sid": "Statement2",
"Effect": "Allow",
"Action": [
"ec2:Start*",
"ec2:Stop*"
],
"Resource": "*"
}
]
}
경로 : IAM > 정책 > 정책 생성
우선 Lambda에서 사용할 역할 및 권한을 부여하기 위해 신규 커스텀(Custom) 정책을 생성한다. Lambda에서 Cloudwatch Log를 쓰고, EC2의 시작/중지를 제어하기 위해 위와 같이 정책을 설정 한다.
02-2. IAM Role 생성
1. 신뢰할 수 있는 엔터티 선택
IAM > 역할 > 역할 생성
정책(Policy)을 생성했으니, 이제 역할(Role)을 생성할 차례이다. 역할(Role)은 어떤 AWS 서비스가 어떤 작업을 수행할 수 있는지를 정의하며, 이 역할에 앞서 생성한 정책(Policy)을 연결하여 사용한다. 위 이미지에서는 AWS 서비스로 Lambda를 지정하고 다음 버튼을 클릭한다.
2. 권한 추가
여기서는 이전에 생성한 정책(Policy)를 지정해준다. 이렇게 함으로써, 해당 역할(Role)을 Assume 받은 AWS 서비스에서는 정책에 선언된 권한을 행사할 수 있는 것이다. 다음 버튼을 클릭한다.
3. 이름 지정, 검토 및 생성
마지막으로 역할 이름을 지정하고 역할 생성을 클릭하면 마무리 된다.
IAM 정책, 역할을 모두 생성하였으니 이제 Lambda 함수를 만들어보자.
03. Lambda 설정
03-1. 함수 생성
Lambda 함수 생성 버튼을 클릭하면 위와 같은 화면이 출력된다. 자세한 옵션은 아래와 같다.
✅ 1. 함수 생성 방법
- 새로 작성 : Hello World 수준의 기본 Lambda 코드를 직접 작성하여 생성
- 블루프린트 사용 : 미리 구성된 Lambda 템플릿 사용
- 컨테이너 이미지 : ECR에 업로드된 컨테이너 이미지 기반으로 Lambda 생성
✅ 2. 기본정보
- 함수 이름 : Lambda 함수명 기재
- 런타임 : 함수 코드 실행 환경으로, Python, nodejs, java, Ruby, Go 등을 선택 가능
- 아키텍처 : Lambda를 실행할 CPU 프로세서 아키텍처 지정, arm64는 비용 절감 가능
✅ 3. 기본 실행 역할 변경
실행 역할 : Lambda가 AWS 리소스에 접근하거나 특정 행위를 하기 위해 역할(Role)을 사용하는 방법
- 기본 Lambda 권한을 가진 새 역할 생성은, AWS에서 자동으로 역할을 생성하고, AWSLambdaBasicExecutionRole 정책을 붙혀준다. 해당 정책은 Cloudwatch Logs에 로그를 기록할 수 있는 최소 권한을 가진다
- 기본 역할 사용은, 기존에 사용자가 만든 역할 사용할 때 사용하는 옵션이다
- AWS 정책 템플릿에서 새 역할 생성은 AWS에서 제공하는 정책 템플릿을 기반으로 새 역할을 생성한다. 예로는 S3 접근, VPC 접근 등이 존재한다
✅ 4. 추가 구성
- Networking
- 함수 URL 활성화 옵션은 Lambda 함수에 HTTPS 주소(URL)를 자동으로 생성해주는 기능이다. 이를 통해 API Gateway 없이도 외부에서 HTTP 요청으로 함수를 직접 호출할 수 있다.
- VPC 활성화는 Lambda 함수가 AWS RDS, EC2 같은 VPC 내부 리소스에 접근해야 할 때 사용하는 옵션이다. 이 기능을 활성화하면 Lambda가 지정된 VPC의 서브넷과 보안그룹을 통해 통신이 가능해진다.
- Security & governance
- 코드 서명 활성화 옵션은
서명된 코드
만 Lambda에 배포하고 실행할 수 있도록 제한하는 기능이다. 보안이 중요한 조직에서는 검증된 출처에서 온 코드만 사용하도록 설정하기 위해 이 기능을 활성화한다 - AWS KMS 암호화 활성화 옵션은 Lambda 코드를 사용자가 만든 KMS 키로 암호화 할 때 사용한다. 기본적으로 AWS 기본 키를 사용하지만, 보안에 따라 직접 만든 키도 사용 가능하다
- 태그 활성화 옵션은 Lambda에 Key-Value 형식의 태그를 붙여 리소스를 분류하거나 비용 분석, 접근 제어 등에 사용할 수 있다.
- 코드 서명 활성화 옵션은
✅ 5. 함수 작성
import json
import boto3
# EC2 인스턴스 시작/정지를 위한 boto3 클라이언트 생성
region = 'ap-northeast-2'
ec2 = boto3.client('ec2', region_name=region)
def lambda_handler(event, context):
instance_ids = event.get("instance_ids") or [event.get("instance_ids")] or []
if not instance_ids:
print("Instance Id is not provided")
return {
'statusCode': 400,
'body': json.dumps('Instance Id is not provided')
}
# Event Bridge에서 받은 Action값을 가지고 온다
action = event.get("action")
if action == "start":
ec2.start_instances(InstanceIds=instance_ids, DryRun = False)
print(f'EC2 Instance Start ids : ${instance_ids}')
elif action == "stop":
ec2.stop_instances(InstanceIds=instance_ids, DryRun = False)
print(f'EC2 Instance Stop ids : ${instance_ids}')
else:
print(f"Unknown action: {action}")
Lambda 함수는 위와 같이 간략하게 작성 하였다. 필자의 경우 Event Bridge에서 파라미터 인자를 넘겨주면, 해당 파라미터 값을 통해 Lambda 함수의 이벤트 흐름을 제어하고자 한다. 작성이 완료 되었으면 Deploy 버튼을 클릭하여 Lambda 함수를 배포 해준다. 이제 코드 작성을 완료하였으니, 기본 설정 편집을 진행한다.
✅ 6. 기본 설정 편집
- 설명은 선택사항으로 해당 Lambda 함수의 목적이나 기능을 명시하는 란이다
- 메모리는 Lambda 함수에 할당되는 메모리 용량을 지정한다. 메모리는 128MB부터 10,240MB까지 설정할 수 있으며, 메모리를 늘리면 CPU 성능도 함께 증가한다
- 임시 스토리지는 함수 실행 중 /tmp 디렉토리에 사용할 수 있는 임시 저장 공간을 설정한다. 기본값은 512MB이고, 최대 10GB까지 설정할 수 있다. 대용량 데이터를 임시로 저장하거나 처리할 경우 이 값을 늘린다
- SnapStart은 Java 등의 Lambda 함수가 빠르게 시작되도록, 미리 초기화 상태를 저장해두고 실행 시 바로 불러오는 기능이다. Python에서는 사용 불가능하다
- 제한 시간은 Lambda 함수가 실행될 수 있는 최대 시간을 지정하는 항목이다. 기본값은 3초이고, 최대 15분(900초)까지 설정이 가능하다. 이 시간이 초과되면 함수 실행은 중단되고 Timeout ERROR가 발생한다
04. Event Bridge 설정
04-1. 규칙 생성
EventBridge는 이벤트 발생이나 조건 매칭 시, 자동으로 작업을 수행하도록 연결해주는 이벤트 기반 서비스다. 여기서는 Event Bridge에서 제공해주는 규칙(cron)을 통해 Lambda 함수를 특정 시간에 호출하는 방향으로 진행한다.
1. 규칙 세부 정보
- 이름 : Event Bridge의 이름 지정
- 설명 : Event Bridge의 설명 기재
- 이벤트 버스 : 이벤트가 수신되는 통로로, 보통 기본값이 Default를 사용한다
- 규칙 유형
- 이벤트 패턴이 있는 규칙 : 특정 이벤트가 발생했을 때만 작동한다. 예를 들어 EC2 인스턴스의 상태가 변경 되거나, S3에 업로드 이벤트가 발생한 경우 이벤트를 트리거
- 일정 : 지정한 일정(cron)에 따라 주기적으로 실행된다. 예를 들어 매일 오전 9시에 Lambda 실행, 매주 월요일 실행 등 cron(매일 오전 9시, 특정 시간에 정확히 사용) 또는 rate(몇 분마다, 몇 시간마다 주기적 반복) 표현식으로 구성
여기서는 규칙 유형을 일정을 선택하고, 규칙 생성으로 이동 버튼을 클릭한다.
04-2. 일정 정의
cron식을 지정하여 매주 월 - 금요일 오전 9시에 실행되는 스케줄을 작성한다.
04-3. 대상 선택
- 대상 유형 : EventBridge 규칙이 어떤 대상을 실행할지를 선택하는 영역
- 대상 선택 : EventBridge를 통해 이벤트를 전달할 AWS 서비스 지정
- 대상 위치 : 접속한 AWS 계정인지, 다른 AWS 계정인지 지정
- 함수 : Lambda 함수명 지정
- 실행 역할 사용 : 이벤트를 발생시키는 주체(EventBridge)가 Lambda를 호출하는데 필요한 권한을 명시적으로 연결
- 추가 설정 : EventBridge가 Lambda 함수나 다른 서비스에 어떤 데이터를 전달할지 지정하는 옵션
- 재시도 정책
- 최대 이벤트 기간 : 이벤트 전송에 실패한 경우, 몇 시간 or 몇 분간 재시도를 계속 시도할지 지정
- 재시도 횟수 : 실패 시 몇번 더 시도할지 지정
99. 참고 자료
점프 투 파이썬
이 책은 파이썬이란 언어를 처음 접해보는 독자들과 프로그래밍을 한 번도 해 본적이 없는 사람들을 대상으로 한다. 프로그래밍을 할 때 사용되는 전문적인 용어들을 알기 쉽게 풀어서 …
wikidocs.net
EventBridge 를 활용하여 EC2 스케줄링 정지/재시작 설정하기 | 개발자 Story | SKT Enterprise
EC2 스케줄링 정지/재시작 설정하기 EC2의 비용을 절감하기 위해서 개발존, 테스트존 등은 EC2인스턴스를 사용하지 않는 시간에는 정지하고, 매일 아침 9시에 다시 기동해서 업무를 할 수 있도록
www.sktenterprise.com
'Public Cloud > AWS - Practice' 카테고리의 다른 글
[AWS] Saving Plan vs Reserved Instance (0) | 2025.08.07 |
---|---|
[AWS] ECS Network Mode (0) | 2025.07.30 |
[AWS] 자주 사용하는 AWS CLI 정리 (0) | 2025.07.24 |
[AWS] 인터넷 게이트웨이 (0) | 2025.07.10 |
[AWS] AWS VPC, Subnet IP 대역을 설정하는 기준은? (0) | 2025.06.10 |