본문으로 건너뛰기

AWS ECS + RDS - Nginx + FastAPI + MySQL (Bridge Mode) 템플릿

🔧 템플릿 사용법: <PREFIX>, <REGION>, <ACCOUNT_ID> 등 플레이스홀더를 실제 값으로 교체하세요.

플레이스홀더 목록

플레이스홀더설명예시
<PREFIX>리소스 접두사team1-project, pista
<REGION>AWS 리전ap-northeast-2, ap-southeast-1
<ACCOUNT_ID>AWS 계정 ID123456789012
<AZ1>가용 영역 1ap-northeast-2a
<AZ2>가용 영역 2ap-northeast-2b
<VPC_CIDR>VPC CIDR10.0.0.0/16
<DB_PASSWORD>RDS 비밀번호(Secrets Manager 권장)
<DB_NAME>초기 DB 이름mydb

아키텍처 개요

아키텍처 요약

구성 요소설명
네트워크Public 서브넷(ALB) + Private 서브넷(ECS, RDS) 2-tier
컨테이너nginx(리버스 프록시) + fastapi(백엔드) bridge 모드
데이터베이스RDS MySQL (Multi-AZ 선택)
통신ALB → nginx → fastapi (links) → RDS

bridge 모드 + links + RDS: nginx → fastapi → MySQL


선행 작업


목차


구성 프로세스

단계작업설명콘솔 경로
1VPC/Subnet 생성VPC, 서브넷(Public/Private), IGW, NAT 구성VPC > VPC 생성
2보안 그룹 생성ALB용, ECS용, RDS용 보안 그룹 생성VPC > 보안 그룹
3RDS 서브넷 그룹Private 서브넷 2개로 DB 서브넷 그룹 생성RDS > 서브넷 그룹
4RDS 인스턴스 생성MySQL 배포RDS > 데이터베이스 생성
5ECR 리포지토리 생성<PREFIX>-web, <PREFIX>-fastapi-mysqlECR > 리포지토리 생성
6Docker 이미지 빌드 & 푸시nginx, fastapi-mysql 이미지 빌드EC2 SSH 접속
7ECS 클러스터 생성EC2 기반 클러스터 생성ECS > 클러스터 생성
8태스크 정의 생성<PREFIX>-web + <PREFIX>-fastapi-mysqlECS > 태스크 정의
9⭐ 대상 그룹 생성<PREFIX>-tg-nginx 1개만 생성EC2 > 대상 그룹
10⭐ ALB 생성대상 그룹 연결EC2 > 로드 밸런서
11ECS 서비스 생성단일 서비스 생성ECS > 서비스 생성
12점검Health Check, DB 연결 확인-

⚠️ bridge 모드: ALB와 대상 그룹을 서비스 생성 전에 미리 생성 필요


보안 그룹

리소스(<PREFIX>-sg-alb)

변수소스
보안 그룹 이름<PREFIX>-sg-alb-
인바운드 규칙TCP 800.0.0.0/0
인바운드 규칙TCP 4430.0.0.0/0
아웃바운드 규칙모든 트래픽0.0.0.0/0

리소스(<PREFIX>-sg-ecs)

변수소스
보안 그룹 이름<PREFIX>-sg-ecs-
인바운드 규칙TCP 32768-65535<PREFIX>-sg-alb
인바운드 규칙TCP 22관리자 IP
아웃바운드 규칙모든 트래픽0.0.0.0/0
설명동적 포트 매핑 (bridge 모드)-

리소스(<PREFIX>-sg-rds) ⭐

변수소스
보안 그룹 이름<PREFIX>-sg-rds-
인바운드 규칙TCP 3306<PREFIX>-sg-ecs
아웃바운드 규칙모든 트래픽0.0.0.0/0
설명ECS에서만 MySQL 접근 허용-

💡 RDS 보안 그룹은 ECS 보안 그룹에서만 접근 허용


RDS (MySQL)

DB 서브넷 그룹

RDS > 서브넷 그룹 > DB 서브넷 그룹 생성

변수
이름<PREFIX>-db-subnet-group
설명DB Subnet Group
VPC<PREFIX>-vpc
가용 영역<AZ1>, <AZ2>
서브넷<PREFIX>-subnet-private1, <PREFIX>-subnet-private2

RDS 인스턴스 생성

구분변수
엔진 옵션엔진 유형MySQL
엔진 버전MySQL 8.0.x
템플릿템플릿개발/테스트 또는 프로덕션
가용성배포 옵션Multi-AZ (선택)
설정DB 인스턴스 식별자<PREFIX>-rds-mysql
마스터 사용자 이름admin
마스터 암호<DB_PASSWORD>
인스턴스DB 인스턴스 클래스db.t3.micro / db.t3.small
스토리지스토리지 유형gp3
할당된 스토리지20 GiB
연결VPC<PREFIX>-vpc
DB 서브넷 그룹<PREFIX>-db-subnet-group
퍼블릭 액세스❌ (아니요)
VPC 보안 그룹<PREFIX>-sg-rds
추가 구성초기 데이터베이스 이름<DB_NAME>

RDS 엔드포인트

<PREFIX>-rds-mysql.xxxxxxxxxx.<REGION>.rds.amazonaws.com

ECR 이미지 준비

이미지소스 경로포트
nginxECR/images/fastapi-mysql/nginx/80
fastapi-mysqlECR/images/fastapi-mysql/3000

빌드 및 푸시

# ECR 로그인
aws ecr get-login-password --region <REGION> | \
docker login --username AWS --password-stdin <ACCOUNT_ID>.dkr.ecr.<REGION>.amazonaws.com

