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_HOST | localhost | MySQL 호스트 (RDS 엔드포인트) |
DB_PORT | 3306 | MySQL 포트 |
DB_USER | admin | DB 사용자 |
DB_PASSWORD | password | DB 비밀번호 |
DB_NAME | pista | 데이터베이스 이름 |
DB_USE_SSL | true | SSL 사용 여부 |
SSL_CA_PATH | /certs/global-bundle.pem | SSL CA 인증서 경로 |
🔐 SSL 연결 정보
이 이미지는 AWS RDS MySQL SSL 연결을 지원합니다:
- CA 인증서:
/certs/global-bundle.pem(빌드 시 자동 다운로드) - 인증서 출처: https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem
- SSL 모드: VERIFY_IDENTITY (호스트명 검증 + 인증서 검증)
🚀 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