AWS EC2란? 프리 티어로 서버 무료 운영
Amazon EC2(Elastic Compute Cloud)는 AWS에서 제공하는 가상 서버 서비스다. 내 컴퓨터처럼 운영체제를 선택하고, CPU, 메모리, 스토리지를 자유롭게 구성하여 웹 서버, API 서버, 데이터베이스 서버 등을 운영할 수 있다. 프리 티어 t2.micro 인스턴스는 12개월간 매월 750시간 무료로 제공되어, 개인 프로젝트나 소규모 서비스를 비용 없이 시작할 수 있다.
EC2 인스턴스 타입 비교
| 인스턴스 | vCPU | 메모리 | 시간당 요금 | 적합 용도 |
|---|---|---|---|---|
| t2.micro | 1 | 1 GB | 무료 (12개월) | 개인 프로젝트, 테스트 |
| t3.small | 2 | 2 GB | 약 $0.023/hr | 소규모 웹 서비스 |
| t3.medium | 2 | 4 GB | 약 $0.046/hr | 중규모 앱, API 서버 |
| t3.large | 2 | 8 GB | 약 $0.083/hr | 트래픽 높은 서비스 |
t2.micro 750시간/월 = 1개 인스턴스를 한 달 내내 가동 가능. 2개 인스턴스를 동시에 켜면 375시간씩 나뉜다. 프리 티어 기간은 AWS 계정 생성일 기준 12개월이며, 이후부터는 요금이 청구된다.
EC2는 초기 설정이 복잡하지만, 운영 중인 서버에 직접 SSH 접속하여 모든 것을 제어할 수 있다는 점이 가장 큰 장점이다. Nginx, PM2, 데이터베이스, 방화벽 등 서버 스택을 마음대로 구성할 수 있어 실무 개발자에게 필수 경험이다.
EC2 인스턴스 생성 -- Ubuntu 24.04 LTS
AWS 콘솔 접속 후 EC2 인스턴스 시작
AWS 콘솔 로그인 후, 서비스 검색에서 "EC2"를 찾아 대시보드로 이동. 리전을 ap-northeast-2(서울)로 설정하면 한국 사용자에게 가장 빠르다.
AMI 선택 -- Ubuntu Server 24.04 LTS
"Ubuntu Server 24.04 LTS (HVM), SSD Volume Type"을 선택한다. 프리 티어 사용 가능 배지가 있는 이미지인지 확인하자.
인스턴스 타입 선택 -- t2.micro
1 vCPU, 1 GiB 메모리로 소규모 Node.js 앱 운영에 충분하다.
키 페어 생성 -- SSH 접속용 .pem 파일
키 페어 이름을 입력하고, RSA + .pem 형식을 선택한다. .pem 파일은 분실하면 재발급이 불가능하므로 안전한 곳에 저장해야 한다.
스토리지 설정
프리 티어 기준 gp2 SSD 30 GB까지 무료다. 기본값(8 GB)을 20~30 GB로 늘려도 프리 티어 범위 내에 있다.
인스턴스 시작 및 퍼블릭 IP 확인
"인스턴스 시작" 클릭 후 약 1~2분 기다리면 인스턴스 상태가 "실행 중"으로 바뀐다. 하단 패널에서 퍼블릭 IPv4 주소를 확인할 수 있다.
보안 그룹 설정 -- SSH, HTTP, HTTPS 포트
보안 그룹(Security Group)은 EC2 인스턴스의 방화벽 역할을 한다. 화이트리스트 방식으로 동작하며, 명시적으로 허용하지 않으면 모두 차단된다.
| 유형 | 포트 | 소스 | 설명 |
|---|---|---|---|
| SSH | 22 | 내 IP | 서버 SSH 접속 (내 IP만 허용 권장) |
| HTTP | 80 | 0.0.0.0/0 | 일반 웹 트래픽 |
| HTTPS | 443 | 0.0.0.0/0 | 보안 웹 트래픽 |
| 사용자 지정 | 3000 | 개발 시만 | Node.js 앱 직접 테스트 (운영 시 닫음) |
SSH 포트 22를 0.0.0.0/0(전체 허용)으로 설정하면 전 세계에서 무차별 대입 공격이 들어온다. 반드시 내 IP 주소만 허용하거나, 포트를 22에서 다른 번호(예: 2222)로 변경해야 한다.
서버 초기 설정 -- 패키지 업데이트, Node.js 설치
SSH로 서버에 접속한 후 가장 먼저 해야 할 작업이다. 패키지 업데이트로 최신 보안 패치를 적용하고, NodeSource 공식 저장소를 통해 Node.js LTS 버전을 설치한다.
t2.micro(1GB RAM)는 npm install 중 메모리 부족이 발생할 수 있다. sudo fallocate -l 2G /swapfile로 2GB 스왑 파일을 만들어 해결할 수 있다.
PM2로 Node.js 앱 프로세스 관리
Node.js 앱을 node src/index.js로 직접 실행하면 터미널을 닫는 순간 프로세스가 종료된다. PM2는 Node.js 프로세스를 백그라운드에서 관리하고, 크래시 시 자동 재시작, 서버 부팅 시 자동 시작, 클러스터 모드, 로그 관리 기능을 제공하는 프로덕션 필수 도구다.
Nginx 설치 및 리버스 프록시 설정
실무에서는 Nginx를 리버스 프록시로 앞에 두는 방식을 표준으로 사용한다. Nginx는 정적 파일 서빙, Gzip 압축, SSL 종료, 로드밸런싱, 보안 헤더 추가 등을 Node.js보다 훨씬 효율적으로 처리한다.
Let's Encrypt SSL 인증서 발급 (무료 HTTPS)
Let's Encrypt는 비영리 인증 기관에서 제공하는 무료 SSL/TLS 인증서다. Certbot 도구를 사용하면 인증서 발급부터 Nginx 설정 수정, 자동 갱신 크론잡 등록까지 한 번에 처리된다.
Let's Encrypt 인증서를 발급하려면 도메인이 EC2 서버의 퍼블릭 IP를 가리키고 있어야 한다. DNS가 전파되기 전에 Certbot을 실행하면 도메인 소유권 확인에 실패한다.
도메인 연결 -- Route 53 또는 외부 DNS
도메인을 EC2 서버에 연결하려면 DNS의 A 레코드가 EC2의 퍼블릭 IP를 가리키도록 설정해야 한다. EC2의 퍼블릭 IP는 인스턴스를 재시작하면 변경되므로, Elastic IP(고정 IP)를 할당하는 것이 표준이다.
자동 배포 스크립트 -- Git pull + PM2 reload
코드를 수정할 때마다 서버에 SSH로 접속해서 git pull하고 pm2 reload하는 과정을 자동화할 수 있다.
운영 체크리스트 -- 모니터링, 로그, 백업
서버를 구축했다고 끝이 아니다. 안정적인 운영을 위한 모니터링과 관리 체계를 갖추는 것이 더 중요하다.
CloudWatch 기본 모니터링 활성화
CPU 80% 이상 지속 시 CloudWatch 알람을 설정하여 이메일/SMS 알림을 받자.
PM2 로그 로테이션 설정
pm2-logrotate 모듈을 설치하면 로그 파일이 무제한으로 커지는 것을 방지한다.
UFW 방화벽 설정
AWS 보안 그룹과 별개로 OS 수준의 방화벽을 추가로 설정한다.
정기 패키지 업데이트 자동화
unattended-upgrades를 설정하면 보안 패치가 자동으로 적용된다.
외부 모니터링 도구 연동
UptimeRobot, Better Uptime 같은 무료 서비스로 서버 다운 알림을 받자.