반응형

장고를 aws에 배포를 하도록 하겠습니다.

프로젝트 최초 생성 시에는 쿠키커터를 사용해서 프로젝트를 만들었습니다.

흐름을 파악하고 각자의 환경의 따라서 설정이 차이가 있을 수 있습니다.

 

0. elastic beanstalk 세팅을 위해서 커맨드 명령어인 awsebcli를 설치

pip install awsebcli

설치 eb를 입력하여 설치가 되었는지 확인

 

1. elastic beanstalk 사용을 위해서 프로젝트 초기화

eb init

파이썬 버전, 프로젝트 네임 등 여러 값들을 설정을 진행합니다.

중간에 조금 주의 깊게 봐주셔야 될 것은 aws_access_key_idaws_secret_access_key 설정이 있습니다.

해당 값은 aws 로그인 후 유저 이름을 눌러주세요.

위의 사진과 같이 내 보안 자격 증명으로 이동해주세요. 다음으로 액세스 키 항목으로 이동을 해주셔야 되는데요.

위와 사진과 같이 액세스 키를 누른 다음에 새 액세스 키를 만들기 버튼을 눌러주시면 액세스 키 ID와 시크릿 키를 만드실 수 있습니다. (현재 위의 사진에서는 버튼이 아래에 있어 사진에서는 보이지 않습니다)

 

액세스 키를 입력해줘야 커맨드 창에서 액세스를 할 수 있고, 액세스 키를 여러개 만들어 s3에만 접근한다는지 rds에만 접근한다던지 액세스 키 별로 사용이 가능합니다. 액세스 키를 만들고 로컬 환경에 csv로 저장을 하고 cli에 입력해주세요 :)

 

다음으로 엔터를 눌러 디폴트로 환경 초기화를 진행해주시면 되겠습니다.

 

2. 실제 elastic beanstalk을 생성

eb create

명령어를 입력을 하고 이름과 balancer type을 입력해줍니다.

그리고 생성이 쭉 진행이 되는데, 완료가 되면 aws 사이트(elastic beanstalk 메뉴)에서 honey-lang(프로젝트 네임)이 생성된 모습을 보실 수 있습니다.

정상적으로 생성이 되었으나 해당 URL을 보니 찾을 수 없다고 나옵니다. 

이유는 다음과 같습니다. eb 생성 중 로그를 보시게 되면 WSGIPath를 찾을 수 없다고 합니다.

ERROR   Your WSGIPath refers to a file that does not exist.

 

이유는 현재 eb 환경설정을 보시게 되면 WSGIPath로 application.py를 찾고 있습니다.

aws는 application.py를 찾고 있어 에러가 발생하는데요.

제 환경은 현재 디폴트로 세팅된 환경과 달라서 발생되는 에러입니다.

실제 장고 프로젝트가 구동될 때는 로컬에서는 python manage.py runserver 명령어로 실행이 되나 상용에서는 위와 같이 WSGIPath를 찾아서 실행을 시켜줍니다. 그럼 다음 항목에서 WSGIPath를 설정하겠습니다.

 

3. WSGIPath 설정

WSGIPath 설정을 로컬에서 설정을 하도록 하겠습니다.

프로젝트 소소 코드에 .ebextensions에 폴더를 만들고 10_python.config 파일을 만들어주세요. (폴더와 파일 이름은 규칙이 있습니다.)

다음 코드를 입력해주세요. 본인의 프로젝트 환경의 따라서 wsgi.py를 잡아주세요.

(wsgi 이외에도 세팅 모듈 경로도 추가하는 코드를 작성했습니다. 여기서 코드를 추가하면 eb 프로퍼티를 추가할 수도 있습니다.)

option_settings:
  "aws:elasticbeanstalk:application:environment":
    DJANGO_SETTINGS_MODULE: "config.settings.production"
  "aws:elasticbeanstalk:container:python":
    WSGIPath: "config/wsgi.py"

위의 코드를 입력하고 커밋 후에 eb deploy를 실행해주세요.

다시 URL에 들어가면 에러가 발생했지만 서버가 구동이 된 모습을 보실 수 있습니다. (조금 전에는 서버가 구동이 안 됐습니다.)

4. ec2에 Package 설치

이제부터는 eb logs 명령어를 통해서 직접 하나씩 하나씩 확인을 해보겠습니다. (위의 화면은 로컬에서는 노란 화면으로 debug 모드로 확인이 가능하나, 상용에서는 debug 모드가 False로 되어 있어 로그가 보이지 않습니다. 상용에서도... 보고 싶으시다면 세팅에서 변경 가능합니다.)

-> DEBUG = env.bool("DJANGO_DEBUG", False)

(아래 내용을 먼저 말씀드리자면, 사실 아직 Django가 설치가 되어 있지 않아 아무 동작도 안됩니다.)

 

로그 내용을 확인하겠습니다.

에러 내용은 다음과 같습니다. ModuleNotFoundError: No module named 'django'

장고 모듈을 찾을 수 없다고 합니다. aws에는 장고 관련 모듈을 설치하지 않아 발생하는 에러입니다.

 

장고 모듈을 설치하겠습니다.

파이썬에서 필요로 하는 패키지를 설치하기 위해서는 루트 위치에 requirements.txt  파일을 만들어주세요.

aws가 requirements.txt 파일을 찾습니다.

아래 코드를 입력해주세요.

-r requirements/production.txt

위의 코드는 현재 제 로컬에 있는 패키지 관리를 위한 위치입니다.

다음으로 커밋 후에 deploy를 하면 에러가 발생합니다.

 

ec2에서는 레드햇 계열 리눅스를 사용합니다. 패키지 설치 시 yum을 사용하는데요.

이를 위해서 아래 코드 내용을 작성해주세요.

파일명과 위치는 아래와 같습니다.

# .ebextensions/01_packages.config

packages:
  yum:
    git: []
    postgresql93-devel: []

위의 파일을 추가하고 다시 커밋 -> deploy를 하겠습니다.

 

ps)

내환경에 설정한 파이썬 패키지 추가

pip freeze > requirements.txt

 

5. 프로퍼티 추가 (Environment properties)

deploy까지 되었으나 다음 문제가 또 있습니다.

eb logs를 통해 에러를 확인하겠습니다.

SECRET_KEY = env("DJANGO_SECRET_KEY")

 

장고에서 지정된 DJANGO_AWS_ACCESS_KEY_ID 값이 없어서 발생되는 에러입니다.

장고에서 사용되는 지정된 설정 값들을 모두 설정을 해주셔야 됩니다. (시크릿 키는 장고에서 암호화할 때 필요한 값입니다.)

설정 값들은 깃 헙에 올라가 다른 사람이 보면 안 되는 값입니다.

그렇기 때문에 aws 환경에 직접 세팅을 해주셔야 됩니다.

aws 접속 후 Elastic Beanstalk 메뉴로 이동해주세요.

구성 -> 소프트웨어 -> 편집으로 이동 후 아래로 내려와 환경 속성에 값들을 입력해주시면 되겠습니다.

위의 예는 예시로 보여드리는 예시입니다. 외부로 값을 절대 노출하시면 안 됩니다.

(키 값은 다음 사이트에서 발급받으면 편해요^^ https://miniwebtool.com/django-secret-key-generator/)

 

적용!!

 

지금은 장고 비밀 키 값만 추가를 했는데 settings에 있는 디폴트 값이 없는 DJANGO_AWS_ACCESS_KEY_ID, DJANGO_AWS_SECRET_ACCESS_KEY 등등 설정 값 모두 프로퍼티에 추가를 하셔야 됩니다.

 

프로퍼티를 추가하는 또 다른 방법은 다음과 같은 command로도 설정이 가능합니다.

eb setevn DJANGO_AWS_ACCESS_KEY_ID=

 

필요로 하는 프로퍼티를 모두 추가하겠습니다.

환경에 맞게 필요로 하는 속성들을 추가를 해주시면 되겠습니다.

커밋 후 eb deploy를 하겠습니다.

 

ps)

에러에 대한 전체 로그가 확인하고 싶을 때는 aws에서 다운로드를 하실 수 있습니다.

위의 작업 및 배포 이후에 /var/log/httpd/error_log를 확인하니 

데이터베이스 세팅을 필요로 합니다.

 

6. 데이터베이스 연결 및 세팅

aws사이트에 접속하여 rds 메뉴로 이동해주세요.

 

1) 데이터 베이스 생성

데이터베이스 생성 버튼을 눌러주세요.

저는 postgreSQL을 사용하겠습니다. 그리고 프리티어를 체크해주세요.

다음으로 식별자와 아이디/비밀번호를 세팅합니다.

위의 예시는 예제입니다 :)

사용자에 맞게 설정을 해주시고 꼭 숙지하고 있어 주세요. 이유는 프로퍼티에 추가를 해야 되기 때문입니다.

그리고 아래는 디폴트로 설치를 해주시면 되겠습니다.

 

2) 프로퍼티 설정

EB에 DB설정을 위한 새롭게 추가한 프로퍼티

RDS_DB_NAME -> postgres(사용하는 DB이름)

RDS_DB_USERNAME -> honeydb(사용자 이름)

RDS_DB_PASSWORD -> 패스워드

RDS_DB_PORT -> 포트(디폴트 5432)(설치 후 확인이 가능합니다)

RDS_DB_HOSTNAME -> 디비 엔드포인트

DJANGO_ALLOWED_HOSTS -> 도메인/엔드포인트 (사진에 없으나 꼭 추가해주세요)

 

3) 장고 소스코드 config 내용 수정

프로퍼티를 추가하셨다면 장고가 postgres를 사용할 수 있도록 데이터베이스 관련 설정을 아래처럼 수정하겠습니다.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': env('RDS_DB_NAME'),
        'USER': env('RDS_DB_USERNAME'),
        'PASSWORD': env('RDS_DB_PASSWORD'),
        'HOST': env('RDS_DB_HOSTNAME'),
        'PORT': env('RDS_DB_PORT')
    }
}

