오늘은 AWS EC2(Elastic Compute Cloud)와 RDS(Relational Database Service)를 활용한 웹 애플리케이션 배포 전략에 대해 알아보겠습니다.
AWS 인프라는 현대 개발자의 필수 스킬이 되었지만, 처음 접하면 복잡하고 어렵게 느껴질 수 있습니다.
이 글에서는 단계별로 EC2 인스턴스 생성부터 RDS 데이터베이스 연결, 보안 설정, 그리고 비용 최적화까지 실무에서 바로 적용할 수 있는 내용을 다룹니다.
💡 이 글이 필요한 사람:
AWS 환경에 웹 애플리케이션을 처음 배포하려는 개발자
EC2와 RDS 연동 과정에서 어려움을 겪고 있는 개발자
AWS 인프라 비용을 최적화하고 싶은 개발자/기업
🔑 AWS 인프라의 핵심 구성 요소
EC2(Elastic Compute Cloud)란?
EC2(Elastic Compute Cloud)는 AWS에서 제공하는 확장 가능한 컴퓨팅 서비스입니다.
간단히 말해 클라우드에서 가상 서버를 빌려 사용하는 서비스로, 필요에 따라 성능과 용량을 조절할 수 있습니다.
웹 서버, 애플리케이션 서버 등 다양한 용도로 활용할 수 있으며, 리눅스, 윈도우 등 여러 운영체제를 선택할 수 있습니다.
RDS(Relational Database Service)란?
RDS(Relational Database Service)는 관계형 데이터베이스를 쉽게 설정, 운영 및 확장할 수 있는 AWS 서비스입니다.
MySQL, PostgreSQL, Oracle DB, SQL Server 등 다양한 데이터베이스 엔진을 지원하며, 백업, 패치, 확장성 관리 등 데이터베이스 관리 작업을 AWS가 자동으로 처리해주어 개발자가 애플리케이션 개발에 집중할 수 있습니다.
🚀 EC2 인스턴스 생성 및 설정 가이드
1. EC2 인스턴스 유형 선택하기
EC2 인스턴스는 다양한 유형이 있으며, 애플리케이션의 요구사항에 맞게 선택해야 합니다.
- t2/t3 시리즈: 개발 환경이나 트래픽이 적은 웹 애플리케이션에 적합
- m5/m6 시리즈: 균형 잡힌 컴퓨팅 성능이 필요한 프로덕션 환경에 적합
- c5/c6 시리즈: 컴퓨팅 집약적 작업에 최적화
- r5/r6 시리즈: 메모리 집약적 애플리케이션에 적합
💡 팁: 처음에는 t2.micro
또는 t3.micro
인스턴스로 시작하여 무료 티어 혜택을 누릴 수 있습니다.
2. EC2 인스턴스 생성 단계
- AWS 콘솔에 로그인하고 EC2 서비스를 선택합니다.
- "인스턴스 시작" 버튼을 클릭합니다.
- AMI(Amazon Machine Image)를 선택합니다. Amazon Linux 2023이나 Ubuntu LTS 버전을 추천합니다.
- 인스턴스 유형을 선택합니다 (예: t2.micro).
- 네트워크 및 서브넷 설정을 구성합니다.
- 스토리지 용량을 설정합니다 (기본 8GB에서 필요에 따라 조정).
- 보안 그룹을 구성합니다 (SSH, HTTP, HTTPS 포트 개방).
- 키 페어를 생성하거나 기존 키 페어를 선택합니다.
- "인스턴스 시작" 버튼을 클릭하여 배포를 완료합니다.
3. SSH 키 생성 및 관리
EC2 인스턴스에 접속하기 위해서는 SSH 키가 필요합니다. 아래는 SSH 키 관리의 모범 사례입니다.
# 로컬 환경에서 SSH 키 생성
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# 권한 설정 (중요!)
chmod 400 ~/.ssh/your-key.pem
# EC2 인스턴스에 접속
ssh -i ~/.ssh/your-key.pem ec2-user@your-ec2-public-ip
⚠️ 주의사항: 절대로 SSH 키를 GitHub 등 공개 저장소에 업로드하지 마세요!
4. 보안 그룹 설정
보안 그룹은 EC2 인스턴스의 방화벽 역할을 합니다. 적절한 보안 그룹 설정은 서버 보안의 기본입니다.
- SSH(22): 내 IP만 허용
- HTTP(80): 0.0.0.0/0 (모든 IP 허용)
- HTTPS(443): 0.0.0.0/0 (모든 IP 허용)
- 애플리케이션 포트(예: 8080): 필요한 경우에만 허용
💾 RDS 데이터베이스 설정 및 EC2 연동
1. RDS 인스턴스 생성하기
- AWS 콘솔에서 RDS 서비스를 선택합니다.
- "데이터베이스 생성" 버튼을 클릭합니다.
- 데이터베이스 엔진을 선택합니다 (MySQL, PostgreSQL 등).
- 템플릿을 선택합니다 (프로덕션, 개발/테스트, 프리 티어).
- 인스턴스 식별자, 사용자 이름, 암호를 설정합니다.
- 인스턴스 크기와 스토리지를 구성합니다.
- 다중 AZ 배포 여부를 결정합니다 (프로덕션 환경 권장).
- VPC 및 보안 그룹을 설정합니다.
- 데이터베이스 이름과 포트를 지정합니다.
- 백업 보존 기간을 설정합니다 (7일 이상 권장).
- "데이터베이스 생성" 버튼을 클릭합니다.
2. RDS 보안 그룹 설정
RDS 보안 그룹은 데이터베이스에 접근할 수 있는 트래픽을 제어합니다.
- MySQL/PostgreSQL 포트(3306/5432): EC2 보안 그룹 ID만 허용
- 공개 액세스: 아니오 (보안 강화)
3. EC2와 RDS 연결 설정
EC2 인스턴스에서 RDS 데이터베이스에 접속하는 방법입니다.
# MySQL 클라이언트 설치 (Amazon Linux 2023)
sudo dnf install -y mysql
# RDS 데이터베이스 접속
mysql -h your-rds-endpoint.rds.amazonaws.com -u admin -p
# 데이터베이스 생성 및 사용자 권한 설정
CREATE DATABASE myapp;
CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON myapp.* TO 'myuser'@'%';
FLUSH PRIVILEGES;
4. 애플리케이션에서 RDS 연결 설정 (Java/Spring Boot 예제)
// application.properties 또는 application.yml 파일 설정
spring.datasource.url=jdbc:mysql://your-rds-endpoint.rds.amazonaws.com:3306/myapp
spring.datasource.username=myuser
spring.datasource.password=mypassword
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
// 보안을 위해 환경 변수 사용 권장
spring.datasource.url=jdbc:mysql://${RDS_ENDPOINT}:3306/${DB_NAME}
spring.datasource.username=${DB_USERNAME}
spring.datasource.password=${DB_PASSWORD}
🔒 보안 강화 전략
1. IAM 역할 및 정책 설정
EC2 인스턴스에 IAM 역할을 부여하여 AWS 리소스에 안전하게 접근할 수 있습니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"rds:Connect",
"rds:Describe*"
],
"Resource": "arn:aws:rds:region:account-id:db:database-name"
}
]
}
2. 네트워크 보안 강화
VPC(Virtual Private Cloud) 내에 프라이빗 서브넷을 구성하여 RDS를 보호하고, EC2는 퍼블릭 서브넷에 배치하는 구성이 좋습니다.
VPC 구성:
- 퍼블릭 서브넷: EC2 인스턴스 배치
- 프라이빗 서브넷: RDS 인스턴스 배치
- NAT 게이트웨이: 프라이빗 서브넷에서 외부 접속 허용
3. SSL/TLS 인증서 설정
HTTPS 통신을 위한 SSL/TLS 인증서 설정은 필수입니다. AWS Certificate Manager를 활용하면 무료로 인증서를 발급받을 수 있습니다.
# certbot을 이용한 Let's Encrypt 인증서 발급 (Amazon Linux 2023)
sudo dnf install -y certbot
sudo certbot certonly --standalone -d yourdomain.com
# Nginx SSL 설정 예제
server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
# 보안 강화 설정
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
# 나머지 서버 설정...
}
💸 비용 최적화 전략
1. EC2 인스턴스 비용 최적화
- Reserved Instances: 1년 또는 3년 약정으로 최대 75% 할인
- Spot Instances: 테스트 환경이나 내결함성이 있는 워크로드에 적합, 최대 90% 할인
- Auto Scaling: 트래픽에 따라 자동으로 인스턴스 수 조절
# Auto Scaling 그룹 생성 (AWS CLI)
aws autoscaling create-auto-scaling-group \
--auto-scaling-group-name my-asg \
--launch-configuration-name my-launch-config \
--min-size 1 \
--max-size 3 \
--desired-capacity 1 \
--vpc-zone-identifier "subnet-xxxxx,subnet-yyyyy"
2. RDS 인스턴스 비용 최적화
- 인스턴스 크기 조정: 필요한 성능에 맞게 인스턴스 크기 선택
- 스토리지 자동 확장: 필요할 때만 스토리지 확장
- Read Replica: 읽기 트래픽이 많은 경우 읽기 전용 복제본 활용
- Amazon Aurora Serverless: 간헐적 사용 패턴에 적합
3. CloudWatch를 활용한 모니터링 및 비용 관리
# CloudWatch 경보 설정 (AWS CLI)
aws cloudwatch put-metric-alarm \
--alarm-name HighCPUUtilization \
--alarm-description "Alarm when CPU exceeds 70%" \
--metric-name CPUUtilization \
--namespace AWS/EC2 \
--statistic Average \
--period 300 \
--threshold 70 \
--comparison-operator GreaterThanThreshold \
--dimensions Name=InstanceId,Value=i-1234567890abcdef0 \
--evaluation-periods 2 \
--alarm-actions arn:aws:sns:region:account-id:topic-name
🔄 자동화된 배포 환경 구축
1. AWS CodeDeploy를 활용한 CI/CD 파이프라인
# appspec.yml 파일 예제
version: 0.0
os: linux
files:
- source: /
destination: /var/www/html
hooks:
BeforeInstall:
- location: scripts/before_install.sh
timeout: 300
runas: root
AfterInstall:
- location: scripts/after_install.sh
timeout: 300
runas: root
ApplicationStart:
- location: scripts/start_application.sh
timeout: 300
runas: root
2. 데이터베이스 자동 백업 설정
# AWS CLI를 사용한 RDS 스냅샷 생성
aws rds create-db-snapshot \
--db-instance-identifier your-db-instance \
--db-snapshot-identifier manual-snapshot-name
📊 성능 모니터링 및 로깅
1. CloudWatch 대시보드 구성
성능 모니터링을 위한 CloudWatch 대시보드를 설정하여 시스템 상태를 실시간으로 확인할 수 있습니다.
# AWS CLI를 이용한 CloudWatch 대시보드 생성
aws cloudwatch put-dashboard \
--dashboard-name "EC2-RDS-Dashboard" \
--dashboard-body file://dashboard-body.json
2. 중앙 집중식 로깅 시스템 구축
# CloudWatch Logs 에이전트 설치 (Amazon Linux 2023)
sudo dnf install -y awslogs
sudo systemctl enable awslogsd.service
sudo systemctl start awslogsd.service
# /etc/awslogs/awslogs.conf 설정
[/var/log/messages]
datetime_format = %b %d %H:%M:%S
file = /var/log/messages
buffer_duration = 5000
log_stream_name = {instance_id}/var/log/messages
initial_position = start_of_file
log_group_name = /var/log/messages
🚨 장애 대응 및 복구 전략
1. 자동 복구 설정
# EC2 인스턴스 상태 확인 설정 (AWS CLI)
aws ec2 modify-instance-attribute \
--instance-id i-1234567890abcdef0 \
--attribute instanceInitiatedShutdownBehavior \
--value stop
2. 재해 복구 계획
Multi-AZ 배포 전략:
1. EC2: Auto Scaling 그룹을 여러 가용 영역에 배포
2. RDS: Multi-AZ 활성화로 자동 장애 조치 구성
3. S3: 교차 리전 복제 설정
4. Route 53: 헬스 체크 및 장애 조치 라우팅 정책 설정
📝 프로젝트 실전 적용 사례: Spring Boot 애플리케이션 배포
1. 프로젝트 구조 및 배포 스크립트
#!/bin/bash
# deploy.sh
# 변수 설정
DEPLOY_PATH=/var/www/myapp
JAR_NAME=myapp-0.0.1-SNAPSHOT.jar
# 애플리케이션 중지
if pgrep -f $JAR_NAME > /dev/null; then
echo "Stopping application..."
pkill -f $JAR_NAME
sleep 5
fi
# 새 버전 배포
echo "Deploying new version..."
cp $JAR_NAME $DEPLOY_PATH/
cd $DEPLOY_PATH
# 환경 변수 설정
export RDS_ENDPOINT=your-rds-endpoint.rds.amazonaws.com
export DB_NAME=myapp
export DB_USERNAME=myuser
export DB_PASSWORD=mypassword
# 애플리케이션 시작
nohup java -jar $JAR_NAME > application.log 2>&1 &
echo "Application started!"
2. Nginx를 활용한 리버스 프록시 설정
# /etc/nginx/conf.d/myapp.conf
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
🏁 결론: AWS 인프라 마스터하기
AWS EC2와 RDS를 활용한 배포는 현대 웹 애플리케이션 개발에서 필수적인 스킬입니다. 이 글에서 다룬 내용을 따라 실습하면 안정적이고 확장 가능한 인프라를 구성할 수 있을 것입니다.
또한, 비용 최적화 전략을 적용하여 불필요한 지출을 줄이고, 보안 설정을 강화하여 안전한 서비스 운영이 가능합니다. AWS 서비스는 지속적으로 업데이트되고 새로운 기능이 추가되므로, AWS 공식 문서를 참고하여 최신 정보를 확인하는 것이 좋습니다.
🔍 자주 묻는 질문 (FAQ)
Q: EC2와 RDS를 연결할 때 발생하는 일반적인 오류는 무엇인가요?
A: 가장 흔한 오류는 보안 그룹 설정 문제입니다. EC2 인스턴스의 보안 그룹이 RDS 포트(MySQL: 3306, PostgreSQL: 5432)에 대한 아웃바운드 트래픽을 허용하고, RDS 보안 그룹이 EC2 보안 그룹으로부터의 인바운드 트래픽을 허용하는지 확인하세요.
Q: AWS 프리 티어로 어디까지 사용할 수 있나요?
A: AWS 프리 티어는 12개월 동안 t2.micro EC2 인스턴스 750시간/월, RDS db.t2.micro 인스턴스 750시간/월, 20GB의 범용 SSD 스토리지 등을 무료로 제공합니다. 소규모 개발 및 테스트 환경으로는 충분하지만, 프로덕션 환경에는 더 높은 사양이 필요할 수 있습니다.
Q: EC2와 RDS 사이의 데이터 전송 비용이 발생하나요?
A: 같은 가용 영역 내에서 EC2와 RDS 간의 데이터 전송은 무료입니다. 하지만 다른 가용 영역 간의 데이터 전송에는 비용이 발생할 수 있으므로, 가능하면 같은 가용 영역에 배포하는 것이 좋습니다.
Q: RDS의 자동 백업 정책은 어떻게 설정하나요?
A: RDS 콘솔에서 데이터베이스를 선택하고 "수정" 버튼을 클릭한 후, "백업" 섹션에서 백업 보존 기간(0-35일)을 설정할 수 있습니다. 프로덕션 환경에서는 최소 7일 이상 설정하는 것이 권장됩니다.
이 글이 여러분의 AWS 배포 여정에 도움이 되었기를 바랍니다. 궁금한 점이나 추가적인 정보가 필요하시면 댓글로 남겨주세요! 다음 포스팅에서는 AWS ECS와 Fargate를 활용한 컨테이너화된 애플리케이션 배포에 대해 알아보겠습니다. 감사합니다! 🙏
'DevOps' 카테고리의 다른 글
Docker로 Spring Boot 애플리케이션 배포하기 - 실전용 Dockerfile 작성법 (0) | 2025.05.05 |
---|---|
Backstage란? 개발팀을 위한 내부 개발 플랫폼(IDP) 완벽 가이드 (1) | 2025.03.12 |