AWS Elastic Beanstalk 완전 가이드: 언제 사용하고 언제 피해야 할까?
AWS Elastic Beanstalk는 개발자가 인프라 관리에 신경 쓰지 않고 애플리케이션 개발에 집중할 수 있게 해주는 PaaS(Platform as a Service) 서비스입니다. 하지만 모든 상황에 적합한 것은 아닙니다. 이 글에서는 실제 프로젝트 경험을 바탕으로 Elastic Beanstalk의 장단점과 최적의 사용 시나리오를 분석해보겠습니다.
🚀 AWS Elastic Beanstalk란?
Elastic Beanstalk는 Java, .NET, PHP, Node.js, Python, Ruby, Go, Docker 애플리케이션을 AWS 클라우드에 배포하고 관리하는 서비스입니다. 코드만 업로드하면 Beanstalk이 자동으로 배포, 모니터링, 오토스케일링을 처리합니다.
지원 플랫폼
- Java: Tomcat, OpenJDK
- Python: Django, Flask
- Node.js: Express.js
- PHP: Laravel, Symfony
- .NET: ASP.NET Core
- Ruby: Rails, Sinatra
- Go: Gin, Echo
- Docker: 모든 컨테이너화된 애플리케이션
✅ Elastic Beanstalk의 주요 장점
1. 간편한 배포 프로세스
# EB CLI를 통한 간단한 배포
eb init
eb create production
eb deploy
# 또는 웹 콘솔에서 ZIP 파일 업로드
실제 배포 시간 비교:
- 수동 EC2 설정: 2-4시간
- Elastic Beanstalk: 10-15분
2. 자동 인프라 관리
# .ebextensions/01-packages.config
packages:
yum:
git: []
postgresql-devel: []
option_settings:
aws:elasticbeanstalk:application:environment:
DATABASE_URL: "postgresql://user:pass@host:5432/db"
REDIS_URL: "redis://cache.example.com:6379"
aws:autoscaling:launchconfiguration:
InstanceType: t3.medium
SecurityGroups: sg-12345678
aws:autoscaling:asg:
MinSize: 2
MaxSize: 10
Beanstalk이 자동으로 관리하는 리소스:
- EC2 인스턴스
- Load Balancer (ALB/CLB)
- Auto Scaling Group
- Security Groups
- CloudWatch 모니터링
3. 무중단 배포 (Rolling Deployments)
# 배포 정책 설정
option_settings:
aws:elasticbeanstalk:command:
DeploymentPolicy: RollingWithAdditionalBatch
BatchSizeType: Percentage
BatchSize: 30
Timeout: 600
배포 정책 비교:
| 정책 | 배포 시간 | 다운타임 | 리소스 사용 |
|---|---|---|---|
| All at once | 빠름 | 있음 | 낮음 |
| Rolling | 보통 | 없음 | 보통 |
| Rolling with additional batch | 보통 | 없음 | 높음 |
| Immutable | 느림 | 없음 | 매우 높음 |
| Blue/Green | 빠름 | 없음 | 매우 높음 |
4. 통합 모니터링 및 로깅
# CloudWatch 커스텀 메트릭 (Python 예제)
import boto3
cloudwatch = boto3.client('cloudwatch')
def put_custom_metric(metric_name, value, unit='Count'):
cloudwatch.put_metric_data(
Namespace='MyApp/Performance',
MetricData=[
{
'MetricName': metric_name,
'Value': value,
'Unit': unit,
'Dimensions': [
{
'Name': 'Environment',
'Value': 'production'
}
]
}
]
)
# 사용 예
put_custom_metric('API_Response_Time', 250, 'Milliseconds')
put_custom_metric('Active_Users', 150, 'Count')
❌ Elastic Beanstalk의 주요 단점
1. 제한된 커스터마이징
# 허용되지 않는 시스템 변경사항들
sudo systemctl disable some-service # 재부팅 시 복원됨
sudo iptables -A INPUT -p tcp --dport 22 -j DROP # 설정이 덮어씌워짐
sudo rm -rf /var/log/* # 로그 관리가 제한됨
우회 방법 (제한적):
# .ebextensions/custom-config.config
commands:
01_custom_setup:
command: |
# 제한된 시스템 설정만 가능
echo "custom-setting=true" >> /etc/environment
container_commands:
01_after_deploy:
command: |
# 애플리케이션 배포 후 실행
python manage.py collectstatic --noinput
2. 벤더 락인 (Vendor Lock-in)
# Beanstalk 종속적인 코드 예제
import os
# 환경 변수는 Beanstalk 콘솔에서만 관리 가능
DATABASE_URL = os.environ.get('RDS_DB_URL') # Beanstalk 전용
REDIS_URL = os.environ.get('ELASTICACHE_CONFIG_ENDPOINT')
# 다른 플랫폼으로 이전 시 수정 필요
if 'AWS_EXECUTION_ENV' in os.environ:
# Beanstalk 환경에서만 실행
import awsebcli
3. 비용 투명성 부족
# 숨겨진 비용 요소들
Resources:
- EC2 인스턴스 (주요 비용)
- Load Balancer ($18/월 기본)
- CloudWatch 로그 ($0.50/GB)
- S3 버킷 (배포 아티팩트)
- Auto Scaling 추가 인스턴스
- 데이터 전송 비용
4. 디버깅의 어려움
# 로그 확인 방법들
eb logs # 기본 로그만 확인 가능
eb ssh # 직접 인스턴스 접근 (제한적)
# 고급 디버깅이 어려운 상황들
- 네트워크 연결 문제
- 시스템 레벨 에러
- 퍼포먼스 병목 지점
- 메모리 누수 추적
🎯 언제 Elastic Beanstalk을 사용해야 할까?
1. 스타트업 및 소규모 팀 (2-10명)
# 간단한 Django 애플리케이션 예제
# requirements.txt
Django==4.2.0
psycopg2-binary==2.9.5
redis==4.5.1
celery==5.2.7
# application.py (Beanstalk 진입점)
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myapp.settings')
application = get_wsgi_application()
적합한 이유:
- 인프라 전담 인력 없음
- 빠른 프로토타이핑 필요
- 초기 비용 최소화
- 개발에 집중하고 싶음
2. MVP(Minimum Viable Product) 개발
# 최소한의 설정으로 빠른 배포
option_settings:
aws:autoscaling:launchconfiguration:
InstanceType: t3.micro # 프리티어
aws:autoscaling:asg:
MinSize: 1
MaxSize: 3
aws:elasticbeanstalk:environment:
EnvironmentType: LoadBalanced
예상 초기 비용: $10-30/월
3. 교육 및 실험 프로젝트
# 학습용 Flask 애플리케이션
from flask import Flask, render_template
import os
application = Flask(__name__)
@application.route('/')
def hello():
return f"Hello from Beanstalk! Environment: {os.environ.get('ENV_TYPE', 'development')}"
@application.route('/health')
def health_check():
return {'status': 'healthy', 'version': '1.0.0'}
if __name__ == '__main__':
application.run(debug=True)
4. 레거시 마이그레이션
# 기존 온프레미스 애플리케이션 마이그레이션
# 1단계: Lift & Shift
eb init legacy-app --platform "Python 3.9"
eb create production --instance-type t3.large
# 2단계: 점진적 클라우드 네이티브 전환
# - RDS 연동
# - ElastiCache 추가
# - S3 스토리지 활용
🚫 언제 Elastic Beanstalk을 피해야 할까?
1. 대규모 엔터프라이즈 (100+ 개발자)
# 복잡한 마이크로서비스 아키텍처
services:
api-gateway:
instances: 5-20
user-service:
instances: 10-50
payment-service:
instances: 5-30
notification-service:
instances: 3-15
analytics-service:
instances: 2-10
# Beanstalk으로 관리하기 어려운 이유:
# - 서비스 간 복잡한 네트워킹
# - 세밀한 리소스 제어 필요
# - 다양한 배포 전략 요구
# - 고급 모니터링 및 트레이싱
대안: EKS, ECS, EC2 직접 관리
2. 고성능 요구사항
# 고성능이 필요한 시나리오들
scenarios = {
'real_time_trading': {
'latency_requirement': '<1ms',
'throughput': '100,000+ TPS',
'availability': '99.99%'
},
'game_backend': {
'latency_requirement': '<10ms',
'concurrent_users': '50,000+',
'custom_protocols': 'UDP, WebSocket'
},
'ml_inference': {
'gpu_requirement': 'NVIDIA V100/A100',
'memory': '32GB+',
'custom_drivers': 'CUDA, cuDNN'
}
}
3. 특수한 보안 요구사항
# 고급 보안 설정이 필요한 경우
security_requirements:
- 커스텀 암호화 엔진
- 특정 컴플라이언스 (HIPAA, PCI-DSS)
- 네트워크 세그멘테이션
- 커스텀 방화벽 규칙
- 특수 로깅 요구사항
💰 비용 분석 및 최적화
1. 규모별 예상 비용
# 월별 비용 계산기 (Python)
def calculate_monthly_cost(environment_type, traffic_level):
costs = {
'development': {
'low': {'instance': 8, 'alb': 18, 'storage': 5, 'total': 31},
'medium': {'instance': 25, 'alb': 18, 'storage': 10, 'total': 53},
},
'production': {
'low': {'instance': 50, 'alb': 18, 'storage': 15, 'total': 83},
'medium': {'instance': 150, 'alb': 18, 'storage': 25, 'total': 193},
'high': {'instance': 400, 'alb': 18, 'storage': 50, 'total': 468},
}
}
return costs[environment_type][traffic_level]
# 사용 예
dev_cost = calculate_monthly_cost('development', 'low')
print(f"개발 환경 비용: ${dev_cost['total']}/월")
prod_cost = calculate_monthly_cost('production', 'medium')
print(f"운영 환경 비용: ${prod_cost['total']}/월")
2. 비용 최적화 전략
# .ebextensions/cost-optimization.config
option_settings:
# 스팟 인스턴스 활용 (최대 90% 절약)
aws:ec2:instances:
EnableSpot: true
SpotFleetOnDemandBase: 1
SpotFleetOnDemandPercentage: 20
# 예약 인스턴스 적용
aws:autoscaling:launchconfiguration:
InstanceType: t3.medium # 예약 인스턴스 구매
# 스케줄링 기반 스케일링
aws:autoscaling:scheduledaction:
MinSize: 1 # 야간/주말 최소화
MaxSize: 5
DesiredCapacity: 2
# 비용 모니터링 스크립트
import boto3
from datetime import datetime, timedelta
def get_beanstalk_costs(app_name, days=30):
"""Beanstalk 애플리케이션 비용 조회"""
ce = boto3.client('ce')
end_date = datetime.now().strftime('%Y-%m-%d')
start_date = (datetime.now() - timedelta(days=days)).strftime('%Y-%m-%d')
response = ce.get_cost_and_usage(
TimePeriod={
'Start': start_date,
'End': end_date
},
Granularity='DAILY',
Metrics=['BlendedCost'],
GroupBy=[
{'Type': 'DIMENSION', 'Key': 'SERVICE'}
],
Filter={
'Dimensions': {
'Key': 'RESOURCE_ID',
'Values': [app_name],
'MatchOptions': ['CONTAINS']
}
}
)
return response['ResultsByTime']
# 사용 예
costs = get_beanstalk_costs('my-app')
for day_cost in costs:
date = day_cost['TimePeriod']['Start']
amount = day_cost['Total']['BlendedCost']['Amount']
print(f"{date}: ${float(amount):.2f}")
🔧 실전 구성 예제
1. Django 애플리케이션 설정
# settings/production.py
import os
from .base import *
# Beanstalk 환경 변수
DEBUG = False
ALLOWED_HOSTS = [os.environ.get('ALLOWED_HOSTS', '').split(',')]
# 데이터베이스 (RDS)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': os.environ.get('RDS_DB_NAME'),
'USER': os.environ.get('RDS_USERNAME'),
'PASSWORD': os.environ.get('RDS_PASSWORD'),
'HOST': os.environ.get('RDS_HOSTNAME'),
'PORT': os.environ.get('RDS_PORT'),
}
}
# 캐시 (ElastiCache)
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': f"redis://{os.environ.get('ELASTICACHE_ENDPOINT')}:6379/1",
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
}
}
}
# 스토리지 (S3)
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3StaticStorage'
AWS_STORAGE_BUCKET_NAME = os.environ.get('S3_BUCKET_NAME')
AWS_S3_REGION_NAME = os.environ.get('AWS_DEFAULT_REGION')
# 로깅
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'cloudwatch': {
'level': 'INFO',
'class': 'watchtower.CloudWatchLogsHandler',
'log_group': f"/aws/elasticbeanstalk/{os.environ.get('APP_NAME', 'myapp')}/application",
},
},
'loggers': {
'django': {
'handlers': ['cloudwatch'],
'level': 'INFO',
'propagate': True,
},
},
}
2. Node.js Express 애플리케이션
// app.js
const express = require('express');
const redis = require('redis');
const { Pool } = require('pg');
const app = express();
const port = process.env.PORT || 3000;
// Redis 클라이언트 (ElastiCache)
const redisClient = redis.createClient({
host: process.env.ELASTICACHE_ENDPOINT,
port: 6379
});
// PostgreSQL 연결 (RDS)
const pool = new Pool({
host: process.env.RDS_HOSTNAME,
database: process.env.RDS_DB_NAME,
user: process.env.RDS_USERNAME,
password: process.env.RDS_PASSWORD,
port: process.env.RDS_PORT,
max: 20,
idleTimeoutMillis: 30000,
connectionTimeoutMillis: 2000,
});
// 헬스체크 엔드포인트 (Beanstalk 필수)
app.get('/health', async (req, res) => {
try {
// DB 연결 확인
await pool.query('SELECT 1');
// Redis 연결 확인
await redisClient.ping();
res.status(200).json({
status: 'healthy',
timestamp: new Date().toISOString(),
environment: process.env.NODE_ENV
});
} catch (error) {
res.status(500).json({
status: 'unhealthy',
error: error.message
});
}
});
// API 엔드포인트
app.get('/api/users/:id', async (req, res) => {
const userId = req.params.id;
const cacheKey = `user:${userId}`;
try {
// 캐시에서 먼저 확인
const cached = await redisClient.get(cacheKey);
if (cached) {
return res.json(JSON.parse(cached));
}
// DB에서 조회
const result = await pool.query('SELECT * FROM users WHERE id = $1', [userId]);
const user = result.rows[0];
if (user) {
// 캐시에 저장 (5분)
await redisClient.setex(cacheKey, 300, JSON.stringify(user));
res.json(user);
} else {
res.status(404).json({ error: 'User not found' });
}
} catch (error) {
console.error('Database error:', error);
res.status(500).json({ error: 'Internal server error' });
}
});
app.listen(port, () => {
console.log(`Server running on port ${port}`);
});
module.exports = app;
3. Beanstalk 환경 설정
# .ebextensions/01-main.config
option_settings:
aws:elasticbeanstalk:application:environment:
NODE_ENV: production
APP_NAME: myapp
aws:autoscaling:launchconfiguration:
InstanceType: t3.medium
IamInstanceProfile: aws-elasticbeanstalk-ec2-role
SecurityGroups: sg-12345678
aws:autoscaling:asg:
MinSize: 2
MaxSize: 10
Cooldown: 300
aws:elasticbeanstalk:healthreporting:system:
SystemType: enhanced
HealthCheckSuccessThreshold: Ok
aws:elasticbeanstalk:command:
DeploymentPolicy: RollingWithAdditionalBatch
BatchSizeType: Percentage
BatchSize: 30
aws:elbv2:loadbalancer:
IdleTimeout: 60
aws:elbv2:listener:443:
Protocol: HTTPS
SSLCertificateArns: arn:aws:acm:region:account:certificate/cert-id
files:
"/opt/elasticbeanstalk/hooks/appdeploy/pre/99_install_dependencies.sh":
mode: "000755"
owner: root
group: root
content: |
#!/bin/bash
# 추가 시스템 패키지 설치
yum update -y
yum install -y htop
"/opt/elasticbeanstalk/hooks/appdeploy/post/99_cleanup.sh":
mode: "000755"
owner: root
group: root
content: |
#!/bin/bash
# 배포 후 정리 작업
pm2 reload all
echo "Deployment completed at $(date)" >> /var/log/deployment.log
📊 모니터링 및 알람 설정
1. CloudWatch 커스텀 메트릭
# monitoring.py
import boto3
import psutil
import time
from datetime import datetime
class BeanstalkMonitor:
def __init__(self):
self.cloudwatch = boto3.client('cloudwatch')
self.namespace = 'MyApp/Beanstalk'
def send_system_metrics(self):
"""시스템 메트릭 전송"""
metrics = [
{
'MetricName': 'CPUUtilization',
'Value': psutil.cpu_percent(),
'Unit': 'Percent'
},
{
'MetricName': 'MemoryUtilization',
'Value': psutil.virtual_memory().percent,
'Unit': 'Percent'
},
{
'MetricName': 'DiskUtilization',
'Value': psutil.disk_usage('/').percent,
'Unit': 'Percent'
}
]
self.cloudwatch.put_metric_data(
Namespace=self.namespace,
MetricData=metrics
)
def send_application_metrics(self, response_time, error_count, active_users):
"""애플리케이션 메트릭 전송"""
metrics = [
{
'MetricName': 'ResponseTime',
'Value': response_time,
'Unit': 'Milliseconds'
},
{
'MetricName': 'ErrorCount',
'Value': error_count,
'Unit': 'Count'
},
{
'MetricName': 'ActiveUsers',
'Value': active_users,
'Unit': 'Count'
}
]
self.cloudwatch.put_metric_data(
Namespace=self.namespace,
MetricData=metrics
)
# 사용 예
monitor = BeanstalkMonitor()
# 주기적으로 메트릭 전송
while True:
monitor.send_system_metrics()
time.sleep(60) # 1분마다
2. 알람 설정
# .ebextensions/02-alarms.config
Resources:
CPUAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: !Sub "${AWSEBEnvironmentName}-HighCPU"
AlarmDescription: "CPU utilization is too high"
MetricName: CPUUtilization
Namespace: AWS/EC2
Statistic: Average
Period: 300
EvaluationPeriods: 2
Threshold: 80
ComparisonOperator: GreaterThanThreshold
AlarmActions:
- !Ref SNSTopicArn
ErrorRateAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: !Sub "${AWSEBEnvironmentName}-HighErrorRate"
AlarmDescription: "Error rate is too high"
MetricName: "5XXError"
Namespace: AWS/ApplicationELB
Statistic: Sum
Period: 300
EvaluationPeriods: 2
Threshold: 10
ComparisonOperator: GreaterThanThreshold
ResponseTimeAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: !Sub "${AWSEBEnvironmentName}-HighResponseTime"
AlarmDescription: "Response time is too high"
MetricName: TargetResponseTime
Namespace: AWS/ApplicationELB
Statistic: Average
Period: 300
EvaluationPeriods: 3
Threshold: 2.0
ComparisonOperator: GreaterThanThreshold
🚀 고급 최적화 팁
1. 배포 최적화
#!/bin/bash
# deploy-optimize.sh
# 1. 소스 번들 크기 최소화
echo "Optimizing source bundle..."
rm -rf node_modules/.cache
rm -rf .git
rm -rf tests/
find . -name "*.pyc" -delete
find . -name "__pycache__" -delete
# 2. 의존성 캐싱
echo "Creating requirements hash..."
md5sum requirements.txt > requirements.md5
# 3. 압축 최적화
echo "Creating optimized zip..."
zip -r app.zip . -x "*.git*" "*.DS_Store*" "*/__pycache__/*"
# 4. 배포 실행
eb deploy --staged
2. 성능 튜닝
# .ebextensions/03-performance.config
option_settings:
# WSGI 서버 최적화 (Python)
aws:elasticbeanstalk:container:python:
WSGIPath: application.py
NumProcesses: 4
NumThreads: 20
# Node.js 최적화
aws:elasticbeanstalk:container:nodejs:
NodeCommand: "pm2 start app.js -i max --no-daemon"
NodeVersion: 18.17.0
# 시스템 최적화
commands:
01_kernel_tuning:
command: |
echo 'net.core.somaxconn = 65535' >> /etc/sysctl.conf
echo 'net.ipv4.tcp_max_syn_backlog = 65535' >> /etc/sysctl.conf
sysctl -p
02_ulimit_increase:
command: |
echo '* soft nofile 65535' >> /etc/security/limits.conf
echo '* hard nofile 65535' >> /etc/security/limits.conf
3. 보안 강화
# .ebextensions/04-security.config
option_settings:
aws:elasticbeanstalk:healthreporting:system:
SystemType: enhanced
aws:elbv2:loadbalancer:
SecurityGroups: sg-12345678
ManagedSecurityGroup: sg-87654321
files:
"/etc/nginx/conf.d/security.conf":
mode: "000644"
owner: root
group: root
content: |
# 보안 헤더
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
# 불필요한 헤더 제거
server_tokens off;
# Rate limiting
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
container_commands:
01_setup_ssl:
command: |
# SSL 설정 강화
openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
📋 체크리스트 및 Best Practices
✅ Beanstalk 도입 전 체크리스트
기술적 요구사항:
- 지원 플랫폼인지 확인 (Java, Python, Node.js, etc.)
- 특수한 시스템 설정이 필요하지 않은지 확인
- Auto Scaling이 애플리케이션에 적합한지 확인
- 데이터베이스 요구사항 분석 (RDS 호환성)
팀 및 조직:
- DevOps 전담 인력 부족 여부
- 빠른 배포 및 프로토타이핑 필요성
- 학습 곡선 고려 (EB CLI, 설정 방법)
- 벤더 락인 허용 가능 여부
비용 및 규모:
- 예상 트래픽 및 리소스 요구량
- 월 예산 범위 ($50-500 적정)
- 성장 계획 및 마이그레이션 전략
- 다른 AWS 서비스와의 통합 계획
🎯 성공적인 Beanstalk 운영 팁
- 환경 분리 전략
```bash
환경별 관리
eb create development –cname myapp-dev eb create staging –cname myapp-staging
eb create production –cname myapp-prod
Blue/Green 배포
eb create production-v2 –cname myapp-prod-v2 eb swap production production-v2 # 트래픽 전환
2. **모니터링 및 알람**
```python
# 핵심 메트릭 모니터링
key_metrics = [
'CPUUtilization', # > 80% 알람
'NetworkIn/Out', # 트래픽 패턴 모니터링
'ApplicationELB-TargetResponseTime', # > 2초 알람
'ApplicationELB-HTTPCode-Target-5XX', # 에러율 모니터링
]
- 정기적인 최적화
# 월간 최적화 체크리스트 # 1. 인스턴스 타입 검토 # 2. 오토스케일링 정책 조정 # 3. 비용 분석 및 최적화 # 4. 보안 패치 확인 # 5. 로그 분석 및 성능 튜닝
🎯 결론
Elastic Beanstalk는 적절한 상황에서 사용하면 개발 생산성을 크게 향상시킬 수 있는 훌륭한 서비스입니다. 특히 스타트업이나 소규모 팀에서 빠른 프로토타이핑과 배포가 필요한 경우에 적합합니다.
📊 요약 가이드라인
| 상황 | 추천도 | 이유 |
|---|---|---|
| 스타트업 MVP | ⭐⭐⭐⭐⭐ | 빠른 시장 진입, 낮은 초기 비용 |
| 소규모 팀 프로젝트 | ⭐⭐⭐⭐ | 인프라 관리 부담 최소화 |
| 교육/실험 | ⭐⭐⭐⭐⭐ | 간편한 설정, 학습 효과 |
| 중간 규모 서비스 | ⭐⭐⭐ | 성장 시 제약사항 고려 필요 |
| 대규모 엔터프라이즈 | ⭐⭐ | 커스터마이징 제약, 비용 증가 |
| 마이크로서비스 | ⭐⭐ | 서비스 간 복잡성 관리 어려움 |
💡 핵심 포인트
- 시작은 Beanstalk, 성장하면 마이그레이션 전략 권장
- 비용 모니터링과 성능 측정을 통한 지속적 최적화
- 벤더 락인을 최소화하는 아키텍처 설계
- 팀의 성장과 함께 인프라 전략 진화
다음 포스트에서는 Beanstalk에서 EKS로의 마이그레이션 전략과 실제 경험담을 공유하겠습니다.