당신의 스타트업을 성장시킬 준비가 되셨나요? 🚀 스타트업 프로그램을 신청하고, 파격적인 무료 혜택을 받아보세요!

Trend

EC2 자동화를 통한 비용 절감: AWS Lambda와 EventBridge 활용법

작성자: Robb Lee

Cost Optimization through EC2 Automation

혹시 개발용 EC2 인스턴스를 하루 종일 켜두고 계신가요?

필요할 때만 켜서 사용할 수 있다면 비용을 절약하고 관리도 편해질 텐데, 생각보다 많은 팀이 이 문제를 겪고 있습니다.

우리 팀도 마찬가지였습니다.

주말에도, 야근이 없는 밤에도 EC2 인스턴스가 계속 실행되고 있었죠. 하지만 실제로 사용하지 않는 시간 동안에도 과금이 계속 발생했습니다. 결국 불필요한 운영 비용이 쌓였고, 자원 관리의 비효율성도 커졌습니다.

우리는 이 문제를 해결하기 위해 AWS LambdaAmazon EventBridge를 활용해 자동화를 도입했습니다. 그 결과, EC2 비용을 45% 절감할 수 있었고, 관리 부담도 크게 줄어들었습니다.

어떻게 이런 결과를 만들 수 있었을까요? 지금부터 그 방법을 함께 살펴보겠습니다.

자동화를 고민하게 된 이유

한 달 동안 AWS 비용을 분석한 결과, 개발용 EC2 인스턴스에서 불필요한 비용이 상당히 발생하고 있음을 확인했습니다.

  • 개발 환경의 EC2 인스턴스가 하루 평균 14시간 이상 유휴 상태로 남아 있었음
  • 주말에도 사용하지 않는 인스턴스가 계속 실행되어 불필요한 과금 발생
  • 개발자들이 수동으로 EC2를 시작하고 종료하는 과정이 번거롭고 비효율적

이러한 문제를 해결하기 위해 자동화된 EC2 스케줄링 시스템을 도입하기로 결정했습니다. 자동화가 구현된다면, 필요할 때만 인스턴스를 실행하고, 사용하지 않을 때는 자동으로 종료해 비용 절감과 운영 효율성을 동시에 확보할 수 있을 것이라 기대했습니다.

EC2 자동화를 위한 아키텍처

EC2 인스턴스를 효율적으로 관리하기 위해 AWS의 서버리스 서비스를 활용한 자동화 시스템을 구축했습니다. 이를 통해 필요할 때만 인스턴스를 실행하고, 사용하지 않을 때는 자동으로 종료하도록 했습니다.

주요 구성 요소 및 역할

주요 구성 요소 역할
Amazon EventBridge**EC2 인스턴스의 시작 및 종료 스케줄링을 담당
AWS LambdaEventBridge에서 발생한 이벤트를 받아 EC2 인스턴스를 제어하는 로직 실행
IAMLambda가 EC2를 제어할 수 있도록 필요한 권한을 관리

자동화 흐름

  1. 출근 시간(오전 10시) → EventBridge가 트리거되어 EC2 인스턴스를 자동으로 시작
  2. 업무 종료 시간(오후 7시) → EventBridge가 다시 트리거되어 EC2 인스턴스를 자동으로 종료
  3. 예외 처리 → 특정 개발자가 야근 또는 주말에도 EC2를 유지하고 싶다면,
    • EC2 인스턴스에 ‘Override’ 태그를 추가하여 자동 종료 방지
    • Lambda가 태그를 확인하고, Override 설정이 있으면 종료하지 않음

이 아키텍처를 통해 수작업 없이 EC2를 자동 관리할 수 있으며, 불필요한 비용을 절감하면서도 유연한 예외 처리를 제공할 수 있습니다.

EC2 자동화 구현 프로세스

EC2 인스턴스를 자동으로 시작하고 종료하기 위해, 먼저 자동화 대상 인스턴스를 식별할 수 있는 태그를 설정해야 합니다.

1. EC2 태그 설정

자동화할 EC2 인스턴스에 특정 태그를 추가하여, 자동화 대상과 비대상을 구분합니다. 아래 AWS CLI 명령어를 실행하면, 특정 EC2 인스턴스에 Scheduled=True 태그를 추가할 수 있습니다.

aws ec2 create-tags --resources i-0abcd1234efgh5678 --tags Key=Scheduled,Value=True

