[태그:] EC2 정지

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