02 CHAPTER 02 · 핵심 서비스

Amazon EC2

가상 서버를 처음부터 끝까지 — 생성·접속·배포·정리

핵심 서비스 시간당 과금 Spring Boot 기준

EC2 · EBS · AMI · 보안 그룹 · 탄력적 IP · ENI · 키 페어 · 유저 데이터 · 메타데이터 · Session Manager · 요금 모델

CHAPTER INFO
🖥개념 8개 + 실습 8개
💰시간당 과금 — 즉시 정리 필수
⚠️중지(Stop) ≠ 종료(Terminate)
⚠️SSH 22번 0.0.0.0/0 절대 금지
🔗이전: CH01 AWS 기초 개념
🔗다음: CH03 Amazon VPC

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부분으로 구성됩니다. 이걸 읽을 줄 알면 어떤 유형을 골라야 할지 바로 판단됩니다.

📖 인스턴스 유형 이름 구조 — t3.medium 예시
① 패밀리 (t)
t = 범용 버스트
m = 범용 균형
c = 컴퓨팅 최적화
r = 메모리 최적화
g = GPU
② 세대 (3)
숫자가 높을수록 최신
같은 가격이면 세대 높은 게 성능 좋음

뒤 알파벳:
a = AMD CPU
g = Graviton(ARM)
i = Intel
③ 크기 (medium)
nano → micro → small
→ medium → large
→ xlarge → 2xlarge
→ 4xlarge...

클수록 vCPU·메모리 증가

자주 쓰는 인스턴스 비교

유형vCPU메모리가격용도
t3.micro21 GB현재 AWS 가격표 확인학습용, 계정 혜택 확인
t3.small22 GB현재 AWS 가격표 확인소규모 서비스
t3.medium24 GB현재 AWS 가격표 확인예시 사양 — 부하 테스트로 결정
t3.large28 GB현재 AWS 가격표 확인중규모 서비스
m6i.large28 GB현재 AWS 가격표 확인프로덕션 균형형
m6i.xlarge416 GB현재 AWS 가격표 확인중대규모 프로덕션
⚠️
Spring Boot 인스턴스 크기는 고정 정답이 없습니다.
1GB 메모리의 t3.micro는 JVM·OS·에이전트 구성을 함께 올리면 여유가 작을 수 있습니다. 하지만 “운영은 최소 t3.medium”처럼 고정하기보다 JVM 힙, 동시 요청, 커넥션 풀, 모니터링 지표와 부하 테스트를 기준으로 크기를 결정하고 필요하면 Auto Scaling과 함께 조정합니다.

T타입 버스트 — CPU 크레딧 이해하기

t3, t4g 같은 T타입 인스턴스는 평소엔 낮은 기준 성능으로 동작하다가, 순간 부하 시 크레딧을 소모해서 100%까지 버스트합니다. CPU 사용률이 기준보다 낮을 때 크레딧이 쌓이고, 높을 때 소모됩니다.

✅ 크레딧 적립 (기준 이하)
CPU 사용률이 기준(t3.micro는 10%)보다 낮으면 시간당 크레딧이 쌓입니다. 인스턴스가 켜져 있는 동안 계속 적립됩니다.
⚡ 크레딧 소모 (버스트)
CPU 사용률이 기준을 초과하면 크레딧을 소모해서 최대 100%까지 성능을 높입니다.
인스턴스기준 CPU시간당 크레딧 적립최대 크레딧
t3.micro10%12288
t3.small20%24576
t3.medium20%24576
t3.large30%36864
⚠️
t3은 unlimited 모드가 기본
크레딧이 고갈돼도 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 볼륨은 인스턴스 종료 후에도 남을 수 있습니다
루트 볼륨은 일반적으로 “종료 시 삭제”가 기본이지만 추가 EBS 볼륨은 설정에 따라 남을 수 있습니다. EC2 → 볼륨에서 available 상태와 스냅샷을 확인하고, 비용은 현재 EBS 가격표를 기준으로 확인하세요.

AMI — 서버의 전체 이미지

AMI(Amazon Machine Image)는 OS + 설치된 소프트웨어 + 설정의 전체 스냅샷입니다. 인스턴스를 만들 때 쓰는 템플릿이며, 잘 설정된 서버를 AMI로 만들어서 동일한 서버를 여러 개 찍어낼 수도 있습니다.

