Django에서 static과 media 파일을 AWS S3로 올리고, EC2가 아닌 S3에서 직접 서빙하도록 설정하는 방법을 정리했습니다.
Elastic Beanstalk으로 배포한 경우에도 적용 가능하며, 정적 웹사이트 호스팅 + CORS 설정 + Django 설정 순으로 정리해보았습니다.
✅ 1. S3 버킷 만들기
- AWS S3 콘솔 접속
- "버킷 만들기" 클릭
- 버킷 이름: 전 세계 고유 (예: my-django-blog-files)
- 공개 접근 차단 해제
- "모든 공개 액세스 차단" → 체크 해제
- 경고 메시지 → 확인 후 계속 진행
✅ 2. 정적 웹사이트 호스팅 활성화
- 버킷 > 속성(Properties) 탭 클릭
- 아래로 스크롤 → Static website hosting
- "정적 웹사이트 호스팅 사용" 선택
- 인덱스/에러 문서는 의미 없는 값 아무거나 (예: index.html, error.html)
- 저장
✅ 3. CORS 설정
- 권한(Permissions) 탭 클릭
- 교차 출처 리소스 공유(CORS) > 편집 클릭
- 아래 JSON 붙여넣기:
[
{
"AllowedHeaders": ["*"],
"AllowedMethods": ["GET", "POST", "PUT"],
"AllowedOrigins": ["*"],
"ExposeHeaders": []
}
]
- 저장
✅ 4. Django 설정 (settings.py)
필요 패키지 설치:
pip install boto3 django-storages
설정 파일에 추가:
INSTALLED_APPS += ['storages']
AWS_ACCESS_KEY_ID = 'your-access-key'
AWS_SECRET_ACCESS_KEY = 'your-secret-key'
AWS_STORAGE_BUCKET_NAME = 'your-bucket-name'
AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com'
# 정적 파일
STATIC_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/static/'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
# 미디어 파일
MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/media/'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
※ .env 환경 변수로 키를 분리해 관리하는 걸 권장합니다.
✅ 5. collectstatic 실행 & 테스트
python manage.py collectstatic
- 정적 파일이 S3 버킷 /static/ 경로에 올라가는지 확인
- Django Admin 등에서 이미지 업로드 시 /media/로 잘 저장되는지 확인
✅ 6. 최종 확인
- 이미지 주소: https://your-bucket-name.s3.amazonaws.com/media/yourfile.jpg
- 정적 파일 주소: https://your-bucket-name.s3.amazonaws.com/static/css/styles.css
- 브라우저에서 접근이 가능해야 합니다.
🧩 보너스 팁: Elastic Beanstalk 연동 시
.ebextensions 디렉토리에 static-files.config 같은 설정이 있다면 다음처럼 수정하세요:
option_settings:
aws:elasticbeanstalk:environment:proxy:staticfiles:
/static: staticfiles
/media: media
하지만 S3로 완전히 이전했다면 이 설정은 생략하거나 최소화해도 됩니다.
✅ 마무리
정적 파일과 미디어 파일을 S3에서 서빙하면:
- 서버 부하가 줄고
- 파일 전송 속도가 빨라지고
- 유지보수가 편해집니다!
collectstatic, 업로드 테스트, URL 접근까지 한 번에 점검해보세요.
궁금한 점이나 오류가 있다면 댓글로 남겨주세요!
'Programming > Django' 카테고리의 다른 글
| 🧪 테스트 주도 개발(TDD) 완벽 가이드 (4) | 2025.08.04 |
|---|---|
| 🐍 [Django 5.2 + S3 연동 에러 기록] STATICFILES_STORAGE가 무시되고 계속 로컬 staticfiles 디렉토리에만 저장될 때 (해결 완료!) (2) | 2025.08.01 |
| 🔍 Django의 wsgi.py와 django.conf – 배포 입문자를 위한 핵심 정리! (2) | 2025.07.30 |
| 💡 getenv란? 환경 변수와 Django 설정의 연결고리 (3) | 2025.07.30 |
| Django 프로젝트에서 데이터베이스는 어떻게 선택해야 할까? 🧠 (0) | 2025.07.30 |