본문 바로가기
Programming/Django

Django 프로젝트에 AWS S3 연동하기 (정적/미디어 파일 서빙 완전 정복)

by Mandy's 2025. 7. 31.

Django에서 static과 media 파일을 AWS S3로 올리고, EC2가 아닌 S3에서 직접 서빙하도록 설정하는 방법을 정리했습니다.
Elastic Beanstalk으로 배포한 경우에도 적용 가능하며, 정적 웹사이트 호스팅 + CORS 설정 + Django 설정 순으로 정리해보았습니다.


✅ 1. S3 버킷 만들기

  1. AWS S3 콘솔 접속
  2. "버킷 만들기" 클릭
  3. 버킷 이름: 전 세계 고유 (예: my-django-blog-files)
  4. 공개 접근 차단 해제
    • "모든 공개 액세스 차단" → 체크 해제
    • 경고 메시지 → 확인 후 계속 진행

✅ 2. 정적 웹사이트 호스팅 활성화

  1. 버킷 > 속성(Properties) 탭 클릭
  2. 아래로 스크롤 → Static website hosting
  3. "정적 웹사이트 호스팅 사용" 선택
  4. 인덱스/에러 문서는 의미 없는 값 아무거나 (예: index.html, error.html)
  5. 저장

✅ 3. CORS 설정

  1. 권한(Permissions) 탭 클릭
  2. 교차 출처 리소스 공유(CORS) > 편집 클릭
  3. 아래 JSON 붙여넣기:
[
  {
    "AllowedHeaders": ["*"],
    "AllowedMethods": ["GET", "POST", "PUT"],
    "AllowedOrigins": ["*"],
    "ExposeHeaders": []
  }
]
  1. 저장

✅ 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. 최종 확인


🧩 보너스 팁: Elastic Beanstalk 연동 시

.ebextensions 디렉토리에 static-files.config 같은 설정이 있다면 다음처럼 수정하세요:

option_settings:
  aws:elasticbeanstalk:environment:proxy:staticfiles:
    /static: staticfiles
    /media: media

하지만 S3로 완전히 이전했다면 이 설정은 생략하거나 최소화해도 됩니다.


✅ 마무리

정적 파일과 미디어 파일을 S3에서 서빙하면:

  • 서버 부하가 줄고
  • 파일 전송 속도가 빨라지고
  • 유지보수가 편해집니다!

collectstatic, 업로드 테스트, URL 접근까지 한 번에 점검해보세요.
궁금한 점이나 오류가 있다면 댓글로 남겨주세요!