AMI특징권장 상황
Amazon Linux 2023AWS 최적화 · dnf 패키지 · 최신 보안신규 프로젝트 기본 선택
Amazon Linux 22026년 6월 30일 지원 종료(EOL)신규 구축에는 사용하지 말고 AL2023으로 마이그레이션
Ubuntu 22.04 LTSapt 패키지 · 2027년까지 지원Ubuntu 경험자
커스텀 AMI직접 만든 이미지Auto Scaling, 빠른 반복 배포

보안 그룹 — 인스턴스 방화벽

보안 그룹은 EC2 인스턴스 앞에 붙는 가상 방화벽입니다. 인바운드(들어오는)와 아웃바운드(나가는) 트래픽 규칙을 각각 설정합니다.

핵심 특성 4가지

특성내용실무 의미
Stateful 인바운드 허용 시 해당 연결의 응답(아웃바운드)은 자동 허용 HTTP 80을 열면 응답도 자동으로 나감. 아웃바운드 별도 설정 불필요
허용만 가능 Allow 규칙만 있음. 명시적으로 허용 안 한 것은 자동 차단 NACL과 달리 Deny 규칙이 없어서 관리가 단순함
보안 그룹을 소스로 IP 대신 다른 보안 그룹을 소스로 지정 가능 ALB 보안 그룹을 소스로 지정하면 ALB에서 오는 트래픽만 허용. IP 변경에도 자동 추적
다중 적용 기본 quota는 네트워크 인터페이스당 5개이며, Service Quotas에서 조정 시 최대 16개까지 요청 가능 공통 규칙은 공유 보안 그룹으로, 서비스별 규칙은 별도로 관리

3티어 보안 그룹 구성 패턴

🛡 ALB → EC2 → RDS 보안 그룹 구성
SG-ALB (ALB용)
인바운드: TCP 80 ← 0.0.0.0/0
인바운드: TCP 443 ← 0.0.0.0/0
↓ ALB만 EC2에 접근
SG-EC2 (앱 서버용)
인바운드: TCP 8080 ← SG-ALB (ALB에서만)
인바운드: TCP 22 ← 내 IP (SSH, 필요 시만)
↓ EC2만 RDS에 접근
SG-RDS (DB용)
인바운드: TCP 3306 ← SG-EC2 (EC2에서만)
🚨
SSH 22번을 0.0.0.0/0으로 열면 안 됩니다
인터넷에는 24시간 포트 스캐너가 돌아다닙니다. 22번이 열리는 순간 수분 안에 발견되고 무차별 대입 공격이 시작됩니다. 반드시 내 IP만 허용하거나, SSH를 닫고 Session Manager를 쓰세요.

자주 쓰는 포트

포트용도소스 설정
22SSH내 IP만 (절대 0.0.0.0/0 금지)
80HTTP0.0.0.0/0 (ALB에 붙이면 ALB SG만)
443HTTPS0.0.0.0/0 (ALB에 붙이면 ALB SG만)
8080Spring Boot 기본ALB 보안 그룹만
3306MySQLEC2 보안 그룹만
6379RedisEC2 보안 그룹만

키 페어 · IP 주소 · ENI

키 페어 — SSH 접속의 열쇠

EC2 SSH 접속은 비밀번호 대신 공개키/개인키 쌍을 씁니다. AWS가 공개키를 인스턴스에 넣어두고, 나는 개인키(.pem 파일)를 가집니다.

🔑
프라이빗 키는 다시 다운로드할 수 없습니다.
AWS는 생성한 프라이빗 키 사본을 보관하지 않습니다. 다만 키를 잃었다고 항상 인스턴스를 새로 만들어야 하는 것은 아닙니다. Session Manager, EC2 Instance Connect, 새 공개키 추가 등 사전에 구성된 접속 경로가 있으면 복구할 수 있습니다. 키는 안전한 개인 보관소에 저장하고 공유 드라이브·소스 저장소에는 올리지 마세요.

IP 주소 세 종류

종류특징재시작 시과금
퍼블릭 IP인터넷 접근 가능. 자동 할당변경됨Public IPv4 시간당 과금
프라이빗 IPVPC 내부 통신용. 항상 고정유지무료
탄력적 IP고정 퍼블릭 IP. 직접 할당·관리유지Public IPv4 시간당 과금
💰
Public IPv4는 사용 여부와 관계없이 비용을 확인합니다.
AWS는 퍼블릭 IPv4 주소에 시간당 요금을 부과합니다. 자동 할당 Public IPv4와 Elastic IP 모두 현재 VPC 가격 정책을 확인하고, 필요 없는 주소는 해제·릴리스하세요.

