Elastic Beanstalk에 Django 애플리케이션 배포 - AWS Elastic Beanstalk

Elastic Beanstalk에 Django 애플리케이션 배포

이 자습서는 자동 생성된 기본 Django 웹 사이트를 Python을 실행하는 AWS Elastic Beanstalk 환경에 배포하는 과정을 안내합니다. 이 자습서에서는 Elastic Beanstalk 환경을 사용하여 클라우드에서 Python 웹 앱을 호스팅하는 방법을 보여줍니다.

이 자습서에서는 다음을 수행합니다.

사전 조건

Elastic Beanstalk를 포함한 AWS 서비스를 사용하려면 AWS 계정과 자격 증명이 있어야 합니다. 자세히 알아보고 가입하려면 https://aws.amazon.com/을 방문하십시오.

이 자습서를 따르려면 다음 패키지를 포함하여 Python의 공통 필수 구성 요소가 모두 설치되어 있어야 합니다.

  • Python 3.7 이상

  • pip

  • virtualenv

  • awsebcli

이 자습서의 일부로 Django 프레임워크가 설치됩니다.

참고

EB CLI로 환경을 생성하려면 서비스 역할이 필요합니다. Elastic Beanstalk 콘솔에서 환경을 생성하여 서비스 역할을 생성할 수 있습니다. 서비스 역할이 없는 경우 사용자가 eb create를 실행할 때 EB CLI가 역할 생성을 시도합니다.

Python 가상 환경 설정 및 Django 설치

virtualenv로 가상 환경을 생성하고 이를 사용하여 Django 및 종속 항목을 설치합니다. 가상 환경을 사용하여 애플리케이션을 실행하는 Amazon EC2 인스턴스에 필수 패키지가 설치되도록 애플리케이션에 필요한 패키지를 정확히 알 수 있습니다.

다음 단계는 별도의 탭에 표시된 Unix 기반 시스템 및 Windows에 입력해야 하는 명령을 보여줍니다.

가상 환경을 설정하려면

  1. 이름이 eb-virt인 가상 환경을 만듭니다.

    Unix-based systems
    ~$ virtualenv ~/eb-virt
    Windows
    C:\> virtualenv %HOMEPATH%\eb-virt
  2. 가상 환경을 활성화합니다.

    Unix-based systems
    ~$ source ~/eb-virt/bin/activate (eb-virt) ~$
    Windows
    C:\>%HOMEPATH%\eb-virt\Scripts\activate (eb-virt) C:\>

    명령 프롬프트 앞에 추가된 (eb-virt)가 보일 것입니다. 이는 가상 환경에 있음을 나타냅니다.

    참고

    이 지침의 나머지 부분에서는 홈 디렉터리 ~$에 있는 Linux 명령 프롬프트를 보여 줍니다. Windows에서 이는 C:\Users\USERNAME>이고, 여기에서 USERNAME은 Windows 로그인 이름입니다.

  3. pip를 사용하여 Django를 설치합니다.

    (eb-virt)~$ pip install django==2.2
    참고

    설치하는 Django 버전이 애플리케이션 배포를 위해 선택한 Elastic Beanstalk Python 구성의 Python 버전과 호환되어야 합니다. 배치에 대한 정보는 이 주제의 EB CLI를 사용하여 사이트 배포을(를) 참조하세요.

    최신 Python 플랫폼 버전에 대한 자세한 내용은 AWS Elastic Beanstalk 플랫폼 문서의 Python을 참조하세요.

    Python과 호환되는 Django 버전은 Django와 함께 사용할 수 있는 Python 버전은 무엇입니까?를 참조하세요.

  4. Django가 설치되어 있는지 확인하려면 다음을 입력하십시오.

    (eb-virt)~$ pip freeze Django==2.2 ...

    이 명령은 가상 환경에 설치된 모든 패키지를 나열합니다. 나중에 이 명령의 출력을 사용하여 Elastic Beanstalk에서 사용할 프로젝트를 구성합니다.

Django 프로젝트 생성

