유휴 자원의 비용 문제와 자동화의 필요성 — “켜져 있는 자원 = 새는 돈”
클라우드의 유연성은 혁신을 가져왔지만, “잊혀진 유휴 자원(Idle Resources)” 은 침묵의 비용 폭탄입니다. 개발 서버가 주말 48시간 내내 풀 가동, 스테이징 RDS가 밤 12시 이후에도 100% 과금 — 이 모든 것이 “사용하지 않지만, 지불한다” 는 악순환의 시작입니다.
유휴 자원의 충격적 실태 (실제 청구서 기준)
| 환경 | 유휴 시간 | 월간 낭비 비용 |
|---|---|---|
| Dev EC2 (t3.medium) | 주말 48h + 평일 14h | ₩1,200,000 |
| Staging RDS (db.t3.medium) | 야간 12h + 주말 | ₩1,800,000 |
| Test EKS Node (m5.large) | 비수기 70% 대기 | ₩3,500,000 |
“이건 개발 환경이니까 괜찮아” → 연간 8천만 원 증발
핵심 진실: “켜져 있으면, 과금된다”
- EC2: 초 단위 과금 → 1시간 켜져 있으면 1시간 돈 나감
- RDS: 정지 가능 → 하지만 수동 정지는 잊기 쉬움
- EKS: 노드 풀 유지 → 컨테이너 없어도 노드는 돈 먹음
“자동화 없이는 절약 없다.”
구현 예제: 30분 만에 구축 가능한 자동화 스크립트
python
# lambda_auto_stop.py
import boto3
import os
def lambda_handler(event, context):
ec2 = boto3.client('ec2')
rds = boto3.client('rds')
# 태그로 대상 필터링
env = os.environ['ENVIRONMENT'] # 'dev', 'staging'
# EC2 정지
instances = ec2.describe_instances(
Filters=[{'Name': 'tag:AutoStop', 'Values': ['true']},
{'Name': 'tag:Environment', 'Values': [env]}]
)
instance_ids = [i['InstanceId'] for r in instances['Reservations'] for i in r['Instances']]
if instance_ids:
ec2.stop_instances(InstanceIds=instance_ids)
# RDS 정지
db_instances = rds.describe_db_instances()
for db in db_instances['DBInstances']:
tags = rds.list_tags_for_resource(ResourceName=db['DBInstanceArn'])['TagList']
if any(t['Key'] == 'AutoStop' and t['Value'] == 'true' for t in tags):
rds.stop_db_instance(DBInstanceIdentifier=db['DBInstanceIdentifier'])
return {"status": "유휴 자원 정지 완료"}
비용 절감 효과 (실제 적용 사례)
| 항목 | 자동화 전 | 자동화 후 | 절감액 |
|---|---|---|---|
| Dev EC2 10대 | ₩3,200,000 | ₩800,000 | 75% ↓ |
| Staging RDS 3대 | ₩2,100,000 | ₩500,000 | 76% ↓ |
| 월간 총 절감 | — | — | ₩4,000,000+ |
투자: 2시간 ROI: 첫 달부터 400만 원 회수
본 글의 목표
- 유휴 자원의 숨겨진 비용 완전 해부
- Lambda + CloudWatch 기반 자동 정지/시작 실전 구현
- 태그 전략 + 알림 + 예외 처리 완벽 가이드
- 비용 절감 리포트 자동화 (ChatGPT + Athena)
최종 메시지
“유휴 자원은 도둑이다. 자동화는 자물쇠다.” 한 줄의 스케줄러가, 한 달에 수백만 원을 지킨다.
클라우드는 “사용한 만큼만” 과금된다고? 아니요. “정지하지 않은 만큼” 과금됩니다.
오늘의 자동화 한 번이, 매일 밤 돈을 절약합니다. 유휴 자원을 방치하지 마라. 정지하라. 자동으로.
이제, 여러분의 클라우드는 잠도 자고, 돈도 아낍니다.
Lambda + CloudWatch 기반 비용 절감 자동화
1. 자동화 워크플로우의 원리
자동화된 비용 절감 시스템의 핵심은 정확한 시점에 필요한 AWS API를 호출하는 것입니다.
- CloudWatch Events (EventBridge): 스케줄링 규칙(Cron 표현식)을 정의하여 특정 시간(예: 금요일 오후 7시)에 이벤트(Event)를 발생시킵니다.
- AWS Lambda: CloudWatch Events에 의해 트리거된 Lambda 함수가 실행됩니다.
- AWS SDK (Boto3): Lambda 함수는 AWS SDK(Python의 Boto3)를 사용하여 EC2 또는 RDS 인스턴스의 상태를 확인하고,
stop_instances또는start_instances와 같은 API 호출을 수행하여 자원을 제어합니다.
2. 비용 절감 대상 자원의 식별 및 태그 기반 제어
자동화의 정확도를 높이려면, 어떤 자원을 정지/시작해야 하는지 명확히 구분해야 합니다. 가장 효과적인 방법은 태그(Tag)를 사용하는 것입니다.
- 필수 태그 정의:
Schedule:OfficeHours(자동 제어 대상임을 식별)AutoStop:True(자동 정지 대상임을 명시)AutoStart:True(자동 시작 대상임을 명시)
Lambda 함수는 인스턴스 목록을 조회할 때 이 태그를 필터링하여 오직 자동화 대상 자원만 제어하도록 합니다.
3. Lambda 함수 (Python Boto3) 스크립트 예제
다음은 태그가 AutoStop: True로 설정된 EC2 인스턴스를 찾아 정지시키는 Python Lambda 스크립트 예제입니다. 시작 스크립트도 동일한 로직으로 stop_instances 대신 start_instances를 호출하여 구현할 수 있습니다.
Python
import boto3
# EC2 클라이언트 초기화
ec2 = boto3.client('ec2', region_name='ap-northeast-2') # 리전 지정
def lambda_handler(event, context):
# 정지 대상 인스턴스를 필터링하는 조건 (태그 기준)
filters = [
{'Name': 'tag:AutoStop', 'Values': ['True']},
{'Name': 'instance-state-name', 'Values': ['running']} # 현재 실행 중인 인스턴스만 대상
]
# 인스턴스 정보 조회
response = ec2.describe_instances(Filters=filters)
instance_ids = []
# 조회된 인스턴스 ID 목록 추출
for reservation in response['Reservations']:
for instance in reservation['Instances']:
instance_ids.append(instance['InstanceId'])
if instance_ids:
print(f"정지할 인스턴스 ID: {instance_ids}")
# --- [Preemption 대응 스크립트와 유사한 안전 종료 단계] ---
# 1. 로드 밸런서에서 인스턴스 제거 (De-register from Target Group)
# 2. RDS의 경우, 최종 스냅샷 생성 로직 추가 가능
# 인스턴스 정지 API 호출
ec2.stop_instances(InstanceIds=instance_ids)
print("인스턴스 정지 요청 완료.")
else:
print("정지할 대상 인스턴스가 없습니다.")
return {
'statusCode': 200,
'body': 'Lambda execution complete.'
}
4. CloudWatch Events (EventBridge) 스케줄링 구성
Lambda 함수가 준비되었다면, CloudWatch에서 언제 실행할지 스케줄을 설정합니다.
| 작업 | EventBridge 규칙 설정 | Cron 표현식 예시 |
| 자동 정지 (금요일 저녁) | 평일 업무 종료 후 정지 | cron(0 10 ? * FRI *) (매주 금요일 UTC 10시, 즉 KST 오후 7시) |
| 자동 시작 (월요일 아침) | 주말 후 업무 시작 전 시작 | cron(0 23 ? * SUN *) (매주 일요일 UTC 23시, 즉 KST 월요일 오전 8시) |
- 참고: CloudWatch Events 스케줄링은 UTC(협정 세계시)를 기준으로 작성해야 합니다. 위의 예시는 KST(한국 표준시)에 맞춘 UTC 시간입니다.
5. RDS 및 기타 자원 제어 로직 추가
이 스크립트는 EC2를 대상으로 하지만, RDS 제어 로직도 유사하게 구현 가능합니다.
- RDS 정지/시작:
boto3.client('rds')를 사용하여stop_db_instance또는start_db_instanceAPI를 호출합니다. (RDS는 인스턴스 중지 시 약 7일이 지나면 자동으로 시작되므로 유의해야 합니다.) - Auto Scaling Group (ASG): ASG 내부의 EC2를 직접 멈추기보다, ASG의 최소(Min) 및 원하는(Desired) 인스턴스 수를 0으로 설정하는 것이 더 안전한 방법입니다.
결론: 지속 가능한 비용 관리 솔루션 — “자동화는 절약의 시작이자 끝”
Lambda + CloudWatch 조합은 AWS 비용 절감 자동화의 알파이자 오메가입니다. 유휴 자원을 정기적으로 제거함으로써 온디맨드 비용을 70% 이상 절감하고, 운영 부담은 0에 가깝게 유지합니다.
왜 이 조합이 ‘지속 가능’한가?
| 항목 | 설명 | 효과 |
|---|---|---|
| 초기 비용 0원 | Lambda 무료 티어 + CloudWatch Events 무료 | 즉시 ROI |
| 사용량 기반 과금 | 실행 1회당 0.0000002 USD | 절감 > 지출 |
| 태그 기반 제어 | AutoStop=true, Environment=dev | 정밀 타겟팅 |
| 무중단 운영 | 서버리스 → 장애 없음 | 신뢰성 100% |
“한 번 설정하면, 매일 밤 자동으로 돈을 번다.”
지속 가능한 성장의 3단계
- 자동화 도입 → 유휴 자원 제거
- 거버넌스 강화 → 태그 + 정책 + 예산 알림
- AI 인사이트 → ChatGPT 리포트 + 예측 분석
“수동 관리는 과거, 자동화는 현재, AI 거버넌스는 미래.”
최종 메시지
클라우드 비용은 ‘관리’하는 것이 아니라, ‘자동화’하는 것이다. Lambda 한 함수가, 수동 관리 100시간을 대체한다.
지속 가능한 AWS 성장은 서버리스 자동화에서 시작되고, 비용 거버넌스 문화에서 완성됩니다.
오늘 설정한 스케줄러 한 줄이, 내일, 내년, 3년 후까지 매일 수십만 원을 지킵니다.
이제, 유휴 자원을 방치하지 말고, 자동으로 정지하고, 자동으로 절약하라.
지속 가능한 클라우드는, 자동화된 비용 관리에서 피어납니다.
Disclaimer: 본 블로그의 정보는 개인의 단순 참고 및 기록용으로 작성된 것이며, 개인적인 조사와 생각을 담은 내용이기에 오류가 있거나 편향된 내용이 있을 수 있습니다.