EC2 생명 주기 — 상태별 과금 차이

상태의미과금
pending시작 중 (부팅)인스턴스 과금 정책은 현재 EC2 요금 기준 확인
running정상 실행 중✅ 시간당 과금
stopped중지됨EBS 요금만 (인스턴스 요금 없음)
terminated종료됨 (재시작 불가)인스턴스 컴퓨팅은 종료되지만 남은 EBS·스냅샷·Public IPv4 등 별도 리소스 확인
⚠️
중지(Stop) vs 종료(Terminate) — 이 차이가 제일 중요합니다
중지(Stop): 껐지만 삭제 안 됨. 재시작 가능. EBS 데이터 유지. EBS 요금 계속 발생.
종료(Terminate): 완전 삭제. 재시작 불가. 루트 볼륨도 기본 삭제.

학습용 인스턴스는 종료(Terminate)하세요. 중지하면 EBS 요금이 계속 나옵니다.

EC2 요금 모델

모델약정할인권장 상황
온디맨드없음기준학습, 단기 프로젝트
예약 인스턴스1년 또는 3년조건별 할인 — 현재 가격 확인24시간 돌아가는 프로덕션
Savings Plans1년 또는 3년조건별 할인 — 현재 가격 확인RI보다 유연하게 약정
스팟 인스턴스없음변동 할인 — 현재 가격 확인배치 처리, 중단 허용 작업
💡
학습 중에는 온디맨드만 쓰세요
예약 인스턴스는 약정이라 실수로 만들면 취소가 어렵습니다. 온디맨드로 만들고, 쓰고 나서 바로 종료하는 습관을 들이세요.

EC2 인스턴스 생성하기

⏱
생성한 리소스는 즉시 비용 대상이 될 수 있습니다.
인스턴스·EBS·Public IPv4 등 선택한 리소스의 현재 가격과 계정 혜택을 확인하세요. 실습 후 종료(Terminate)와 잔존 리소스 정리를 하고, 시작 전 콘솔 우측 상단 리전이 아시아 태평양(서울)인지 확인하세요.

생성 단계

① EC2 콘솔
→ 인스턴스 시작
→
② 이름 설정
AMI 선택
→
③ 인스턴스 유형
키 페어
→
④ 네트워크
보안 그룹
→
⑤ 스토리지
→ 시작

각 단계 상세

  1. 이름 및 AMI
    이름: my-spring-server
    AMI: Quick Start → Amazon Linux → Amazon Linux 2023 AMI
    아키텍처: 64비트(x86)
  2. 인스턴스 유형 및 키 페어
    유형: t3.micro 등 학습 목적에 맞는 유형 선택 — Spring Boot는 메모리·부하를 보고 결정
    키 페어: 새 키 페어 생성 → 이름 my-aws-key → RSA → .pem
    ⚠️ .pem 파일 다운로드 → ~/.ssh/로 이동해서 보관
  3. 네트워크 설정
    보안 그룹 새로 생성 → 이름: sg-my-spring-server
    인바운드 규칙:
      • SSH(22) — 소스: 내 IP (My IP 선택 시 현재 IP 자동 입력)
      • HTTP(80) — 소스: 위치 무관(0.0.0.0/0)
    퍼블릭 IP 자동 할당: 활성화
  4. 스토리지
    기본값: 8 GiB gp3 그대로 사용
    함부로 크기 늘리지 마세요 — 줄이는 건 안 됩니다
    "종료 시 삭제" 옵션이 켜져 있는지 확인
💡
인스턴스 목록에서 확인할 정보
인스턴스 선택 → 하단 세부 정보 탭:
• 퍼블릭 IPv4 주소 → SSH 접속에 사용
• 인스턴스 상태 → running이어야 접속 가능
• 가용 영역 → 어느 AZ에 생성됐는지

SSH로 EC2 접속하기

상태가 running이 된 후 1~2분 더 기다려야 SSH 서버가 완전히 올라옵니다. 너무 빨리 접속하면 Connection refused가 납니다.

macOS / Linux
# 키 파일 권한 설정 (최초 1회)
chmod 400 ~/.ssh/my-aws-key.pem

