본문으로 건너뛰기

FastAPI + MySQL Docker 이미지 (SSL 지원)

FastAPI + MySQL Docker 이미지 (SSL 지원)

목차


📁 파일 구조

fastapi-mysql/
├── Dockerfile # FastAPI MySQL 이미지 빌드 파일 (SSL 인증서 포함)
├── main.py # FastAPI 애플리케이션 (MySQL SSL 연결)
├── requirements.txt # Python 의존성
└── README.md # 이 파일

⚙️ 구성 정보

항목
베이스 이미지python:3.11-slim
포트3000
DB 라이브러리aiomysql (비동기)
프레임워크FastAPI + Uvicorn
SSL 지원✅ AWS RDS CA 인증서 포함

🔧 환경 변수

변수기본값설명
DB_HOSTlocalhostMySQL 호스트 (RDS 엔드포인트)
DB_PORT3306MySQL 포트
DB_USERadminDB 사용자
DB_PASSWORDpasswordDB 비밀번호
DB_NAMEpista데이터베이스 이름
DB_USE_SSLtrueSSL 사용 여부
SSL_CA_PATH/certs/global-bundle.pemSSL CA 인증서 경로

🔐 SSL 연결 정보

이 이미지는 AWS RDS MySQL SSL 연결을 지원합니다:


🚀 EC2 실행

1. 이미지 빌드

docker build -t pista-fastapi-mysql:latest .

2. 컨테이너 실행 (RDS SSL 연결)

docker run -d -p 3000:3000 \
-e DB_HOST=<RDS_ENDPOINT> \
-e DB_PORT=3306 \
-e DB_USER=admin \
-e DB_PASSWORD=<DB_PASSWORD> \
-e DB_USE_SSL=true \
--name pista-fastapi-mysql pista-fastapi-mysql:latest

3. 접속 확인

curl http://localhost:3000/api/health
# 응답: {"status":"healthy","db":"connected"}

curl http://localhost:3000/api/db/test
# 응답: {"mysql_version":"8.0.x","database":"pista",...}

4. 로그 확인

docker logs pista-fastapi-mysql
# 출력: Connected to MySQL: project-db...rds.amazonaws.com:3306/pista (with SSL)

☁️ ECR 푸시

# 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

# 이미지 태그 & 푸시
docker tag pista-fastapi-mysql:latest <ACCOUNT_ID>.dkr.ecr.ap-northeast-2.amazonaws.com/pista-fastapi-mysql:latest
docker push <ACCOUNT_ID>.dkr.ecr.ap-northeast-2.amazonaws.com/pista-fastapi-mysql:latest

5. 연결 테스트 (로컬)

상위 디렉토리에 있는 스크립트를 사용하여 로컬에서 RDS SSL 연결을 빠르게 테스트할 수 있습니다.

# 사용법: ../../mysql-ssl-connect.sh [HOST] [USER] [PASSWORD]
../../mysql-ssl-connect.sh team1-project-rds-mysql...amazonaws.com admin mypassword

🔗 ECS 태스크 정의 환경 변수 설정

ECS 콘솔에서 태스크 정의 생성 시:

  • 환경 변수 섹션에서 DB_HOST, DB_USER, DB_PASSWORD, DB_NAME 설정
  • 또는 Secrets Manager를 사용하여 민감 정보 관리 (권장)
{
"environment": [
{ "name": "DB_HOST", "value": "<RDS_ENDPOINT>" },
{ "name": "DB_PORT", "value": "3306" },
{ "name": "DB_USER", "value": "admin" },
{ "name": "DB_NAME", "value": "pista" },
{ "name": "DB_USE_SSL", "value": "true" }
],
"secrets": [
{
"name": "DB_PASSWORD",
"valueFrom": "arn:aws:secretsmanager:ap-northeast-2:ACCOUNT_ID:secret:rds/pista-password"
}
]
}

🔧 트러블슈팅

SSL 연결 실패 시

# SSL 비활성화 (테스트용, 권장하지 않음)
docker run -d -p 3000:3000 \
-e DB_HOST=... \
-e DB_USE_SSL=false \
--name pista-fastapi-mysql pista-fastapi-mysql:latest

인증서 경로 변경

# 커스텀 인증서 사용
docker run -d -p 3000:3000 \
-v /path/to/custom-cert.pem:/certs/custom.pem \
-e SSL_CA_PATH=/certs/custom.pem \
--name pista-fastapi-mysql pista-fastapi-mysql:latest

관련 문서

그래프 뷰

그래프 데이터 로딩 중…
현재: FastAPI + MySQL Docker 이미지 (SSL 지원)
노드 클릭 → 이동 · 드래그 → 위치 조정