Amazon EC2란
EC2(Elastic Compute Cloud)는 AWS에서 가상 서버를 빌려주는 서비스입니다. 클릭 몇 번이면 수십 초 안에 리눅스나 윈도우 서버가 생기고, 필요 없으면 즉시 삭제할 수 있습니다.
Elastic이 이름에 붙은 이유는 필요에 따라 크기를 늘리고 줄일 수 있어서입니다. 트래픽이 몰리면 사양을 올리고, 새벽에 한산하면 다시 낮춥니다.
Parnas Rewards, TMS API처럼 Spring Boot 기반 백엔드 서비스를 올리는 가장 기본적인 방법이 EC2입니다. OS 위에 JDK를 설치하고, jar 파일을 올리고, 서비스로 등록합니다. VMC(VMware Cloud)에서 EC2로 마이그레이션하는 것도 결국 가상 서버를 다른 플랫폼으로 옮기는 작업입니다.
EC2 인스턴스 유형 읽는 법
인스턴스 유형은 t3.micro 같은 형식입니다. 각 부분의 의미는 다음과 같습니다.
t=범용 버스트
m=범용 균형
c=컴퓨팅 최적화
r=메모리 최적화
최신 세대
같은 가격이면
세대 높은 게 좋음
/medium/large
/xlarge/2xlarge...
클수록 vCPU·메모리↑
| 유형 | vCPU | 메모리 | 시간당 요금(서울) | 용도 |
|---|---|---|---|---|
t3.nano | 2 | 0.5 GB | 약 $0.006 | 초경량 테스트 |
t3.micro | 2 | 1 GB | 약 $0.013 | 학습용 · 프리 티어 |
t3.small | 2 | 2 GB | 약 $0.026 | 소규모 웹서버 |
t3.medium | 2 | 4 GB | 약 $0.052 | Spring Boot 권장 |
m6i.large | 2 | 8 GB | 약 $0.112 | 프로덕션 균형 |
메모리 1GB는 Spring Boot 기본 실행에도 빡빡합니다. 학습용으로는 괜찮지만, 실제 서비스에는 최소 t3.medium(4GB)을 권장합니다. HikariCP 커넥션 풀 exhaustion 문제도 메모리 부족과 연관될 수 있습니다.
T타입 버스트 — 크레딧 기반 CPU
t3.micro 같은 T타입 인스턴스는 일반 인스턴스와 다릅니다. 평소에는 낮은 CPU 성능으로 동작하다가, 순간적으로 높은 성능이 필요할 때 CPU 크레딧을 소모해서 버스트합니다.
CPU 사용률이 기준(t3.micro는 10%)보다 낮을 때 시간당 크레딧이 쌓입니다. 인스턴스가 켜져 있는 동안 계속 적립.
CPU 사용률이 기준을 초과할 때 크레딧을 소모해서 최대 100%까지 성능을 높입니다.
기준 성능(10%)으로 제한됩니다. 갑자기 서버가 느려지면 CPU 크레딧을 의심하세요. CloudWatch에서 CPUCreditBalance 지표로 확인 가능합니다.
학습 목적으로는 t3.micro면 충분합니다. 크레딧이 고갈되기 전에 실습을 마치고 인스턴스를 종료하면 되니까요.
EBS와 AMI
EBS — EC2의 하드 드라이브
EBS(Elastic Block Store)는 EC2에 붙이는 가상 디스크입니다. EC2를 중지하거나 종료해도 EBS 볼륨의 데이터는 유지됩니다(설정에 따라 다름).
| 볼륨 유형 | 특징 | 용도 | 서울 요금 |
|---|---|---|---|
| gp3 | 범용 SSD · 기본 제공 3000 IOPS | 대부분의 상황 | $0.08/GB·월 |
| gp2 | 범용 SSD · IOPS가 크기에 비례 | 레거시 (gp3 권장) | $0.10/GB·월 |
| io2 | 고성능 SSD · IOPS 직접 지정 | 고성능 DB | $0.138/GB·월 |
| st1 | 처리량 최적화 HDD | 로그·빅데이터 | $0.051/GB·월 |
인스턴스 생성 시 "종료 시 삭제" 옵션이 기본으로 켜져 있지만, 루트 볼륨이 아닌 추가 볼륨은 남습니다. EC2 → 볼륨 메뉴에서
available 상태로 남은 볼륨을 꼭 확인하세요. GB당 월 $0.08로 조용히 과금됩니다.
AMI — 서버의 스냅샷
AMI(Amazon Machine Image)는 인스턴스를 만들기 위한 운영체제 + 설정의 템플릿입니다. AWS가 제공하는 공식 AMI도 있고, 내 인스턴스를 AMI로 만들어서 같은 설정의 서버를 여러 개 찍어낼 수도 있습니다.
| AMI | 특징 | 권장 상황 |
|---|---|---|
| Amazon Linux 2023 | AWS 최적화 · dnf 패키지 매니저 | 대부분의 경우 |
| Ubuntu 22.04 LTS | 익숙한 환경 · apt 패키지 매니저 | Ubuntu 경험자 |
| Amazon Linux 2 | 구 버전 · 2025년 지원 종료 | 레거시 호환 필요 시 |
| 커스텀 AMI | 직접 만든 이미지 | Auto Scaling, 빠른 배포 |
보안 그룹 — 인스턴스 방화벽
보안 그룹은 EC2 인스턴스 앞에 붙는 가상 방화벽입니다. 어떤 IP에서 어떤 포트로 들어오는 트래픽을 허용할지 규칙을 정합니다.
← 내 IP만
✅ TCP 80 (HTTP)
← 0.0.0.0/0
✅ TCP 443 (HTTPS)
← 0.0.0.0/0
✅ TCP 8080
← ALB 보안 그룹
❌ 나머지 전부 차단
보안 그룹 핵심 특성
| 특성 | 내용 |
|---|---|
| Stateful | 인바운드를 허용하면 응답(아웃바운드)은 자동 허용. 명시적으로 아웃바운드 규칙을 따로 안 써도 됨 |
| 허용 기반 | 명시적으로 허용한 것만 통과. 나머지는 자동 거부 (Deny 규칙 없음) |
| 소스로 보안 그룹 지정 | IP 대신 다른 보안 그룹을 소스로 지정 가능. ALB → EC2 처럼 서비스 간 연결에 사용 |
| 여러 인스턴스에 적용 | 하나의 보안 그룹을 여러 인스턴스에 붙일 수 있음 |
전체 IP에 SSH를 열면 인터넷 스캐너가 수분 안에 찾아내 무차별 로그인을 시도합니다. 반드시 내 IP만 허용하세요. 애플리케이션 포트(8080 등)는 ALB 보안 그룹에서만 허용하고, 외부 직접 접근을 막는 것이 실무 원칙입니다.
키 페어 · IP · ENI
키 페어 — SSH 접속 열쇠
EC2에 SSH로 접속하려면 비밀번호 대신 키 페어(공개키/개인키 쌍)를 씁니다. AWS가 공개키를 인스턴스에 넣어두고, 내가 개인키(.pem 파일)로 접속합니다.
생성 시 딱 한 번만 다운로드할 수 있습니다. 잃어버리면 해당 인스턴스에 SSH로 다시 접속할 방법이 없습니다. 잃어버리면 인스턴스를 새로 만들어야 합니다. 안전한 곳에 보관하세요.
IP 주소 세 종류
| 종류 | 특징 | 재시작 시 | 요금 |
|---|---|---|---|
| 퍼블릭 IP | 인터넷에서 접근 가능한 IP. 자동 할당 | 변경됨 | 인스턴스 실행 중 무료 |
| 프라이빗 IP | VPC 내부에서만 사용. 항상 고정 | 유지 | 무료 |
| 탄력적 IP | 고정 퍼블릭 IP. 내가 직접 할당 | 유지 | 미연결 시 과금 ⚠️ |
탄력적 IP는 인스턴스에 연결돼 있을 때는 무료입니다. 하지만 인스턴스 없이 방치하면 시간당 과금됩니다. 인스턴스를 종료할 때 탄력적 IP를 릴리스하는 걸 잊지 마세요.
ENI — 네트워크 카드
ENI(Elastic Network Interface)는 EC2의 가상 네트워크 카드입니다. 하나의 인스턴스에 여러 ENI를 붙일 수 있어서, 여러 IP나 여러 서브넷에 동시에 연결할 수 있습니다. 고급 네트워크 구성에서 나오는 개념으로, 지금은 "EC2의 네트워크 인터페이스"라는 정도만 알면 됩니다.
EC2 인스턴스 생성하기
인스턴스를 생성하는 순간부터 시간당 요금이 부과됩니다. t3.micro 기준 시간당 약 $0.013. 실습이 끝나면 반드시 종료(Terminate)하세요.
- AWS 콘솔 → 검색창에
EC2입력 → EC2 콘솔 진입 - 좌측 메뉴 인스턴스 → 우측 상단 인스턴스 시작
- 이름:
my-spring-server - AMI: Amazon Linux 2023 AMI 선택 (Quick Start 첫 번째 항목)
- 인스턴스 유형:
t3.micro(학습용) 또는t3.medium(Spring Boot 권장) - 키 페어: 새 키 페어 생성 → 이름
my-key→ .pem 다운로드 → 안전한 곳 보관 - 네트워크 설정:
- 보안 그룹 새로 생성
- SSH(22): 내 IP 선택 — 0.0.0.0/0 절대 금지
- HTTP(80): 위치 무관(0.0.0.0/0)
- 스토리지: 8 GiB gp3 그대로 (절대 키우지 마세요)
- 인스턴스 시작 클릭
인스턴스 생성 전, 콘솔 우측 상단이 아시아 태평양(서울)인지 확인하세요. 다른 리전에 만들면 나중에 못 찾습니다.
SSH로 EC2 접속하기
인스턴스 상태가 실행 중(running)이 되면 접속할 수 있습니다. 보통 1~2분 걸립니다.
macOS / Linux
# 1. 키 파일 권한 설정 (처음 한 번만)
chmod 400 ~/Downloads/my-key.pem
# 2. SSH 접속 (퍼블릭 IP는 EC2 콘솔에서 확인)
ssh -i ~/Downloads/my-key.pem ec2-user@퍼블릭IP
# Amazon Linux 2023 기본 사용자: ec2-user
# Ubuntu: ubuntu / Debian: admin
Windows (PowerShell)
ssh -i C:\Users\사용자명\Downloads\my-key.pem ec2-user@퍼블릭IP
1. 인스턴스 상태가 실행 중인가
2. 보안 그룹 인바운드에 SSH(22)가 내 현재 IP로 열려 있는가 (IP가 바뀌었을 수 있음)
3. 키 파일 경로가 정확한가
4. chmod 400을 했는가 (macOS/Linux)
Spring Boot 배포하기
1단계 — Java 설치
# 패키지 업데이트
sudo dnf update -y
# Java 17 설치 (Amazon Corretto)
sudo dnf install java-17-amazon-corretto -y
# 설치 확인
java -version
2단계 — jar 파일 업로드
# 로컬 터미널에서 실행 (EC2가 아님)
scp -i ~/Downloads/my-key.pem \
./build/libs/myapp-0.0.1-SNAPSHOT.jar \
ec2-user@퍼블릭IP:/home/ec2-user/app.jar
3단계 — 실행 및 서비스 등록
# 서비스 파일 생성
sudo tee /etc/systemd/system/myapp.service <<EOF
[Unit]
Description=My Spring Boot App
After=network.target
[Service]
User=ec2-user
WorkingDirectory=/home/ec2-user
ExecStart=/usr/bin/java -Xmx512m -jar /home/ec2-user/app.jar
Restart=always
RestartSec=10
Environment="SPRING_PROFILES_ACTIVE=prod"
[Install]
WantedBy=multi-user.target
EOF
# 서비스 등록 및 시작
sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp
# 상태 확인
sudo systemctl status myapp
# 실시간 로그 확인
sudo journalctl -u myapp -f
DB 비밀번호 같은 민감한 설정은 서비스 파일의
Environment에 넣거나, AWS Systems Manager Parameter Store에서 가져오는 방식을 씁니다. application.yml에 하드코딩하지 마세요.
4단계 — 보안 그룹에 포트 추가
Spring Boot가 8080 포트로 뜬다면, 보안 그룹 인바운드에 TCP 8080을 추가해야 합니다.
- EC2 콘솔 → 해당 인스턴스 클릭 → 보안 탭
- 보안 그룹 이름 클릭 → 인바운드 규칙 편집
- 규칙 추가: 유형=사용자 지정 TCP, 포트=8080, 소스=내 IP (테스트용)
- 저장 후 브라우저에서
http://퍼블릭IP:8080접속 확인
유저 데이터와 메타데이터
유저 데이터 — 인스턴스 시작 시 자동 실행
인스턴스 생성 시 유저 데이터(User Data)에 스크립트를 넣으면, 처음 부팅할 때 자동으로 실행됩니다. Java 설치, 애플리케이션 다운로드, 서비스 등록을 자동화하는 데 씁니다.
#!/bin/bash
# 인스턴스 최초 부팅 시 자동 실행됨
dnf update -y
dnf install java-17-amazon-corretto -y
# S3에서 jar 파일 다운로드
aws s3 cp s3://my-bucket/app.jar /home/ec2-user/app.jar
# 서비스 등록 및 시작
systemctl enable myapp
systemctl start myapp
EC2 생성 화면 → 고급 세부 정보 → 맨 아래 사용자 데이터 칸에 입력하면 됩니다.
메타데이터 — 인스턴스 자기 자신에 대한 정보
EC2 인스턴스 안에서 자기 자신의 IP, 인스턴스 ID, 리전 등을 조회하려면 메타데이터 서버를 씁니다.
# IMDSv2 방식 (보안 강화 버전)
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" \
-H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
# 인스턴스 ID 조회
curl -H "X-aws-ec2-metadata-token: $TOKEN" \
http://169.254.169.254/latest/meta-data/instance-id
# 퍼블릭 IP 조회
curl -H "X-aws-ec2-metadata-token: $TOKEN" \
http://169.254.169.254/latest/meta-data/public-ipv4
탄력적 IP 할당하기
인스턴스를 재시작할 때마다 퍼블릭 IP가 바뀝니다. DNS에 고정 IP를 등록하거나, 팀원들에게 접속 주소를 공유할 때 문제가 됩니다. 탄력적 IP로 고정합니다.
- EC2 콘솔 좌측 메뉴 → 탄력적 IP
- 탄력적 IP 주소 할당 → 기본값 그대로 → 할당
- 할당된 IP 선택 → 작업 → 탄력적 IP 주소 연결
- 인스턴스 선택 → 연결
인스턴스를 종료하면 탄력적 IP 연결이 끊어지고, 연결되지 않은 IP는 시간당 과금됩니다. 실습 후 작업 → 탄력적 IP 주소 릴리스를 반드시 하세요.
EC2 사이즈 변경하기
인스턴스 유형은 나중에 바꿀 수 있습니다. t3.micro → t3.medium 처럼 업그레이드하거나, 반대로 다운그레이드도 됩니다.
실행 중인 인스턴스는 유형을 바꿀 수 없습니다. 먼저 중지하고, 유형 변경 후 다시 시작합니다. 이 과정에서 퍼블릭 IP가 바뀝니다(탄력적 IP 없는 경우).
- 인스턴스 선택 → 인스턴스 상태 → 중지(Stop)
- 중지 완료 대기
- 인스턴스 선택 → 작업 → 인스턴스 설정 → 인스턴스 유형 변경
- 원하는 유형 선택 → 적용
- 인스턴스 상태 → 시작(Start)
EC2 접속 방법 3가지
| 방법 | 특징 | 키 페어 필요 | 권장 상황 |
|---|---|---|---|
| SSH | 전통적인 방법. 키 파일 사용 | ✅ 필요 | 일반적인 경우 |
| EC2 Instance Connect | 콘솔에서 바로 접속. 브라우저 터미널 | ❌ 불필요 | 키 파일 없을 때 빠른 접속 |
| Session Manager | IAM 권한으로 접속. 포트 22 불필요 | ❌ 불필요 | 보안 강화 환경 · SSH 포트 닫아도 됨 |
Session Manager 설정 (권장)
Session Manager를 쓰면 보안 그룹에서 SSH(22) 포트를 열지 않아도 EC2에 접속할 수 있습니다. IAM 역할로 권한을 제어하고, 모든 세션이 CloudTrail에 기록됩니다. ISMS-P 감사에서 SSH 포트 노출 여부를 체크하는데, Session Manager를 쓰면 이 항목을 통과합니다.
- EC2에 붙은 IAM 역할에
AmazonSSMManagedInstanceCore정책 추가 - EC2 콘솔 → 인스턴스 선택 → 연결 → Session Manager → 연결
- 브라우저에서 터미널이 열림
EC2 요금 모델
| 모델 | 계약 | 할인율 | 권장 상황 |
|---|---|---|---|
| 온디맨드 | 없음 · 초 단위 과금 | 기준 | 학습 · 단기 프로젝트 |
| 예약 인스턴스 | 1년 또는 3년 약정 | 최대 72% 할인 | 24시간 돌아가는 프로덕션 |
| 스팟 인스턴스 | 없음 · AWS가 필요하면 뺏어감 | 최대 90% 할인 | 배치 처리 · 중단 허용 작업 |
| Savings Plans | 1년 또는 3년 · 사용량 약정 | 최대 66% 할인 | 인스턴스 유형이 바뀔 수 있는 경우 |
예약 인스턴스는 약정이라 실수로 계속 켜놓아도 요금이 나갑니다. 학습 중에는 온디맨드로 만들고, 쓰고 나서 바로 종료하는 습관을 들이세요.
트러블슈팅 & 정리
흔한 문제들
| 증상 | 원인 | 해결 |
|---|---|---|
| SSH Connection refused | 보안 그룹 22포트 미개방 또는 내 IP 변경 | 보안 그룹 인바운드 규칙 확인 및 내 IP 업데이트 |
| Permission denied (publickey) | 잘못된 키 파일 또는 chmod 미설정 | chmod 400 키.pem 확인, 키 파일 경로 확인 |
| 서버가 갑자기 느려짐 | T타입 CPU 크레딧 고갈 | CloudWatch → CPUCreditBalance 확인. 인스턴스 유형 업그레이드 고려 |
| Spring Boot 접속 안 됨 | 보안 그룹에 8080 미개방 또는 앱 실행 실패 | 보안 그룹 확인, journalctl -u myapp로 로그 확인 |
| 인스턴스 목록에 내 서버가 없음 | 리전이 다름 | 콘솔 우측 상단 리전을 서울로 변경 |
⚠️ 실습 후 정리 체크리스트
- 인스턴스 선택 → 인스턴스 상태 → 종료(Terminate) — 중지(Stop)가 아님!
- EC2 → 볼륨 →
available상태 볼륨 있으면 삭제 - EC2 → 탄력적 IP → 연결되지 않은 IP 릴리스
- EC2 → 스냅샷 → 테스트로 만든 스냅샷 삭제
- EC2 → AMI → 테스트로 만든 AMI 등록 취소