# SSH 접속
ssh -i ~/.ssh/my-aws-key.pem \
  ec2-user@퍼블릭IP

# 처음 접속 시 yes 입력
Windows (PowerShell)
# Windows 10 이상 기본 SSH 포함
ssh -i C:\Users\사용자명\.ssh\my-aws-key.pem ec2-user@퍼블릭IP

# 키 파일 권한: 파일 우클릭
# → 속성 → 보안 → 고급
# 상속 비활성화 → 현재 사용자만 남김

OS별 기본 사용자 이름

AMI기본 사용자 이름
Amazon Linux 2, Amazon Linux 2023ec2-user
Ubuntuubuntu
Debianadmin

SSH 접속 트러블슈팅

에러원인해결
Connection refusedSSH 서버 미시작 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 설정 — 매번 긴 명령어 안 치는 법

📄 ~/.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 설치

💻 EC2 터미널 — Amazon Linux 2023
# 시스템 업데이트
sudo dnf update -y

# Java 17 설치 (Amazon Corretto)
sudo dnf install java-17-amazon-corretto -y

# 설치 확인
java -version

# 앱 디렉토리 생성
mkdir -p ~/app

2단계 — jar 파일 업로드 (로컬 터미널에서)

💻 로컬 터미널 — scp로 파일 전송
# 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에 등록해야 자동으로 뜹니다.

💻 EC2 터미널 — 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
💡
-Xmx는 인스턴스 크기만 보고 복사하지 않습니다.
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
스크립트가 제대로 실행됐는지 여기서 확인합니다.

메타데이터 — 인스턴스 자기 정보 조회

💻 메타데이터 조회 (IMDSv2)
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로 고정합니다.

  1. EC2 → 탄력적 IP → 탄력적 IP 주소 할당
    네트워크 경계 그룹: ap-northeast-2 → 할당
  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 역할 생성 및 연결

  1. IAM 콘솔 → 역할 → 역할 생성
    신뢰할 수 있는 엔티티: AWS 서비스 → EC2
  2. 권한 정책 추가
    AmazonS3FullAccess — S3 접근
    AmazonSSMManagedInstanceCore — Session Manager 접속
    CloudWatchAgentServerPolicy — 지표 수집
  3. 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 접근 이력 감사에 매우 유리합니다.

① IAM 역할에
AmazonSSMManagedInstanceCore 추가
→
② SSM Agent 확인
(AL2023 기본 설치)
→
③ EC2 콘솔 →
연결 → Session Manager
💻 Session Manager CLI 접속
# 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) 상태에서만 가능합니다.

① 인스턴스 상태
→ 중지
→
② stopped 확인
(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

실습 후 정리 체크리스트

🗑
빠뜨리면 계속 과금됩니다 — 순서대로 진행하세요
  1. 인스턴스 → 인스턴스 상태 → 종료(Terminate) ← 중지(Stop) 아님!
  2. EC2 → 볼륨 → available 상태 볼륨 삭제
  3. EC2 → 탄력적 IP → 연결 안 된 IP 릴리스
  4. EC2 → 스냅샷 → 학습용 스냅샷 삭제
  5. EC2 → AMI → 학습용 AMI 등록 취소
📌 CH02 핵심 개념 요약
인스턴스 유형패밀리+세대+크기. Spring Boot 사양은 JVM·부하·모니터링 지표로 결정
T타입 버스트기준 이하 → 크레딧 적립. 초과 → 소모. t3은 unlimited 기본(고갈 시 추가 과금)
EBS가상 디스크. gp3 등 워크로드에 맞는 볼륨 유형 선택 — 현재 가격 확인. 인스턴스 종료 후 available 볼륨 잔류 주의
보안 그룹Stateful 방화벽. SSH 22 소스는 내 IP만. 앱 포트는 ALB SG를 소스로
탄력적 IP고정 Public IPv4. 현재 Public IPv4 가격 정책을 확인하고 실습 후 불필요하면 릴리스
중지 vs 종료중지 = EBS 요금 계속. 종료 = 완전 삭제. 학습 후엔 반드시 종료
IAM 역할EC2에 붙이면 임시 자격증명 자동 발급. 액세스 키 코드 삽입 절대 금지
Session ManagerSSH 포트 없이 IAM으로 접속. CloudTrail 기록. ISMS-P 감사 대응에 유리
systemd서비스 등록 시 재시작 후 자동 실행. journalctl로 로그 확인