이제 가상 환경을 사용하여 Django 프로젝트를 만들고 이를 시스템에서 실행할 준비가 되었습니다.

참고

이 자습서는 Python에 포함된 데이터베이스 엔진인 SQLite를 사용합니다. 데이터베이스는 프로젝트 파일과 함께 배포됩니다. 프로덕션 환경의 경우 Amazon Relational Database Service(Amazon RDS)을 사용하고 이를 환경에서 분리하는 것이 좋습니다. 자세한 내용은 Amazon RDS DB 인스턴스를 Python 애플리케이션 환경에 추가을(를) 참조하세요.

Django 애플리케이션을 생성하려면

  1. 가상 환경을 활성화합니다.

    Unix-based systems
    ~$ source ~/eb-virt/bin/activate (eb-virt) ~$
    Windows
    C:\>%HOMEPATH%\eb-virt\Scripts\activate (eb-virt) C:\>

    명령 프롬프트 앞에 붙은 (eb-virt) 접두사가 보일 것입니다. 이는 가상 환경에 있음을 나타냅니다.

    참고

    이 지침의 나머지 부분에서는 홈 디렉터리 ~$와 Linux 홈 디렉터리 ~/에 있는 Linux 명령 프롬프트를 보여 줍니다. Windows에서 이는 C:\Users\USERNAME>이고, 여기에서 USERNAME은 Windows 로그인 이름입니다.

  2. django-admin startproject 명령을 사용하여 ebdjango라는 Django 프로젝트를 만듭니다.

    (eb-virt)~$ django-admin startproject ebdjango

    이 명령은 다음 디렉터리 구조로 ebdjango라는 표준 Django 사이트를 만듭니다.

    ~/ebdjango |-- ebdjango | |-- __init__.py | |-- settings.py | |-- urls.py | `-- wsgi.py `-- manage.py
  3. manage.py runserver를 사용하여 Django 사이트를 로컬에서 실행합니다.

    (eb-virt) ~$ cd ebdjango
    (eb-virt) ~/ebdjango$ python manage.py runserver
  4. 웹 브라우저에서 http://127.0.0.1:8000/을 열어 사이트를 봅니다.

  5. 서버 로그를 확인하여 요청에서 출력을 봅니다. Ctrl+C를 눌러 웹 서버를 중지하고 가상 환경으로 돌아갑니다.

    Django version 2.2, using settings 'ebdjango.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C. [07/Sep/2018 20:14:09] "GET / HTTP/1.1" 200 16348 Ctrl+C

Elastic Beanstalk에 맞게 Django 애플리케이션 구성

이제 로컬 시스템에 Django 기반 사이트가 있으므로 Elastic Beanstalk에 배포하도록 이를 구성할 수 있습니다.

기본적으로 Elastic Beanstalk는 application.py라는 파일을 찾아 애플리케이션을 시작합니다. 이 파일은 생성한 Django 프로젝트에는 존재하지 않기 때문에 애플리케이션 환경을 약간 조정해야 합니다. 또한 애플리케이션의 모듈을 로드할 수 있도록 환경 변수를 설정해야 합니다.

Elastic Beanstalk에 맞게 사이트를 구성하려면

  1. 가상 환경을 활성화합니다.

    Unix-based systems
    ~/ebdjango$ source ~/eb-virt/bin/activate
    Windows
    C:\Users\USERNAME\ebdjango>%HOMEPATH%\eb-virt\Scripts\activate
  2. pip freeze를 실행한 다음 이름이 requirements.txt인 파일에 출력을 저장합니다.

    (eb-virt) ~/ebdjango$ pip freeze > requirements.txt

    Elastic Beanstalk는 requirements.txt를 사용하여 애플리케이션을 실행하는 EC2 인스턴스에 설치할 패키지를 결정합니다.

  3. .ebextensions이라는 디렉터리를 생성합니다.

    (eb-virt) ~/ebdjango$ mkdir .ebextensions
  4. .ebextensions 디렉터리 내에서 다음 텍스트가 있는 django.config라는 구성 파일을 추가합니다.

    예 ~/ebdjango/.ebextensions/django.config

    option_settings: aws:elasticbeanstalk:container:python: WSGIPath: ebdjango.wsgi:application

    이 설정 WSGIPath는 Elastic Beanstalk가 애플리케이션을 시작하는 데 사용하는 WSGI 스크립트의 위치를 지정합니다.

    참고

    Amazon Linux AMI Python 플랫폼 버전(이전 Amazon Linux 2)을 사용하는 경우 WSGIPath의 값을 ebdjango/wsgi.py로 바꿉니다. 예제의 값은 Amazon Linux AMI 플랫폼 버전에서는 지원되지 않는 Gunicorn WSGI 서버에서 작동합니다.

  5. deactivate 명령으로 가상 환경을 비활성화합니다.

    (eb-virt) ~/ebdjango$ deactivate

    애플리케이션에 패키지를 추가해야 하거나 애플리케이션을 로컬에서 실행해야 할 때마다 가상 환경을 다시 활성화합니다.

