Elastic Beanstalk 간단 배포하기

maintain·2020년 8월 27일
0

사이드 프로젝트를 진행하면서 처음으로 AWS를 통해 배포를 하게 되었습니다. 학교 프로젝트용으로 Google App Engine을 한 번 사용해본 적이 있었지만 주변인들이 Elastic Beanstalk(이하 EB)가 다루기 쉽고 빠르다고 하고, DynamoDB를 사용하고 있고, 아무래도 EB가 대세인 감이 없지 않아 있었기에 별 고민없이 EB로 배포하기로 결정했습니다.

배포 과정

  1. pip install awsebcli 명령으로 EB cli를 설치합니다.
  2. eb init으로 기본 세팅을 합니다. 지역을 northeast-2로(서울) 설정하는 것, AWS key, secret key 입력 이외에는 전부 엔터 눌러서 기본 세팅으로 해도 됩니다.
  3. manage.py가 있는 작업 폴더에서 eb create 명령으로 프로젝트를 시작합니다.
  4. eb open 명령을 통해 확인할 수 있습니다.

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

개인 공부 목적으로 작성하였습니다. 틀린 부분이 있을 수 경우 댓글로 남겨주시면 감사하겠습니다.

0개의 댓글