10개의 실수: AWS EC2 배포 시 개발자가 자주 하는 오류
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
인프라/DevOps/보안
대상자
AWS EC2 인프라를 직접 관리하는 개발자, DevOps 엔지니어, 클라우드 배포 초보자
(난이도: 중급 ~ 고급, EC2 기본 개념을 이해한 상태)
핵심 요약
- 보안 그룹 설정 오류
Security Group
에서22
,80
,443
,3000
포트 허용 범위 설정 필수0.0.0.0/0
은All traffic
대신 필요한 IP만 허용- Elastic IP 미사용
- EC2 인스턴스 재시작 시 자동 변경되는 Public IP 대신 Elastic IP 할당
Elastic IP
는 연결 중인 인스턴스에만 무료- 스케일링/모니터링 미구성
- Elastic Load Balancing (ELB) + Auto Scaling Groups (ASGs) 사용
- CloudWatch Logs 및 X-Ray로 앱 로그 수집 및 성능 분석
섹션별 세부 요약
1. 보안 그룹 설정 오류
- 문제: SSH 또는 HTTP 접속 불가, 포트 80/443/3000 차단
- 실제 사례: Node.js 앱을 3000포트에서 실행했으나 브라우저 접속 시 타임아웃
- 해결 방법:
Security Group
에서Inbound Rule
에TCP
포트 22, 80, 443, 3000 허용0.0.0.0/0
대신 필요한 IP만 허용 (예:192.168.1.0/24
)
2. Elastic IP 미사용
- 문제: EC2 재시작 시 Public IP 변경 → DNS 레코드 무효화
- 실제 사례: DNS 설정 후 다음 날 서버 접속 불가
- 해결 방법:
Elastic IP
할당 →EC2
인스턴스에 BindingElastic IP
은 연결 중인 인스턴스에만 무료
3. 단일 인스턴스 사용
- 문제: 트래픽 증가 시 서버 다운, 자동 스케일링 미구성
- 실제 사례: Hacker News 언급 시 트래픽 폭증으로 서버 다운
- 해결 방법:
Elastic Load Balancing (ELB)
+Auto Scaling Groups (ASGs)
사용ASG
는 CPU/메모리/커스텀 메트릭 기반으로 인스턴스 수 조절
4. 인스턴스 내 데이터 저장
- 문제: 인스턴스 종료 시 데이터 손실, 백업 불가
- 실제 사례:
/var/www/app/uploads
에 저장한 데이터가 인턴 실수로 삭제 - 해결 방법:
- S3 (사용자 업로드), RDS/Aurora (데이터베이스), EFS (공유 스토리지) 사용
5. 하드코딩된 비밀 정보
- 문제:
config.js
에 AWS 키/비밀번호 저장 → 리포지토리 노출 시 보안 취약 - 실제 사례: GitHub 공개 시 10분 동안 노출 → EC2 비용 2000달러 손실
- 해결 방법:
- AWS Secrets Manager 또는 Parameter Store 사용
- 환경 변수로 관리 (
.env
는 소스 컨트롤에 절대 포함하지 않음)
6. 모니터링 미설정
- 문제: 서버 재시작 시 로그 삭제, 성능 이슈 감지 불가
- 실제 사례: 2AM에 API 다운 알림 → EC2 재시작 후 로그 모두 삭제
- 해결 방법:
- CloudWatch Logs 및 CloudWatch Metrics 통합
- X-Ray로 성능 병목 지점 추적
CloudWatch Agent
설치 (시스템 수준 메트릭 수집)
7. 패치 미적용
- 문제: 보안 취약점, 호환성 문제, 오래된 런타임
- 실제 사례: Ubuntu 18.04 + Node.js v10 →
async/await
지원 없음 - 해결 방법:
- SSM Patch Manager로 자동 업데이트
- Amazon Linux 2023 사용 (롤링 업데이트 지원)
- Docker 이미지로 런타임 버전 관리
8. 수동 설정
- 문제: 환경 설정 불일치, 팀 협업 어려움, 설정 누락
- 실제 사례: 팀원이 EC2 설정 복제 시 IAM 규칙/EB스 설정 누락
- 해결 방법:
- Terraform 또는 AWS CloudFormation으로 Infrastructure as Code (IaC) 적용
- 설정을 버전 컨트롤에 저장 (예: GitHub)
- 템플릿을 환경(DEV/STG/PROD) 간 공유
9. 기본 AMI 사용
- 문제: 부팅 시간 증가, 수동 설정 필요, 최적화 미비
- 실제 사례: 매번 Nginx, Node.js, PM2 설치 → 30분 소요
- 해결 방법:
- Custom AMI 생성 (도구, 설정, 기본 구성 포함)
- EC2 Image Builder로 자동화된 이미지 생성/업데이트
10. IAM 역할 미설정
- 문제: S3/DynamoDB 접근 불가, 보안 취약, 권한 관리 어려움
- 실제 사례:
.env
파일에 AWS 키 저장 → 실수로git push
→ 암호화 채굴 농장 비용 발생 - 해결 방법:
- IAM Role 생성 → EC2 인스턴스에 Binding
- 최소 권한 정책 적용 (예:
s3:GetObject
,dynamodb:Scan
)
결론
- 보안 그룹, Elastic IP, ELB + ASG, S3/RDS/EFS, Secrets Manager, CloudWatch, IaC, Custom AMI, IAM Role 등의 핵심 도구/패턴을 반드시 적용
- Mistake | Fix 표 참고:
| 실수 | 해결 방법 |
|---|---|
| 보안 그룹 | 22
, 80
, 443
, 3000
포트 허용 + IP 제한 |
| Elastic IP 미사용 | Elastic IP
할당 및 인스턴스에 Binding |
| 단일 인스턴스 | ELB + ASG
사용 |
| 인스턴스 내 데이터 저장 | S3, RDS, EFS 사용 |
| 하드코딩된 비밀 정보 | Parameter Store, Secrets Manager 사용 |
| 모니터링 미설정 | CloudWatch Logs + Metrics + Alarms 설정 |
| 패치 미적용 | SSM Patch Manager 자동 업데이트 |
| 수동 설정 | Terraform, CloudFormation으로 IaC 적용 |
| 기본 AMI 사용 | Custom AMI 생성 및 재사용 |
| IAM 역할 미설정 | IAM Role 생성 + 최소 권한 정책 적용 |