# fastapi-mysql 빌드 및 푸시
cd ECR/images/fastapi-mysql
docker build -t <PREFIX>-fastapi-mysql .
docker tag <PREFIX>-fastapi-mysql:latest <ACCOUNT_ID>.dkr.ecr.<REGION>.amazonaws.com/<PREFIX>-fastapi-mysql:latest
docker push <ACCOUNT_ID>.dkr.ecr.<REGION>.amazonaws.com/<PREFIX>-fastapi-mysql:latest

# nginx 빌드 및 푸시
cd nginx
docker build -t <PREFIX>-web .
docker tag <PREFIX>-web:latest <ACCOUNT_ID>.dkr.ecr.<REGION>.amazonaws.com/<PREFIX>-web:latest
docker push <ACCOUNT_ID>.dkr.ecr.<REGION>.amazonaws.com/<PREFIX>-web:latest

클러스터 생성

리소스(<PREFIX>-cluster)

구분항목
클러스터 이름클러스터 이름<PREFIX>-cluster
인프라컴퓨팅 용량 확보 방법EC2 자체 관리형 ✅
Auto Scaling 그룹새 ASG 생성
프로비저닝 모델온디맨드
AMIAmazon Linux 2023
EC2 인스턴스 유형t3.medium
EC2 인스턴스 역할ecsInstanceRole
원하는 용량 (최소/최대)2 / 3
네트워크VPC<PREFIX>-vpc
서브넷<PREFIX>-subnet-private1, <PREFIX>-subnet-private2
보안 그룹<PREFIX>-sg-ecs
퍼블릭 IP 자동 지정

태스크 정의

인프라 요구 사항

구분항목
태스크 정의 구성패밀리<PREFIX>-task
인프라 요구 사항시작 유형Amazon EC2 인스턴스 ✅
네트워크 모드bridge
CPU0.75 vCPU
메모리1.5 GB
태스크 실행 역할ecsTaskExecutionRole

컨테이너 1: <PREFIX>-web (nginx)

구분항목
컨테이너이름<PREFIX>-web
이미지 URI<ACCOUNT_ID>.dkr.ecr.<REGION>.amazonaws.com/<PREFIX>-web:latest
포트 매핑호스트 포트0 (동적)
컨테이너 포트80
필수 컨테이너
네트워크 설정링크<PREFIX>-fastapi-mysql:fastapi

컨테이너 2: <PREFIX>-fastapi-mysql

구분항목
컨테이너이름<PREFIX>-fastapi-mysql
이미지 URI<ACCOUNT_ID>.dkr.ecr.<REGION>.amazonaws.com/<PREFIX>-fastapi-mysql:latest
포트 매핑호스트 포트0 (동적)
컨테이너 포트3000
필수 컨테이너
환경 변수DB_HOST<PREFIX>-rds-mysql.xxx.<REGION>.rds.amazonaws.com
DB_PORT3306
DB_USERadmin
DB_PASSWORD<DB_PASSWORD>
DB_NAME<DB_NAME>

⚠️ 보안 권장: DB_PASSWORDSecrets Manager 사용 권장


대상 그룹

💡 links 방식: nginx가 fastapi로 프록시하므로 대상 그룹은 nginx 1개만 필요

리소스(<PREFIX>-tg-nginx)

변수
설정-대상 유형인스턴스
설정-대상 그룹 이름<PREFIX>-tg-nginx
설정-프로토콜HTTP
설정-포트80
설정-VPC<PREFIX>-vpc
상태 검사-상태 검사 경로/

로드 밸런서

리소스(<PREFIX>-alb)

변수
기본 구성-로드 밸런서 이름<PREFIX>-alb
기본 구성-체계인터넷 경계
네트워크 매핑-VPC<PREFIX>-vpc
az1<PREFIX>-subnet-public1
az2<PREFIX>-subnet-public2
보안 그룹<PREFIX>-sg-alb
리스너 및 라우팅-대상그룹<PREFIX>-tg-nginx

서비스 정의

리소스(<PREFIX>-service)

구분항목
서비스 세부 정보서비스 이름<PREFIX>-service
태스크 정의 패밀리<PREFIX>-task
환경컴퓨팅 옵션용량 공급자 전략
배포 구성원하는 태스크2
로드 밸런싱로드 밸런서<PREFIX>-alb (기존)
대상 그룹<PREFIX>-tg-nginx (기존)
컨테이너 선택<PREFIX>-web (포트 80)

점검

  • RDS 인스턴스 상태 확인 (Available)
  • RDS 엔드포인트 복사
  • ECR 이미지 푸시 확인
  • ECS 클러스터 인스턴스 등록 확인
  • 대상 그룹 Health Check 통과 확인
  • ALB DNS로 접속 테스트
    • http://<ALB-DNS>/ → nginx 정적 페이지
    • http://<ALB-DNS>/api/health → DB 연결 확인
    • http://<ALB-DNS>/api/db/test → MySQL 버전 확인
  • nginx → fastapi → RDS 통신 테스트

Troubleshooting

증상원인해결
DB 연결 실패보안 그룹 미허용<PREFIX>-sg-rds<PREFIX>-sg-ecs 허용 확인
RDS 접근 불가서브넷 라우팅Private 서브넷의 NAT 라우팅 확인
환경 변수 미적용태스크 정의ECS 태스크 정의에서 환경 변수 확인
Health Check 실패fastapi 에러CloudWatch 로그 확인
502 Bad Gateway대상 그룹 타입 불일치Instance 타입 사용 확인
links 통신 실패링크 설정 누락태스크 정의에서 links 확인

관련 문서

그래프 뷰

그래프 데이터 로딩 중…
현재: AWS ECS + RDS - Nginx + FastAPI + MySQL (Bridge Mode) 템플릿
노드 클릭 → 이동 · 드래그 → 위치 조정