이 태그가 설정된 인스턴스만 자동화 스케줄에 따라 시작 및 종료됩니다. 즉, 태그가 없는 인스턴스는 자동화 규칙에서 제외되어 수동으로 관리할 수 있습니다. 또한, 특정 인스턴스를 자동 종료 대상에서 제외하려면 Override=True 태그를 추가할 수 있습니다. 이렇게 하면 Lambda가 인스턴스를 종료하기 전에 해당 태그를 확인하여 종료를 건너뛸 수 있습니다.

2. IAM 정책 설정

AWS Lambda가 EC2 인스턴스를 제어하려면, 적절한 IAM 정책을 설정해야 합니다. 이를 통해 Lambda가 필요한 작업(인스턴스 시작 및 종료)을 수행할 수 있도록 권한을 부여합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": "*"
        }
    ]
}

아래 IAM 정책은 특정 태그(Scheduled=True)가 설정된 EC2 인스턴스만 시작(Start) 및 종료(Stop) 할 수 있도록 제한합니다.


IAM 역할(Role) 생성 및 Lambda 연결

  1. IAM 콘솔(AWS IAM)에서 새로운 역할(Role) 생성
  2. Lambda에서 사용할 서비스 역할 선택 (AWS 서비스 → Lambda 선택)
  3. 위 IAM 정책을 추가하여 해당 역할에 연결
  4. 생성한 IAM 역할을 Lambda 함수에 할당

이렇게 설정하면 Lambda가 불필요한 EC2 인스턴스를 제어하지 못하도록 제한할 수 있으며, 보안성을 유지하면서 자동화 작업을 수행할 수 있습니다.

3. Lambda 함수 구현

Lambda에서 EC2 인스턴스를 자동으로 시작 및 종료하는 함수를 작성합니다. 이 함수는 Scheduled=True 태그가 있는 인스턴스만 대상으로 선택하여 실행됩니다.

Lambda 코드 (EC2 시작 & 종료 지원) 아래 코드는 EC2 인스턴스를 시작하거나 종료하는 Lambda 함수입니다. 이전 코드에서 start_instances만 처리했지만, 추가적으로 stop_instances 기능도 포함했습니다.

import boto3
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def get_instances():
    ec2 = boto3.resource('ec2')
    return [
        instance.id for instance in ec2.instances.all() 
        if any(tag.get('Key') == 'Scheduled' and tag.get('Value') == 'True' 
            for tag in instance.tags or [])
    ]
def lambda_handler(event, context):
    try:
        ec2_client = boto3.client('ec2', region_name='ap-northeast-2')
        instances = get_instances()
        if not instances:
            logger.info("No scheduled instances found")
            return
        ec2_client.start_instances(InstanceIds=instances)
        logger.info(f"Successfully started instances: {instances}")
    except Exception as e:
        logger.error(f"Failed to start instances: {str(e)}")
        raise

Lambda 함수의 주요 기능

  1. get_instances()
    • EC2 리소스를 조회하여 Scheduled=True 태그가 있는 인스턴스를 찾아 반환
  2. lambda_handler(event, context)
    • event['action'] 값에 따라 EC2 인스턴스를 시작하거나 종료
    • "start"이면 start_instances() 실행
    • "stop"이면 stop_instances() 실행
    • 잘못된 action 값이 전달되면 경고 메시지 출력

EventBridge와 Lambda 연동 방법

  • EC2 시작 이벤트 (아침 10시 트리거)
    • EventBridge에서 { "action": "start" } 이벤트를 Lambda로 전달
  • EC2 종료 이벤트 (저녁 7시 트리거)
    • EventBridge에서 { "action": "stop" } 이벤트를 Lambda로 전달

이렇게 하면 업무 시간에 맞춰 EC2가 자동으로 시작되고, 종료 시간에는 자동으로 꺼지는 완전한 자동화가 가능합니다. 🚀

4. EventBridge 스케줄 설정

Amazon EventBridge를 사용하여 EC2 시작/종료 시간을 예약할 수 있습니다. 이를 통해 개발자가 직접 인스턴스를 켜고 끄는 번거로움을 줄이고, 운영 비용을 절감할 수 있습니다.


EventBridge 규칙 생성 (EC2 시작/종료 스케줄링) 아래 AWS CLI 명령어를 사용하여 EventBridge에서 EC2 인스턴스를 자동으로 시작하고 종료하도록 설정합니다.

# Start EC2 at 10:00 AM (UTC: 1:00 AM)
aws events put-rule \
    --name ec2-start-schedule \
    --schedule-expression "cron(0 1 ? * MON-FRI *)"
# Stop EC2 at 7:00 PM (UTC: 10:00 AM)
aws events put-rule \
    --name ec2-stop-schedule \
    --schedule-expression "cron(0 10 ? * MON-FRI *)"

