Amazon EC2란
EC2(Elastic Compute Cloud)는 AWS에서 가상 서버를 빌려주는 서비스입니다. 콘솔 클릭 몇 번이면 수십 초 안에 서버가 생기고, 필요 없으면 즉시 삭제해서 사용한 시간만큼만 냅니다.
이름의 Elastic은 탄력적이라는 뜻입니다. 트래픽이 몰리면 사양을 올리고, 새벽처럼 한산할 때는 낮춥니다. 온프레미스 서버는 최대 트래픽 기준으로 사야 했지만, EC2는 지금 필요한 만큼만 씁니다.
지금 꼭 이해할 것: EC2가 가상 서버라는 점, 인스턴스 유형, 보안 그룹, EBS, 키 페어, Stop과 Terminate 차이, 실습 후 비용 정리.
첫 실습 후 다시 볼 심화: CPU Credit, ENI, User Data, Instance Metadata, Session Manager, 세부 요금 모델. 먼저 서버를 한 번 만들어 본 뒤 돌아오면 훨씬 쉽게 이해됩니다.
EC2가 만들어지는 원리
많은 현대 EC2 인스턴스는 AWS Nitro System의 전용 하드웨어와 경량 Nitro Hypervisor를 기반으로 가상화됩니다. 같은 물리 호스트를 공유할 수 있어도 AWS의 가상화·보안 경계로 고객 인스턴스는 서로 격리됩니다.
Parnas Rewards, TMS API 같은 Spring Boot 백엔드를 올리는 가장 기본적인 방법이 EC2입니다. VMC에서 EC2로 마이그레이션하는 것도 결국 가상 서버를 다른 플랫폼으로 옮기는 작업입니다.
현업에서 EC2를 쓰는 패턴
| 용도 | 설명 | 인스턴스 예시 |
|---|---|---|
| 웹·API 서버 | Spring Boot, Node.js 등 백엔드 애플리케이션 | t3.medium ~ m6i.large |
| 배치 처리 | 대용량 데이터 처리, 크론 작업 | c6i.xlarge (컴퓨팅 최적화) |
| Bastion Host | 프라이빗 서브넷 서버 접속용 점프 서버 | t3.nano (최소 사양으로 충분) |
| CI/CD 빌드 서버 | Jenkins, GitLab Runner 등 | c6i.2xlarge |
인스턴스 유형 읽는 법
t3.medium, m6i.xlarge 같은 유형 이름은 3부분으로 구성됩니다. 이걸 읽을 줄 알면 어떤 유형을 골라야 할지 바로 판단됩니다.
m = 범용 균형
c = 컴퓨팅 최적화
r = 메모리 최적화
g = GPU
같은 가격이면 세대 높은 게 성능 좋음
뒤 알파벳:
a = AMD CPU
g = Graviton(ARM)
i = Intel
→ medium → large
→ xlarge → 2xlarge
→ 4xlarge...
클수록 vCPU·메모리 증가
자주 쓰는 인스턴스 비교
| 유형 | vCPU | 메모리 | 가격 | 용도 |
|---|---|---|---|---|
t3.micro | 2 | 1 GB | 현재 AWS 가격표 확인 | 학습용, 계정 혜택 확인 |
t3.small | 2 | 2 GB | 현재 AWS 가격표 확인 | 소규모 서비스 |
t3.medium | 2 | 4 GB | 현재 AWS 가격표 확인 | 예시 사양 — 부하 테스트로 결정 |
t3.large | 2 | 8 GB | 현재 AWS 가격표 확인 | 중규모 서비스 |
m6i.large | 2 | 8 GB | 현재 AWS 가격표 확인 | 프로덕션 균형형 |
m6i.xlarge | 4 | 16 GB | 현재 AWS 가격표 확인 | 중대규모 프로덕션 |
1GB 메모리의 t3.micro는 JVM·OS·에이전트 구성을 함께 올리면 여유가 작을 수 있습니다. 하지만 “운영은 최소 t3.medium”처럼 고정하기보다 JVM 힙, 동시 요청, 커넥션 풀, 모니터링 지표와 부하 테스트를 기준으로 크기를 결정하고 필요하면 Auto Scaling과 함께 조정합니다.
T타입 버스트 — CPU 크레딧 이해하기
t3, t4g 같은 T타입 인스턴스는 평소엔 낮은 기준 성능으로 동작하다가, 순간 부하 시 크레딧을 소모해서 100%까지 버스트합니다. CPU 사용률이 기준보다 낮을 때 크레딧이 쌓이고, 높을 때 소모됩니다.
| 인스턴스 | 기준 CPU | 시간당 크레딧 적립 | 최대 크레딧 |
|---|---|---|---|
t3.micro | 10% | 12 | 288 |
t3.small | 20% | 24 | 576 |
t3.medium | 20% | 24 | 576 |
t3.large | 30% | 36 | 864 |
크레딧이 고갈돼도 Unlimited 모드에서는 추가 CPU를 사용할 수 있지만 잉여 CPU Credit에 추가 요금이 발생할 수 있습니다. 정확한 금액은 현재 EC2 On-Demand의 T2/T3/T4g Unlimited Mode 가격을 확인하세요. CloudWatch의
CPUCreditBalance와 CPUSurplusCreditsCharged를 함께 모니터링하면 좋습니다. t2는 설정 방식이 다를 수 있으므로 생성·운영 시 Credit specification을 확인합니다.
T타입 vs M타입 — 언제 뭘 쓰나
| 상황 | 권장 | 이유 |
|---|---|---|
| 개발·스테이징 서버 | T타입 | 평소 CPU 낮고 가끔만 튀어오름 |
| 학습용 서버 | T타입 | 비용 절감 중요 |
| 프로덕션 API 서버 | M타입 | 꾸준한 트래픽이면 크레딧 부족 위험 |
| CI/CD 빌드 서버 | C타입 | 빌드 시 CPU 100% 지속 사용 |
EBS — EC2의 하드 드라이브
EBS(Elastic Block Store)는 EC2에 붙이는 가상 SSD/HDD입니다. EC2와 별도로 존재해서 인스턴스를 삭제해도 볼륨은 남을 수 있고, 다른 인스턴스에 붙일 수도 있습니다. 단, 같은 가용 영역 안에서만 연결 가능합니다.
EBS 볼륨 유형
| 유형 | 종류 | IOPS | 가격 | 권장 용도 |
|---|---|---|---|---|
| gp3 | 범용 SSD | 기본 3,000 / 최대 16,000 | 현재 AWS 가격표 확인 | 대부분의 경우 (권장) |
| gp2 | 범용 SSD | 크기에 비례 | 현재 AWS 가격표 확인 | 레거시 → gp3 전환 권장 |
| io2 | 프로비저닝 SSD | 최대 256,000 | 현재 AWS 가격표 확인 | 고성능 DB |
| st1 | 처리량 최적화 HDD | 최대 500 | 현재 AWS 가격표 확인 | 로그, 빅데이터 |
루트 볼륨은 일반적으로 “종료 시 삭제”가 기본이지만 추가 EBS 볼륨은 설정에 따라 남을 수 있습니다. EC2 → 볼륨에서
available 상태와 스냅샷을 확인하고, 비용은 현재 EBS 가격표를 기준으로 확인하세요.
AMI — 서버의 전체 이미지
AMI(Amazon Machine Image)는 OS + 설치된 소프트웨어 + 설정의 전체 스냅샷입니다. 인스턴스를 만들 때 쓰는 템플릿이며, 잘 설정된 서버를 AMI로 만들어서 동일한 서버를 여러 개 찍어낼 수도 있습니다.
| AMI | 특징 | 권장 상황 |
|---|---|---|
| Amazon Linux 2023 | AWS 최적화 · dnf 패키지 · 최신 보안 | 신규 프로젝트 기본 선택 |
| Amazon Linux 2 | 2026년 6월 30일 지원 종료(EOL) | 신규 구축에는 사용하지 말고 AL2023으로 마이그레이션 |
| Ubuntu 22.04 LTS | apt 패키지 · 2027년까지 지원 | Ubuntu 경험자 |
| 커스텀 AMI | 직접 만든 이미지 | Auto Scaling, 빠른 반복 배포 |
보안 그룹 — 인스턴스 방화벽
보안 그룹은 EC2 인스턴스 앞에 붙는 가상 방화벽입니다. 인바운드(들어오는)와 아웃바운드(나가는) 트래픽 규칙을 각각 설정합니다.
핵심 특성 4가지
| 특성 | 내용 | 실무 의미 |
|---|---|---|
| Stateful | 인바운드 허용 시 해당 연결의 응답(아웃바운드)은 자동 허용 | HTTP 80을 열면 응답도 자동으로 나감. 아웃바운드 별도 설정 불필요 |
| 허용만 가능 | Allow 규칙만 있음. 명시적으로 허용 안 한 것은 자동 차단 | NACL과 달리 Deny 규칙이 없어서 관리가 단순함 |
| 보안 그룹을 소스로 | IP 대신 다른 보안 그룹을 소스로 지정 가능 | ALB 보안 그룹을 소스로 지정하면 ALB에서 오는 트래픽만 허용. IP 변경에도 자동 추적 |
| 다중 적용 | 기본 quota는 네트워크 인터페이스당 5개이며, Service Quotas에서 조정 시 최대 16개까지 요청 가능 | 공통 규칙은 공유 보안 그룹으로, 서비스별 규칙은 별도로 관리 |
3티어 보안 그룹 구성 패턴
인바운드: TCP 80 ← 0.0.0.0/0
인바운드: TCP 443 ← 0.0.0.0/0
인바운드: TCP 8080 ← SG-ALB (ALB에서만)
인바운드: TCP 22 ← 내 IP (SSH, 필요 시만)
인바운드: TCP 3306 ← SG-EC2 (EC2에서만)
인터넷에는 24시간 포트 스캐너가 돌아다닙니다. 22번이 열리는 순간 수분 안에 발견되고 무차별 대입 공격이 시작됩니다. 반드시 내 IP만 허용하거나, SSH를 닫고 Session Manager를 쓰세요.
자주 쓰는 포트
| 포트 | 용도 | 소스 설정 |
|---|---|---|
22 | SSH | 내 IP만 (절대 0.0.0.0/0 금지) |
80 | HTTP | 0.0.0.0/0 (ALB에 붙이면 ALB SG만) |
443 | HTTPS | 0.0.0.0/0 (ALB에 붙이면 ALB SG만) |
8080 | Spring Boot 기본 | ALB 보안 그룹만 |
3306 | MySQL | EC2 보안 그룹만 |
6379 | Redis | EC2 보안 그룹만 |
키 페어 · IP 주소 · ENI
키 페어 — SSH 접속의 열쇠
EC2 SSH 접속은 비밀번호 대신 공개키/개인키 쌍을 씁니다. AWS가 공개키를 인스턴스에 넣어두고, 나는 개인키(.pem 파일)를 가집니다.
AWS는 생성한 프라이빗 키 사본을 보관하지 않습니다. 다만 키를 잃었다고 항상 인스턴스를 새로 만들어야 하는 것은 아닙니다. Session Manager, EC2 Instance Connect, 새 공개키 추가 등 사전에 구성된 접속 경로가 있으면 복구할 수 있습니다. 키는 안전한 개인 보관소에 저장하고 공유 드라이브·소스 저장소에는 올리지 마세요.
IP 주소 세 종류
| 종류 | 특징 | 재시작 시 | 과금 |
|---|---|---|---|
| 퍼블릭 IP | 인터넷 접근 가능. 자동 할당 | 변경됨 | Public IPv4 시간당 과금 |
| 프라이빗 IP | VPC 내부 통신용. 항상 고정 | 유지 | 무료 |
| 탄력적 IP | 고정 퍼블릭 IP. 직접 할당·관리 | 유지 | Public IPv4 시간당 과금 |
AWS는 퍼블릭 IPv4 주소에 시간당 요금을 부과합니다. 자동 할당 Public IPv4와 Elastic IP 모두 현재 VPC 가격 정책을 확인하고, 필요 없는 주소는 해제·릴리스하세요.
EC2 생명 주기 — 상태별 과금 차이
| 상태 | 의미 | 과금 |
|---|---|---|
pending | 시작 중 (부팅) | 인스턴스 과금 정책은 현재 EC2 요금 기준 확인 |
running | 정상 실행 중 | ✅ 시간당 과금 |
stopped | 중지됨 | EBS 요금만 (인스턴스 요금 없음) |
terminated | 종료됨 (재시작 불가) | 인스턴스 컴퓨팅은 종료되지만 남은 EBS·스냅샷·Public IPv4 등 별도 리소스 확인 |
중지(Stop): 껐지만 삭제 안 됨. 재시작 가능. EBS 데이터 유지. EBS 요금 계속 발생.
종료(Terminate): 완전 삭제. 재시작 불가. 루트 볼륨도 기본 삭제.
학습용 인스턴스는 종료(Terminate)하세요. 중지하면 EBS 요금이 계속 나옵니다.
EC2 요금 모델
| 모델 | 약정 | 할인 | 권장 상황 |
|---|---|---|---|
| 온디맨드 | 없음 | 기준 | 학습, 단기 프로젝트 |
| 예약 인스턴스 | 1년 또는 3년 | 조건별 할인 — 현재 가격 확인 | 24시간 돌아가는 프로덕션 |
| Savings Plans | 1년 또는 3년 | 조건별 할인 — 현재 가격 확인 | RI보다 유연하게 약정 |
| 스팟 인스턴스 | 없음 | 변동 할인 — 현재 가격 확인 | 배치 처리, 중단 허용 작업 |
예약 인스턴스는 약정이라 실수로 만들면 취소가 어렵습니다. 온디맨드로 만들고, 쓰고 나서 바로 종료하는 습관을 들이세요.
EC2 인스턴스 생성하기
인스턴스·EBS·Public IPv4 등 선택한 리소스의 현재 가격과 계정 혜택을 확인하세요. 실습 후 종료(Terminate)와 잔존 리소스 정리를 하고, 시작 전 콘솔 우측 상단 리전이 아시아 태평양(서울)인지 확인하세요.
생성 단계
→ 인스턴스 시작
AMI 선택
키 페어
보안 그룹
→ 시작
각 단계 상세
-
이름 및 AMI
이름:
my-spring-server
AMI: Quick Start → Amazon Linux → Amazon Linux 2023 AMI
아키텍처: 64비트(x86) -
인스턴스 유형 및 키 페어
유형:
t3.micro등 학습 목적에 맞는 유형 선택 — Spring Boot는 메모리·부하를 보고 결정
키 페어: 새 키 페어 생성 → 이름my-aws-key→ RSA → .pem
⚠️ .pem 파일 다운로드 →~/.ssh/로 이동해서 보관 -
네트워크 설정
보안 그룹 새로 생성 → 이름:
sg-my-spring-server
인바운드 규칙:
• SSH(22) — 소스: 내 IP (My IP 선택 시 현재 IP 자동 입력)
• HTTP(80) — 소스: 위치 무관(0.0.0.0/0)
퍼블릭 IP 자동 할당: 활성화 -
스토리지
기본값: 8 GiB gp3 그대로 사용
함부로 크기 늘리지 마세요 — 줄이는 건 안 됩니다
"종료 시 삭제" 옵션이 켜져 있는지 확인
인스턴스 선택 → 하단 세부 정보 탭:
• 퍼블릭 IPv4 주소 → SSH 접속에 사용
• 인스턴스 상태 → running이어야 접속 가능
• 가용 영역 → 어느 AZ에 생성됐는지
SSH로 EC2 접속하기
상태가 running이 된 후 1~2분 더 기다려야 SSH 서버가 완전히 올라옵니다. 너무 빨리 접속하면 Connection refused가 납니다.
# 키 파일 권한 설정 (최초 1회)
chmod 400 ~/.ssh/my-aws-key.pem
# SSH 접속
ssh -i ~/.ssh/my-aws-key.pem \
ec2-user@퍼블릭IP
# 처음 접속 시 yes 입력
# Windows 10 이상 기본 SSH 포함
ssh -i C:\Users\사용자명\.ssh\my-aws-key.pem ec2-user@퍼블릭IP
# 키 파일 권한: 파일 우클릭
# → 속성 → 보안 → 고급
# 상속 비활성화 → 현재 사용자만 남김
OS별 기본 사용자 이름
| AMI | 기본 사용자 이름 |
|---|---|
| Amazon Linux 2, Amazon Linux 2023 | ec2-user |
| Ubuntu | ubuntu |
| Debian | admin |
SSH 접속 트러블슈팅
| 에러 | 원인 | 해결 |
|---|---|---|
Connection refused | SSH 서버 미시작 or 22 포트 미개방 | 1~2분 더 기다리기. 보안 그룹 확인 |
Connection timed out | 내 IP가 보안 그룹에 없음 | 보안 그룹 소스 IP 업데이트 (IP가 바뀌었을 수 있음) |
Permission denied (publickey) | 키 파일 불일치 or 권한 문제 | chmod 400 확인. 키 파일 경로 확인. 사용자 이름 확인 |
UNPROTECTED PRIVATE KEY | 키 파일 권한이 너무 넓음 | chmod 400 ~/.ssh/my-aws-key.pem |
SSH Config 설정 — 매번 긴 명령어 안 치는 법
Host my-spring-server
HostName 13.125.xxx.xxx
User ec2-user
IdentityFile ~/.ssh/my-aws-key.pem
ServerAliveInterval 60
# 이제 이렇게만 입력하면 접속
ssh my-spring-server
Java 설치 및 Spring Boot 배포
1단계 — Java 설치
# 시스템 업데이트
sudo dnf update -y
# Java 17 설치 (Amazon Corretto)
sudo dnf install java-17-amazon-corretto -y
# 설치 확인
java -version
# 앱 디렉토리 생성
mkdir -p ~/app
2단계 — jar 파일 업로드 (로컬 터미널에서)
# Gradle 빌드
./gradlew bootJar
# EC2로 업로드
scp -i ~/.ssh/my-aws-key.pem \
./build/libs/myapp-0.0.1-SNAPSHOT.jar \
ec2-user@퍼블릭IP:~/app/app.jar
# SSH Config 설정했으면
scp ./build/libs/myapp-0.0.1-SNAPSHOT.jar \
my-spring-server:~/app/app.jar
3단계 — systemd 서비스 등록 (운영용)
nohup은 임시방편입니다. 서버 재시작 시 앱도 꺼집니다. systemd에 등록해야 자동으로 뜹니다.
# 서비스 파일 생성
sudo tee /etc/systemd/system/myapp.service << 'EOF'
[Unit]
Description=My Spring Boot Application
After=network.target
[Service]
Type=simple
User=ec2-user
WorkingDirectory=/home/ec2-user/app
ExecStart=/usr/bin/java -Xmx1g -jar /home/ec2-user/app/app.jar \
--spring.profiles.active=prod
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal
# 환경변수 — 민감한 값은 코드에 하드코딩 금지
Environment="DB_HOST=rds-endpoint.ap-northeast-2.rds.amazonaws.com"
Environment="DB_NAME=mydb"
# DB 비밀번호는 Secrets Manager/Parameter Store 등에서 런타임에 주입
[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
# 배포 후 재시작
sudo systemctl restart myapp
JVM 버전·컨테이너/호스트 메모리·네이티브 메모리·에이전트·동시 요청량을 함께 보고 정합니다. CloudWatch Agent와 JVM 지표를 관찰하며 실제 부하에서 조정하세요.
유저 데이터 — 첫 부팅 시 자동 실행
인스턴스 생성 시 유저 데이터(User Data)에 스크립트를 넣으면 처음 부팅 시 root 권한으로 자동 실행됩니다. Java 설치 + 서비스 등록까지 자동화할 수 있습니다.
#!/bin/bash
set -e
dnf update -y
dnf install java-17-amazon-corretto -y
mkdir -p /home/ec2-user/app
chown ec2-user:ec2-user /home/ec2-user/app
# S3에서 jar 다운로드 (IAM 역할 필요)
aws s3 cp s3://my-deploy-bucket/app.jar \
/home/ec2-user/app/app.jar
# 서비스 등록 및 시작
systemctl daemon-reload
systemctl enable myapp
systemctl start myapp
EC2 생성 화면 → 고급 세부 정보 → 맨 아래 사용자 데이터 칸에 붙여넣으면 됩니다.
sudo cat /var/log/cloud-init-output.log스크립트가 제대로 실행됐는지 여기서 확인합니다.
메타데이터 — 인스턴스 자기 정보 조회
TOKEN=$(curl -s -X PUT \
"http://169.254.169.254/latest/api/token" \
-H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
# 인스턴스 ID
curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \
http://169.254.169.254/latest/meta-data/instance-id
# 리전
curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \
http://169.254.169.254/latest/meta-data/placement/region
탄력적 IP 할당하기
인스턴스를 중지 후 재시작하면 퍼블릭 IP가 바뀝니다. DNS 등록이나 팀 공유 시 문제가 됩니다. 탄력적 IP로 고정합니다.
-
EC2 → 탄력적 IP → 탄력적 IP 주소 할당
네트워크 경계 그룹: ap-northeast-2 → 할당
-
인스턴스에 연결
할당된 IP 선택 → 작업 → 탄력적 IP 주소 연결
인스턴스 선택 → 연결
탄력적 IP 선택 → 작업 → 탄력적 IP 주소 릴리스
EC2에 IAM 역할 부여하기
EC2에서 S3, SSM 등 AWS 서비스에 접근할 때 액세스 키를 코드에 박으면 절대 안 됩니다. EC2에 IAM 역할을 붙이면 SDK가 임시 자격증명을 자동으로 가져옵니다.
# application.yml
cloud.aws:
credentials:
access-key: AKIA... ← 절대 금지
secret-key: xxxx... ← 유출 위험
# EC2에 IAM 역할 부여
# → SDK가 자동으로 임시 자격증명 사용
cloud.aws:
region:
static: ap-northeast-2
# 키 설정 없음 — IAM 역할로 자동 인증
IAM 역할 생성 및 연결
-
IAM 콘솔 → 역할 → 역할 생성
신뢰할 수 있는 엔티티: AWS 서비스 → EC2
-
권한 정책 추가
AmazonS3FullAccess— S3 접근
AmazonSSMManagedInstanceCore— Session Manager 접속
CloudWatchAgentServerPolicy— 지표 수집 -
EC2에 연결
EC2 → 인스턴스 선택 → 작업 → 보안 → IAM 역할 수정
EC2 접속 방법 3가지
| 방법 | 키 페어 | 포트 22 | 접속 기록 | 권장 상황 |
|---|---|---|---|---|
| SSH | ✅ 필요 | ✅ 필요 | 별도 설정 | 일반적인 접속 |
| EC2 Instance Connect | ❌ | ✅ 필요 | CloudTrail | 키 파일 없을 때 빠른 접속 |
| Session Manager | ❌ | ❌ 불필요 | CloudTrail + 세션 로그 | 보안 강화 환경, ISMS-P 대응 |
Session Manager 설정 (권장)
SSH 포트 22를 완전히 닫아도 EC2에 접속할 수 있습니다. IAM 권한으로 제어하고, 모든 세션이 CloudTrail에 기록됩니다. ISMS-P 접근 이력 감사에 매우 유리합니다.
AmazonSSMManagedInstanceCore 추가
(AL2023 기본 설치)
연결 → Session Manager
# Session Manager Plugin 설치 (로컬 PC)
# macOS: brew install --cask session-manager-plugin
# 접속
aws ssm start-session --target i-0a1b2c3d4e5f67890
# 포트 포워딩 (로컬 8080 → EC2 8080)
aws ssm start-session \
--target i-0a1b2c3d4e5f67890 \
--document-name AWS-StartPortForwardingSession \
--parameters '{"portNumber":["8080"],"localPortNumber":["8080"]}'
인스턴스 사이즈 변경하기
t3.medium → t3.large처럼 업그레이드하거나 반대도 가능합니다. 반드시 중지(Stop) 상태에서만 가능합니다.
→ 중지
(1~2분 대기)
→ 유형 변경
→ 시작
• 탄력적 IP 없으면 재시작 시 퍼블릭 IP 변경됨
• x86 → Graviton(ARM) 전환 시 앱이 ARM 컴파일돼야 함
자주 겪는 문제와 해결법
| 증상 | 원인 | 해결 |
|---|---|---|
| 인스턴스 목록에 없음 | 리전이 다름 | 콘솔 우측 상단 리전을 서울로 변경 |
| SSH Connection timed out | 보안 그룹 22 미개방 or 내 IP 변경 | 보안 그룹 인바운드에서 내 IP 업데이트 |
| Permission denied (publickey) | 키 파일 불일치 or 권한 | chmod 400 확인. 키 파일 경로·사용자 이름 확인 |
| Spring Boot 접속 안 됨 | 앱 미실행 or 포트 미개방 | journalctl -u myapp 확인. 보안 그룹 8080 확인 |
| 서버 갑자기 느려짐 | T타입 CPU 크레딧 소진 | CloudWatch CPUCreditBalance 확인 |
| OOM 에러 | JVM 힙 메모리 과다 | -Xmx 설정 확인. free -h로 메모리 현황 확인 |
| 재시작 후 앱 안 뜸 | systemd 미등록 | systemctl enable myapp 확인 |
유용한 진단 명령어
# 메모리 현황
free -h
# 열린 포트 확인
ss -tlnp
# 앱 로그 (systemd)
sudo journalctl -u myapp -f # 실시간
sudo journalctl -u myapp -n 100 # 최근 100줄
sudo journalctl -u myapp --since today # 오늘 로그
# 앱 접속 테스트
curl -v localhost:8080/health
# 유저 데이터 실행 로그
sudo cat /var/log/cloud-init-output.log
실습 후 정리 체크리스트
- 인스턴스 → 인스턴스 상태 → 종료(Terminate) ← 중지(Stop) 아님!
- EC2 → 볼륨 →
available상태 볼륨 삭제 - EC2 → 탄력적 IP → 연결 안 된 IP 릴리스
- EC2 → 스냅샷 → 학습용 스냅샷 삭제
- EC2 → AMI → 학습용 AMI 등록 취소