위의 코드는 production 전용입니다.

기존에 사용하는 base.py에 사용하는 코드는 주석처리를 하고 local.py로 분리하였습니다.

 

eb deploy 이후에 사이트에 들어가면 https로 접속을 시도합니다.

현재 프로젝트는 https를 별도로 구입하지 않아서 설정 파일에 security 관련하여 주석처리를 했습니다.

(저는 쿠키커터를 사용했기 때문에 지금은 사용하지 않는 Redis 및 이메일 관련한 설정도 주석처리를 했습니다)

 

4) 인바운드를 열어주기

rds에 접근할 수 있도록 인바운드를 열어줍니다.

rds 서비스로 들어가 해당 db 인스턴스에 들어갑니다. 아래로 가시면 보안 그룹 규칙 있습니다.

보안 그룹 링크를 클릭하고 다시 아래로 쭉 내려가 인바운드를 추가해주세요 :)

 

여기까지 진행을 했다면 기본적인 세팅은 마무리가 됩니다 :)

 

7. migrate 및  static 파일(js, css, image) s3 버킷으로 이동

이제는 로컬에서 마이그레이션 하듯이 서버에서도 마이그레이션 작업을 해주서야 됩니다.

10_python.config 파일에서 container_commands 키워드를 추가해주시면 되겠습니다.

애플리케이션이 시작될 때 자동으로 수행됩니다.

1) migrate 명령어 추가

container_commands:
  01_migrate:
    command: "source /opt/python/run/venv/bin/activate && python manage.py migrate --noinput"
    leader_only: True

다음으로

migrate 이후에 디플로이를 했습니다. 그리고 어드민에 접속을 했더니 접속은 정상적으로 됩니다.

 

2) collectstatic 명령어 추가(static 파일 s3 버킷으로 이동)

어드민을 보니 디자인이 모두 깨진 모습입니다. static 파일이 없어서 발생하는 문제인데 migrate 아래에 다음과 같은 명령어를 추가해주시면 s3에 static 파일이 복사가 됩니다.

  02_collectstatic:
    command: "source /opt/python/run/venv/bin/activate && python manage.py collectstatic --noinput"

다시 커밋 그리고 배포를 합니다.

s3 버킷에 정상적으로 static 파일이 복사가 되었고, 이제는 어드민 창을 확인하겠습니다.

디자인이 정상적으로 적용이 되었습니다!!!

 

8. 어드민 슈퍼 유저 생성

슈퍼유저 생성 시에도 명령어 수행 및 약간의 코드 추가를 필요로 합니다.

collectstatic 밑이 아래 명령어를 추가해주세요.

  03_createuser:
    command: "source /opt/python/run/venv/bin/activate && python manage.py ebuser"

ebuser라는 파일을 실행시키겠다는 명령어입니다.

ebuser 코드를 작성해주셔야 됩니다. (커밋 내역)

from django.core.management.base import BaseCommand
from django.contrib.auth import get_user_model

class Command(BaseCommand):
    def handle(self, *args, **options):
        User = get_user_model()
        User.objects.create_superuser('iamadmin', 'iamadmin@gmail.com', 'adminpass')

유저 모델을 갖고 와서 슈퍼 유저를 생성하는 코드입니다.

커밋 후 디플로이를 해주세요 :)

 

어드민까지 정상적으로 접속되는 모습이 보입니다. (접속 후에 패스워드 변경 필수입니다.)

 

작업 이후에는 위에서 추가한 createuser 명령어와 ebuser.py 파일 내의 계정 정보를 꼭 삭제해주세요.

(작업할 때는 커밋만 하고 이후에는 정보를 지운 후에 rebase나 amend작업으로 다시 커밋 푸시 진행)

 

9. 리액트를 사용하신다면

리액트를 다루신다면 PUBLIC_URL도 꼭 추가를 해주셔야 됩니다.

JS파일이 로컬에 있는 것처럼 보여 발생하는 문제인데요. S3로 경로를 설정해주셔야 됩니다.

장고 어드민 개발자 환경에서 s3 주소를 갖고 와 리액트 환경의 .env에 PUBLIC_URL을 추가해주시면 됩니다.

PUBLIC_URL='https://hello.s3.amazonaws.com'

yarn build 실행!!!

commit 후에 다시 eb deploy!!!

(로컬에서 작업하실 때는 다시 PUBLIC_URL을 풀어주셔야 됩니다.)

 

정상적으로 배포를 완료하였습니다 :)

환경이 달라 조금은 다른 점이 있겠지만 큰 흐름은 이렇습니다.

배포가 생각하는 것처럼 쉽지가 않습니다. 위의 내용을 참고하면서 문제점들에 대한 로그를 보면서 해결하신다면 배포를 하실 수 있겠습니다.

감사합니다 :)

반응형

+ Recent posts