EB CLI를 사용하여 사이트 배포

Elastic Beanstalk에 애플리케이션을 배포하기 위해 필요한 모든 항목을 추가했습니다. 프로젝트 디렉터리가 이제 다음과 같을 것입니다.

~/ebdjango/ |-- .ebextensions | `-- django.config |-- ebdjango | |-- __init__.py | |-- settings.py | |-- urls.py | `-- wsgi.py |-- db.sqlite3 |-- manage.py `-- requirements.txt

다음으로 애플리케이션 환경을 생성하고 Elastic Beanstalk에 구성된 애플리케이션을 배포합니다.

배포 즉시 Django의 구성을 편집해 Elastic Beanstalk가 Django ALLOWED_HOSTS의 사용자 애플리케이션에 할당한 도메인 이름을 추가합니다. 그리고 애플리케이션을 다시 배포합니다. 이는 HTTP Host 헤더 공격을 방지할 수 있도록 설계된 Django의 보안 요구 사항입니다. 자세한 내용은 호스트 헤더 검증을 참조하세요.

환경을 생성하고 Django 애플리케이션을 배포하려면

참고

이 자습서에서는 EB CLI를 배포 메커니즘으로 사용하지만, Elastic Beanstalk 콘솔을 사용하여 프로젝트의 콘텐츠를 포함하는 .zip 파일을 배포할 수도 있습니다.

  1. eb init 명령으로 EB CLI 리포지토리를 초기화합니다.

    ~/ebdjango$ eb init -p python-3.7 django-tutorial Application django-tutorial has been created.

    이 명령은 django-tutorial이라는 애플리케이션을 생성합니다. 이 명령은 또한 최신 Python 3.7 플랫폼 버전을 통해 환경을 생성하도록 로컬 리포지토리를 구성합니다.

  2. (선택 사항) SSH를 통해 애플리케이션을 실행하는 EC2 인스턴스에 연결할 수 있도록 eb init를 다시 실행하여 기본 키 페어를 구성합니다.

    ~/ebdjango$ eb init Do you want to set up SSH for your instances? (y/n): y Select a keypair. 1) my-keypair 2) [ Create new KeyPair ]

    키 페어가 이미 있는 경우 이를 선택하거나, 프롬프트에 따라 키 페어를 생성합니다. 프롬프트가 보이지 않거나 나중에 설정을 변경해야 하는 경우 eb init -i를 실행합니다.

  3. 환경을 만들고 eb create로 해당 환경에 애플리케이션을 배포합니다.

    ~/ebdjango$ eb create django-env
    참고

    "service role required" 오류 메시지가 표시되면 eb create를 대화식으로 실행하고(환경 이름을 지정하지 않고) EB CLI가 사용자 대신 역할을 생성하도록 합니다.

    이 명령은 이름이 django-env인 로드 밸런싱 수행 Elastic Beanstalk 환경을 생성합니다. 환경을 생성하는 데 약 5분이 걸립니다. Elastic Beanstalk는 애플리케이션을 실행하는 데 필요한 리소스를 생성하면서 EB CLI가 터미널에 전달하는 정보 메시지를 출력합니다.

  4. 환경 생성 프로세스가 완료되면, eb status를 실행해 새 환경의 도메인 이름을 찾습니다.

    ~/ebdjango$ eb status Environment details for: django-env Application name: django-tutorial ... CNAME: eb-django-app-dev.elasticbeanstalk.com ...

    사용자 환경의 도메인 이름은 CNAME 속성의 값입니다.

  5. settings.py 디렉터리에 있는 ebdjango 파일을 엽니다. ALLOWED_HOSTS 설정을 찾은 다음 이전 단계에 찾은 애플리케이션 도메인 이름을 설정 값에 추가합니다. 파일에서 이 설정을 찾을 수 없는 경우 새로운 줄로 추가합니다.

    ... ALLOWED_HOSTS = ['eb-django-app-dev.elasticbeanstalk.com']
  6. 파일을 저장한 후 eb deploy를 실행해 애플리케이션을 배포합니다. eb deploy를 실행하면 EB CLI가 프로젝트 디렉터리의 콘텐츠를 번들링한 후 이를 환경에 배포합니다.

    ~/ebdjango$ eb deploy
    참고

    프로젝트에 Git을 사용할 경우 EB CLI와 Git 사용 단원을 참조하십시오.

  7. 환경 업데이트 프로세스가 완료되면 eb open으로 웹 사이트를 엽니다.

    ~/ebdjango$ eb open

    그러면 애플리케이션에 대해 생성된 도메인 이름을 사용하여 브라우저 창이 열립니다. 로컬에서 만들고 테스트한 것과 동일한 Django 웹 사이트가 보일 것입니다.

실행 중인 애플리케이션이 보이지 않거나 오류 메시지를 받은 경우, 배포 문제 해결에서 오류의 원인을 확인하는 방법에 대한 도움말을 보십시오.

실행 중인 애플리케이션이 보인다면 성공한 것입니다. Elastic Beanstalk로 처음 Django 애플리케이션을 배포하였습니다.

애플리케이션 업데이트

이제 Elastic Beanstalk에서 실행 중인 애플리케이션이 있으므로 애플리케이션 또는 그 구성을 업데이트하고 다시 배포할 수 있습니다. Elastic Beanstalk에서 인스턴스를 업데이트하고 새 애플리케이션 버전을 시작하는 작업을 처리합니다.

이 예제에서는 Django의 관리자 콘솔을 활성화하고 몇 가지 설정을 구성합니다.

사이트 설정 수정

기본적으로 Django 웹 사이트에서는 UTC 시간대를 사용하여 시간을 표시합니다. settings.py에서 시간대를 지정하여 이를 변경할 수 있습니다.

사이트의 시간대를 변경하려면

  1. TIME_ZONE에서 settings.py 설정을 수정합니다.

    예 ~/ebdjango/ebdjango/settings.py

    ... # Internationalization LANGUAGE_CODE = 'en-us' TIME_ZONE = 'US/Pacific' USE_I18N = True USE_L10N = True USE_TZ = True

    시간대 목록은 이 페이지를 참조하십시오.

  2. Elastic Beanstalk 환경에 애플리케이션을 배포합니다.

    ~/ebdjango/$ eb deploy

사이트 관리자 생성

Django 애플리케이션의 사이트 관리자를 생성하여 웹 사이트에서 직접 관리 콘솔에 액세스할 수 있습니다. 관리자 로그인 세부 정보는 Django가 생성하는 기본 프로젝트에 포함된 로컬 데이터베이스 이미지에 안전하게 저장됩니다.

사이트 관리자를 생성하려면

  1. Django 애플리케이션의 로컬 데이터베이스를 초기화합니다.

    (eb-virt) ~/ebdjango$ python manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying admin.0003_logentry_add_action_flag_choices... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK Applying sessions.0001_initial... OK
  2. manage.py createsuperuser를 실행하여 관리자를 생성합니다.

    (eb-virt) ~/ebdjango$ python manage.py createsuperuser Username: admin Email address: me@mydomain.com Password: ******** Password (again): ******** Superuser created successfully.
  3. 정적 파일을 저장할 위치를 Django에 알리려면 STATIC_ROOT에서 settings.py를 정의합니다.

    예 ~/ebdjango/ebdjango/settings.py

    # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/2.2/howto/static-files/ STATIC_URL = '/static/' STATIC_ROOT = 'static'
  4. manage.py collectstatic을 실행하여 static 디렉터리를 관리자 사이트의 정적 자산(javascript, CSS, 이미지)으로 채웁니다.

    (eb-virt) ~/ebdjango$ python manage.py collectstatic 119 static files copied to ~/ebdjango/static
  5. 애플리케이션 배포

    ~/ebdjango$ eb deploy
  6. 다음과 같이 사이트 URL에 /admin/을 추가하여 브라우저에서 사이트를 열어 관리 콘솔을 봅니다.

    http://djang-env.p33kq46sfh.us-west-2.elasticbeanstalk.com/admin/
    
              2단계에서 생성한 사용자 이름과 암호를 입력하여 관리 콘솔에 로그인합니다.
  7. 2단계에서 구성한 사용자 이름과 암호로 로그인합니다.

    
              Elastic Beanstalk에 배포된 Django 웹사이트의 Django 관리 콘솔

로컬 업데이트/테스트와 비슷한 절차를 사용할 수 있으며, 그 다음 eb deploy를 수행합니다. Elastic Beanstalk에서 라이브 서버를 업데이트하는 작업을 처리하므로 서버 관리 대신에 애플리케이션 개발에 집중할 수 있습니다.

데이터베이스 마이그레이션 구성 파일 추가

사이트가 업데이트될 때 실행할 .ebextensions 스크립트에 명령을 추가할 수 있습니다. 이를 통해 데이터베이스 마이그레이션을 자동으로 생성할 수 있습니다.

애플리케이션을 배포할 때 마이그레이션 단계를 추가하려면

  1. 다음 콘텐츠가 포함된 db-migrate.config라는 이름의 구성 파일을 추가합니다.

    예 ~/ebdjango/.ebextensions/db-migrate.config

    container_commands: 01_migrate: command: "source /var/app/venv/*/bin/activate && python3 manage.py migrate" leader_only: true option_settings: aws:elasticbeanstalk:application:environment: DJANGO_SETTINGS_MODULE: ebdjango.settings

    이 구성 파일은 서버의 가상 환경을 활성화하고 애플리케이션을 시작하기 전에 배포 프로세스 중에 manage.py migrate 명령을 실행합니다. 이는 애플리케이션 시작 전에 실행되므로 DJANGO_SETTINGS_MODULE 환경 변수를 명시적으로 구성해야 합니다(일반적으로 wsgi.py는 시작 중에 이를 처리). 명령에서 leader_only: true를 지정하면 여러 인스턴스에 배포할 때 한 번만 실행됩니다.

  2. 애플리케이션 배포

    ~/ebdjango$ eb deploy

정리

개발 세션 사이에 인스턴스 시간과 여러 AWS 리소스를 저장하려면 eb terminate을(를) 사용하여 Elastic Beanstalk 환경을 종료합니다.

~/ebdjango$ eb terminate django-env

이 명령은 환경과 그 안에서 실행되는 모든 AWS 리소스를 종료합니다. 그러나 애플리케이션은 삭제되지 않으므로 eb create를 다시 실행하여 동일한 구성의 더 많은 환경을 언제든 생성할 수 있습니다. EB CLI 명령에 대한 자세한 내용은 EB CLI를 사용하여 Elastic Beanstalk 환경 관리 단원을 참조하십시오.

샘플 애플리케이션 사용을 마치면 프로젝트 폴더와 가상 환경을 제거할 수 있습니다.

~$ rm -rf ~/eb-virt ~$ rm -rf ~/ebdjango

다음 단계

심화 자습서를 포함해 Django에 대한 자세한 내용은 공식 설명서를 참조하세요.

다른 Python 웹 프레임워크를 사용해 보고 싶은 경우 Elastic Beanstalk에 Flask 애플리케이션 배포 단원을 참조하십시오.