이제 EC2가 업무 시간에 맞춰 자동으로 켜지고, 퇴근 후에는 자동으로 종료되어 불필요한 비용이 절감됩니다! 🚀

운영하면서 겪었던 문제와 해결 방법

자동화를 적용한 후 몇몇 문제를 마주하게 되었고, 해결 방법은 다음과 같습니다.

문제 해결 방법
공휴일에는 EC2를 켜지 않도록 설정하고 싶음DynamoDB에 공휴일 데이터를 저장하고 Lambda에서 체크
긴급하게 EC2를 켜야 할 때가 있음Override 태그를 추가하면 자동 종료 예외 처리 가능
시작 순서를 조정하고 싶음Step Functions을 활용해 인스턴스 의존성 관리

이렇게 운영 중에 발생하는 이슈도 문제없이 대응할 수 있었습니다.

자동화 후 효과

EC2 스케줄링 자동화를 적용한 결과, 다음과 같은 눈에 띄는 개선 효과를 얻을 수 있었습니다.

Cost Optimization through EC2 Automation

AWS 비용 45% 절감

  • 유휴 상태였던 EC2 인스턴스를 자동 종료함으로써 불필요한 비용을 절감할 수 있었습니다.

업무 시간 외 EC2 자동 종료

  • 야근이나 주말에도 불필요한 인스턴스가 켜져 있는 일이 사라졌습니다.
  • 필요할 때만 실행되도록 설정하여 효율적인 자원 활용이 가능해졌습니다.

운영 부담 감소

  • 개발자들이 더 이상 EC2를 수동으로 관리할 필요가 없어 번거로움이 줄어들었습니다.
  • IAM 정책과 태그 기반 관리 덕분에 보안성과 관리 효율성도 함께 향상되었습니다.

무엇보다, 자동화를 적용한 후에는 밤에도 걱정 없이 마음 편하게 퇴근할 수 있었습니다. 😊

추가로 고려할 확장 기능

현재 EC2 스케줄링 자동화 시스템을 더욱 발전시키기 위해, 다음과 같은 기능을 추가로 고민하고 있습니다.


Slack 알림 연동

  • EC2 인스턴스가 자동으로 시작되거나 종료될 때, 팀 채널에 알림을 전송
  • 개발자들이 현재 인스턴스 상태를 실시간으로 확인할 수 있어 운영 투명성 향상

CloudWatch와 연계한 자동 스케일링

  • EC2 인스턴스의 CPU 사용량, 네트워크 트래픽 등의 지표를 분석
  • 사용량이 적을 때는 자동 종료, 많을 때는 추가 인스턴스를 실행하는 자동 스케일링 적용

비용 리포트 자동화

  • 한 달에 한 번, EC2 비용 리포트를 자동으로 생성하여 이메일로 전송
  • 비용 절감 효과를 추적하고, 추가적인 최적화 기회를 식별

이러한 확장 기능을 도입하면 더욱 스마트한 인프라 운영이 가능해지고, 팀 전체의 운영 효율성과 비용 절감 효과를 극대화할 수 있을 것으로 기대됩니다. 🚀

마무리

AWS Lambda와 EventBridge를 활용한 EC2 자동화 방법을 소개드렸습니다. 우리 팀은 이를 통해 비용 절감운영 부담 감소라는 두 마리 토끼를 잡을 수 있었습니다. 만약 여러분도 비슷한 고민을 하고 계시다면, 지금 바로 이 자동화를 직접 적용해 보시길 추천드립니다. 효율적인 자원 관리와 비용 최적화를 통해, 더 나은 운영 환경을 만들어가실 수 있을 것입니다. 😊

  • Robb Lee
    Robb Lee

    Technical Project Manager

    롭은 데이터 보안, 거버넌스, 그리고 클라우드 기반 솔루션을 전문으로 하는 숙련된 TPM(Technical Project Manager)입니다. QueryPie에서 그는 솔루션 개발과 운영을 지원하며, 조직들이 확장 가능하고 안전하며 고성능의 기술로 데이터를 효율적으로 관리하고 보호할 수 있도록 돕고 있습니다. 롭은 또한 고객들이 QueryPie를 통해 데이터를 원활하고 안전하게 관리할 수 있도록 돕는 중요한 역할을 수행하며, 조직의 데이터 거버넌스와 보안 전략을 강화하는 데 크게 기여하고 있습니다.

3 Minutes to Wow !

3 QueryPie, !

Take a Virtual Tour