Lambda + CloudWatch 조합으로 비용 절감 자동화하기: 불필요한 자원 자동 정지/시작 스케줄링

유휴 자원의 비용 문제와 자동화의 필요성 — “켜져 있는 자원 = 새는 돈”

클라우드의 유연성은 혁신을 가져왔지만, “잊혀진 유휴 자원(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,00075% ↓
Staging RDS 3대₩2,100,000₩500,00076% ↓
월간 총 절감₩4,000,000+

투자: 2시간 ROI: 첫 달부터 400만 원 회수


본 글의 목표

  1. 유휴 자원의 숨겨진 비용 완전 해부
  2. Lambda + CloudWatch 기반 자동 정지/시작 실전 구현
  3. 태그 전략 + 알림 + 예외 처리 완벽 가이드
  4. 비용 절감 리포트 자동화 (ChatGPT + Athena)

최종 메시지

“유휴 자원은 도둑이다. 자동화는 자물쇠다.” 한 줄의 스케줄러가, 한 달에 수백만 원을 지킨다.

클라우드는 “사용한 만큼만” 과금된다고? 아니요. “정지하지 않은 만큼” 과금됩니다.


오늘의 자동화 한 번이, 매일 밤 돈을 절약합니다. 유휴 자원을 방치하지 마라. 정지하라. 자동으로.

이제, 여러분의 클라우드는 잠도 자고, 돈도 아낍니다.


Lambda + CloudWatch 기반 비용 절감 자동화

1. 자동화 워크플로우의 원리

자동화된 비용 절감 시스템의 핵심은 정확한 시점에 필요한 AWS API를 호출하는 것입니다.

  1. CloudWatch Events (EventBridge): 스케줄링 규칙(Cron 표현식)을 정의하여 특정 시간(예: 금요일 오후 7시)에 이벤트(Event)를 발생시킵니다.
  2. AWS Lambda: CloudWatch Events에 의해 트리거된 Lambda 함수가 실행됩니다.
  3. 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_instance API를 호출합니다. (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단계

  1. 자동화 도입 → 유휴 자원 제거
  2. 거버넌스 강화 → 태그 + 정책 + 예산 알림
  3. AI 인사이트 → ChatGPT 리포트 + 예측 분석

“수동 관리는 과거, 자동화는 현재, AI 거버넌스는 미래.”


최종 메시지

클라우드 비용은 ‘관리’하는 것이 아니라, ‘자동화’하는 것이다. Lambda 한 함수가, 수동 관리 100시간을 대체한다.

지속 가능한 AWS 성장은 서버리스 자동화에서 시작되고, 비용 거버넌스 문화에서 완성됩니다.


오늘 설정한 스케줄러 한 줄이, 내일, 내년, 3년 후까지 매일 수십만 원을 지킵니다.

이제, 유휴 자원을 방치하지 말고, 자동으로 정지하고, 자동으로 절약하라.

지속 가능한 클라우드는, 자동화된 비용 관리에서 피어납니다.


Disclaimer: 본 블로그의 정보는 개인의 단순 참고 및 기록용으로 작성된 것이며, 개인적인 조사와 생각을 담은 내용이기에 오류가 있거나 편향된 내용이 있을 수 있습니다.

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다