이 문서에서는 On-prem 배포 검증처럼 고객사·테넌트별로 격리된 스펙을 빠르게 띄웠다 내리는 EC2 환경 운영 패턴을 정리합니다. 매번 수동 SSH·VPC 셋업을 반복하면 비용과 휴먼 에러가 누적되므로, IaC와 스케줄러로 정형화합니다.

풀려는 문제

  • 테넌트마다 환경이 다릅니다 (CPU/메모리/디스크 스펙, OS, 사전 설치 SW).
  • 환경은 임시지만, 다시 띄울 수 있어야 합니다.
  • 사용자가 여럿입니다 (내부 엔지니어 + 외부 협력사) — SSH 키 관리에 일관성이 필요합니다.
  • 검증 시간 외에 켜두면 비용이 누수되므로 자동 시작/종료가 필요합니다.
  • VPN 안에서만 접근 가능해야 합니다 — 퍼블릭 노출 금지.

안티패턴 (개선 전)

Warning

아래는 실제로 운영해 본 결과 문제가 누적된 패턴입니다. 신규 환경에서는 피해 주세요.

  • 테스트 환경마다 VPC를 따로 생성 → peering이 폭발하고 관리 비용이 늘어납니다.
  • SSH 공개키를 Terraform 코드나 user_data에 하드코딩 → 키 로테이션이 어렵고, 깃 노출 위험이 있습니다.
  • 24/7 가동 → 야간/주말 비용이 그대로 새어 나갑니다.

핵심 패턴

모듈화 + 테넌트별 환경 분리

사용하는 리소스는 거의 같다는 가정 하에, 사용자 모듈을 정의하거나 커뮤니티 모듈을 사용하여 유지보수성을 늘리고 새로운 환경도 빠르게 추가합니다.

공유 VPC

테넌트별 VPC가 아니라 공통 VPC와 subnet을 공유합니다.

  • 새 환경 추가 시 네트워크 리소스를 만들지 않으므로 분 단위 프로비저닝이 가능합니다.
  • 과도기에 만든 환경은 예외로 두고, 신규는 모두 공유 VPC로 통일합니다.

SSH 키 자동 주입

하드코딩 대신 부팅 시 동적으로 주입합니다.

  1. EC2에 IAM role을 부착해 Secret Manager·S3 read 권한을 부여합니다.
  2. user_data 스크립트에서 다음을 수행합니다.
    • AWS CLI로 Secret Manager에서 자격증명·메타정보를 조회
    • S3에 보관된 공개키 묶음을 다운로드
    • ~/.ssh/authorized_keys에 등록
  3. 키 회전은 S3 객체 교체 + 인스턴스 재부팅으로 끝나며, 코드 변경이 필요 없습니다.

자동 시작/종료 스케줄러

EventBridge Schedule (cron) → Lambda → EC2 Start/Stop API

태그 기반으로 제어하면 인스턴스에 태그만 붙여서 적용할 수 있습니다. 예를 들어 다음과 같은 태그를 설정하면 됩니다.

  • AutoSchedule = "true" → 평일 working hours에 자동 시작 + 자동 종료
  • AutoShutdown = "true" → 자동 종료만 (시작은 수동)

Lambda는 EventBridge에서 action=start|stop 파라미터를 받아 태그 필터로 인스턴스를 일괄 처리합니다. 특정 환경을 끄면 안 되는 경우가 있다면 태그를 부착하지 않으면 자동 제외됩니다.
Payload에 태그를 넘기게 세팅해 두면 Lambda 코드를 여러 벌 만들지 않아도 됩니다.

Tip

Lambda IAM 정책에서 Condition.StringEqualsec2:ResourceTag/AutoSchedule = "true"인 리소스에만 Start/Stop을 허용하도록 제한하세요. Lambda 코드에 버그가 있어 엉뚱한 인스턴스 ID를 넘기더라도 IAM에서 차단되는 2중 안전장치가 됩니다. 자동화가 의도한 대상만 건드리도록 하는 데 효과적인 패턴입니다.

보안 기본값

  • SSH는 VPN CIDR만 허용합니다 (예: 사내 VPN 대역). 퍼블릭 SSH는 금지합니다.
  • HTTP/HTTPS는 필요할 때만 0.0.0.0/0으로 엽니다 (검증 대상 서비스 노출용).
  • IMDSv2를 강제합니다 — metadata_options.http_tokens = "required". v1은 SSRF로 credential 탈취 위험이 있습니다.

접속 방법

VPN을 켠 상태에서 Private IP로 접속합니다.

ssh <user>@<private-ip>

Bastion은 외부에서 직접 EC2 장비에 접근이 필요할 경우 고려합니다. 여기서는 설명하지 않습니다.

키워드 / 참고 리소스

확장 아이디어

  • 환경 수가 더 늘면 EC2에서 ECS/EKS 잡 형태로 전환을 검토할 수 있습니다.
  • SSH 대신 SSM Session Manager를 사용하면 인바운드 포트가 0개가 되고 IAM으로 인증할 수 있어, VPN 의존도를 낮추고 싶을 때 유용합니다.
  • 자동 만료(예: 생성 30일 후 자동 destroy)를 걸어 두면 잊혀진 환경이 누적되는 것을 막을 수 있습니다.