사이드 프로젝트를 진행하면서 처음으로 AWS를 통해 배포를 하게 되었습니다. 학교 프로젝트용으로 Google App Engine을 한 번 사용해본 적이 있었지만 주변인들이 Elastic Beanstalk(이하 EB)가 다루기 쉽고 빠르다고 하고, DynamoDB를 사용하고 있고, 아무래도 EB가 대세인 감이 없지 않아 있었기에 별 고민없이 EB로 배포하기로 결정했습니다.
eb create 명령을 실행 시 기본 경로(manage.py가 있는 디렉토리)로 가정하고 배포가 진행되며, 기본 경로가 아닐 경우 다음과 같이 수정해야 한다.
.ebextensions/django.config
option_settings:
aws:elasticbeanstalk:application:environment:
DJANGO_SETTINGS_MODULE: {ProjectName}.settings
aws:elasticbeanstalk:container:python:
WSGIPath: {ProjectName}.wsgi:application
DJANGO_SETTINGS_MODULE
: ebextensions의 상위 디렉토리 기준으로 settings파일의 상대 경로
WSGIPath
: wsgi 어플리케이션. wsgi.py에서 기본적으로 application에 wsgi 어플리케이션이 할당되기 때문에 wsgi.py 경로에 application이 기본 WSGIPath가 됩니다.
저는 manage.py가 있는 디렉토리에서 배포를 하지 않아서 한참 해맸습니다. 프로젝트 디렉토리 구조 상 그럴 수 밖에 없어서 따로 설정을 수정하면 문제없이 배포가 될 것이라고 생각하고 진행했으나 구 방식이 웹상에 광범위하게 퍼진 바람에... 아주 긴 삽질을 했습니다. 여러분은 그러지 마시길 바랍니다.
위 상태로 페이지를 열면 정적 파일이 로드되지 않습니다. 정적 파일을 정상적으로 로드하기 위해서는 두 가지 방법이 있습니다.
1. collectstatic 명령으로 정적파일을 모으기
2. 따로 정적 파일 서버 두기
여기서는 1번 방식으로 진행하겠습니다. 아마존에서는 2를 권장하고 2가 비용이 덜 나온다고 나와 있지만 1 방식이 빠르게 진행할 수 있으므로 개발 단계에서는 1 방식을 쓰다가 실사용 배포 전에 정적파일 서버를 두는 게 좋을 것 같습니다.
{ProjectName}.settings.py
STATIC_URL = '/static/'
STATIC_ROOT = 'static'
STATICFILES_DIRS = (
os.path.join(STATIC_ROOT, 'admin'),
os.path.join(STATIC_ROOT, '{App Name}')
)
settings.py에 다음과 같이 정적 파일 설정을 추가합니다.
.ebextensions/static-files.config
option_settings:
aws:elasticbeanstalk:environment:proxy:staticfiles:
/{정적 파일이 제공될 경로}: {정적 파일 디렉토리}
경로는 원하는 대로 설정할 수 있고, 디렉토리는 STATIC_ROOT가 되겠습니다. 여기까지 하고 eb deploy 명령으로 업데이트를 하면 정적 파일이 로드된 것을 확인할 수 있습니다.
https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environment-cfg-staticfiles.html#environment-cfg-staticfiles.namespace
https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create-deploy-python-container.html
개인 공부 목적으로 작성하였습니다. 틀린 부분이 있을 수 경우 댓글로 남겨주시면 감사하겠습니다.