AWS #5 SiLok 프로젝트 ECS 파이프라인 빌드 #
#2026-02-08
#1
StudyNote와 동일한 방식으로 ECS 파이프라인을 빌드했고 파일 구조는 아래와 같다
VitalTime/
├── backend/Dockerfile # Python 3.11 + ML libs, 포트 8001
├── frontend/
│ ├── Dockerfile # nginx:alpine, 정적 파일 서빙
│ ├── nginx.conf # SPA 라우팅 + 캐싱
│ └── docker-entrypoint.sh # 런타임 config.js 생성 (API키 주입)
├── docker-compose.yml # 로컬: backend + frontend + postgres
├── .github/workflows/deploy.yml # CI/CD: test → ECR push → ECS 배포
├── .aws/
│ ├── task-definition-backend.json # Fargate 1vCPU/4GB (ML용)
│ └── task-definition-frontend.json # Fargate 0.25vCPU/512MB
└── terraform/main.tf # VPC, ECS, ALB, ECR, RDS PostgreSQL
차이점은 아래와같다고 함.
- 백엔드: CPU 1024 / 메모리 4096 (tensorflow + torch 때문에 더 큰 리소스)
- RDS PostgreSQL 추가 (db.t3.micro, 14버전)
- SSM Parameter Store로 DATABASE_URL, OPENAI_API_KEY 관리
- ALB 라우팅: /api/*, /health, /db-health, /schedule-status → 백엔드
- 프론트엔드: 빌드 없이 정적 파일 복사 (CDN Vue이므로)
- docker-entrypoint.sh로 런타임에 config.js 생성 (Google Maps API 키 등)
그리고 안내받은 배포 순서.
# 1. terraform 초기화 및 인프라 생성
cd VitalTime/terraform
terraform init
terraform plan -var="db_password=mypassword"
terraform apply -var="db_password=mypassword"
# 2. GitHub Secrets 추가
# AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
# 3. SSM에 시크릿 저장
aws ssm put-parameter --name "/vitaltime/OPENAI_API_KEY" --type SecureString --value "sk-..."
aws ssm put-parameter --name "/vitaltime/DATABASE_URL" --type SecureString --value "postgresql+asyncpg://..."
# 4. RDS에 초기 데이터 로드
psql -h <RDS_ENDPOINT> -U myuser -d mydatabase -f data/dump.sql
# 5. main에 push하면 자동 배포
git push origin main
- SSH 키 생성 (없다면):
ssh-keygen -t rsa -b 4096 -f ~/.ssh/vitaltime-bastion -N "" 2. Terraform apply (키 경로 지정):
cd /Users/yshmbid/Documents/home/github/VitalTime/terraform terraform apply -var=“db_password=mypassword” -var=“bastion_public_key=$(cat ~/.ssh/vitaltime-bastion.pub)” 3. SSH 터널링 (apply 완료 후):
RDS 엔드포인트와 Bastion IP 확인 #
terraform output rds_endpoint terraform output bastion_public_ip
SSH 터널 (로컬 5433 → RDS 5432) #
ssh -i ~/.ssh/vitaltime-bastion -L 5433:<RDS_ENDPOINT> ec2-user@<BASTION_IP> -N 4. 다른 터미널에서 데이터 로드:
psql -h localhost -p 5433 -U myuser -d mydatabase -f /Users/yshmbid/Documents/home/github/VitalTime/data/dump.sql
version: '3.8'
services:
postgres_db:
image: pgvector/pgvector:pg16
container_name: my_postgres_db
environment:
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
POSTGRES_DB: mydatabase
ports:
- "5433:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
restart: unless-stopped
volumes:
postgres_data: