본문으로 건너뛰기

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

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

아키텍처 개요

아키텍처 요약

구성 요소설명
네트워크Public 서브넷(ALB) + Private 서브넷(ECS, RDS) 2-tier
컨테이너nginx(리버스 프록시) + fastapi(백엔드) bridge 모드
데이터베이스RDS Aurora 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 Multi-AZ 배포RDS > 데이터베이스 생성
5ECR 리포지토리 생성team1-project-web, team1-project-fastapi-mysql 리포지토리ECR > 리포지토리 생성
6Docker 이미지 빌드 & 푸시nginx, fastapi-mysql 이미지 빌드EC2 SSH 접속
7ECS 클러스터 생성EC2 기반 클러스터 생성ECS > 클러스터 생성
8태스크 정의 생성team1-project-web + team1-project-fastapi-mysql (환경 변수)ECS > 태스크 정의
9⭐ 대상 그룹 생성team1-project-tg-nginx 1개만 생성EC2 > 대상 그룹
10⭐ ALB 생성대상 그룹 연결EC2 > 로드 밸런서
11ECS 서비스 생성단일 서비스 (team1-project-tg-nginx 연결)ECS > 서비스 생성
12점검Health Check, DB 연결 확인-

보안 그룹

리소스(team1-project-sg-alb)

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

리소스(team1-project-sg-ecs)

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

리소스(team1-project-sg-rds) ⭐

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

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


RDS (MySQL Multi-AZ)

DB 서브넷 그룹

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

변수
이름team1-project-db-subnet-group
설명Pista RDS Subnet Group
VPCteam1-project-vpc
가용 영역ap-northeast-2a, ap-northeast-2b
서브넷team1-project-subnet-private1-1a, team1-project-subnet-private2-1b

⚠️ Multi-AZ를 위해 최소 2개 AZ의 서브넷 필요

RDS 인스턴스 생성

RDS > 데이터베이스 > 데이터베이스 생성

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

RDS 엔드포인트

생성 후 확인:

team1-project-rds-mysql.xxxxxxxxxx.ap-northeast-2.rds.amazonaws.com

💡 이 엔드포인트를 ECS 태스크 정의의 환경 변수 DB_HOST에 설정


ECR 이미지 준비

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

빌드 및 푸시

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

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

클러스터 생성

리소스(team1-project-cluster-rds)

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

태스크 정의

인프라 요구 사항

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

컨테이너 1: team1-project-web (nginx)

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

컨테이너 2: team1-project-fastapi-mysql ⭐

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

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


대상 그룹

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

리소스(team1-project-tg-nginx)

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

로드 밸런서

리소스(team1-project-alb)

변수
기본 구성-로드 밸런서 이름team1-project-alb
기본 구성-체계인터넷 경계
네트워크 매핑-VPCteam1-project-vpc
az1team1-project-subnet-public1-1a
az2team1-project-subnet-public2-1b
보안 그룹team1-project-sg-alb
리스너 및 라우팅-대상그룹team1-project-tg-nginx

서비스 정의

리소스(team1-project-service)

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

Not Working

증상원인해결
DB 연결 실패보안 그룹 미허용team1-project-sg-rds에 team1-project-sg-ecs 허용 확인
RDS 접근 불가서브넷 라우팅1. Private 서브넷3개가 각각의 가용영역에 설정
2. RDS 서브넷 그룹의 private subnet으로만 설정
환경 변수 미적용태스크 정의ECS 태스크 정의에서 환경 변수 확인
Health Check 실패fastapi 에러CloudWatch 로그 확인

관련 문서

그래프 뷰

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