

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Elastic Beanstalk에 Django 애플리케이션 배포
<a name="create-deploy-python-django"></a>

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

이 자습서에서는 다음을 수행합니다.
+ [Python 가상 환경 설정 및 Django 설치](#python-django-setup-venv)
+ [Django 프로젝트 생성](#python-django-create-app)
+ [Elastic Beanstalk에 맞게 Django 애플리케이션 구성](#python-django-configure-for-eb) 
+ [EB CLI를 사용하여 사이트 배포](#python-django-deploy) 
+ [애플리케이션 업데이트](#python-django-update-app) 
+ [정리](#python-django-stopping)

## 사전 조건
<a name="python-django-prereq"></a>

이 자습서를 따르려면 다음 패키지를 포함하여 Python의 [공통 필수 구성 요소](python-development-environment.md)가 모두 설치되어 있어야 합니다.
+ Python 3.7 이상
+ `pip`
+ `virtualenv`
+ `awsebcli`

이 자습서의 일부로 [Django](https://www.djangoproject.com/) 프레임워크가 설치됩니다.

**참고**  
EB CLI로 환경을 생성하려면 [서비스 역할](concepts-roles-service.md)이 필요합니다. Elastic Beanstalk 콘솔에서 환경을 생성하여 서비스 역할을 생성할 수 있습니다. 서비스 역할이 없는 경우 사용자가 `eb create`를 실행할 때 EB CLI가 역할 생성을 시도합니다.

## Python 가상 환경 설정 및 Django 설치
<a name="python-django-setup-venv"></a>

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

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

**가상 환경을 설정하려면**

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

------
#### [ Unix-based systems ]

   ```
   ~$ virtualenv ~/eb-virt
   ```

------
#### [ Windows ]

   ```
   C:\> virtualenv %HOMEPATH%\eb-virt
   ```

------

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

------
#### [ 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 로그인 이름입니다.

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

   ```
   (eb-virt)~$ pip install django==2.2
   ```
**참고**  
설치하는 Django 버전이 애플리케이션 배포를 위해 선택한 Elastic Beanstalk Python 구성의 Python 버전과 호환되어야 합니다. 배치에 대한 정보는 이 주제의 [EB CLI를 사용하여 사이트 배포](#python-django-deploy)을(를) 참조하세요.  
최신 Python 플랫폼 버전에 대한 자세한 내용은 *AWS Elastic Beanstalk 플랫폼* 문서의 [Python](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.python)을 참조하세요.  
Python과 호환되는 Django 버전은 [Django와 함께 사용할 수 있는 Python 버전은 무엇입니까?](https://docs.djangoproject.com/en/3.1/faq/install/#what-python-version-can-i-use-with-django)를 참조하세요.

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

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

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

## Django 프로젝트 생성
<a name="python-django-create-app"></a>

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

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

**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 로그인 이름입니다.

1. `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
   ```

1. `manage.py runserver`를 사용하여 Django 사이트를 로컬에서 실행합니다.

   ```
   (eb-virt) ~$ cd ebdjango
   ```

   ```
   (eb-virt) ~/ebdjango$ python manage.py runserver
   ```

1. 웹 브라우저에서 `http://127.0.0.1:8000/`을 열어 사이트를 봅니다.

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

   ```
   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 애플리케이션 구성
<a name="python-django-configure-for-eb"></a>

이제 로컬 시스템에 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
   ```

------

1. `pip freeze`를 실행한 다음 이름이 `requirements.txt`인 파일에 출력을 저장합니다.

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

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

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

   ```
   (eb-virt) ~/ebdjango$ mkdir .ebextensions
   ```

1. `.ebextensions` 디렉터리 내에서 다음 텍스트가 있는 `django.config`라는 [구성 파일](ebextensions.md)을 추가합니다.  
**Example \$1/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`로 변경합니다. Gunicorn WSGI 서버에서 작동하는 예제의 값은 Amazon Linux AMI 플랫폼 버전에서는 지원되지 않습니다.

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

   ```
   (eb-virt) ~/ebdjango$ deactivate
   ```

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

## EB CLI를 사용하여 사이트 배포
<a name="python-django-deploy"></a>

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의 보안 요구 사항입니다. 자세한 내용은 [호스트 헤더 검증](https://docs.djangoproject.com/en/2.2/topics/security/#host-headers-virtual-hosting)을 참조하세요.

**환경을 생성하고 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 플랫폼 버전을 통해 환경을 생성하도록 로컬 리포지토리를 구성합니다.

1. (선택 사항) 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**를 실행합니다.

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

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

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

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

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

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

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

   ```
   ...
   ALLOWED_HOSTS = ['eb-django-app-dev.elasticbeanstalk.com']
   ```

1. 파일을 저장한 후 **eb deploy**를 실행해 애플리케이션을 배포합니다. **eb deploy**를 실행하면 EB CLI가 프로젝트 디렉터리의 콘텐츠를 번들링한 후 이를 환경에 배포합니다.

   ```
   ~/ebdjango$ eb deploy
   ```
**참고**  
프로젝트에 Git을 사용할 경우 [EB CLI와 Git 사용](eb3-cli-git.md) 단원을 참조하십시오.

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

   ```
   ~/ebdjango$ eb open
   ```

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

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

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

## 애플리케이션 업데이트
<a name="python-django-update-app"></a>

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

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

### 사이트 설정 수정
<a name="python-django-modify-site"></a>

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

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

1. `settings.py`에서 `TIME_ZONE` 설정을 수정합니다.  
**Example \$1/ebdjango/ebdjango/settings.py**  

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

   시간대 목록은 [이 페이지](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)를 참조하십시오.

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

   ```
   ~/ebdjango/$ eb deploy
   ```

### 사이트 관리자 생성
<a name="python-django-create-admin"></a>

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
   ```

1. `manage.py createsuperuser`를 실행하여 관리자를 생성합니다.

   ```
   (eb-virt) ~/ebdjango$ python manage.py createsuperuser
   Username: admin
   Email address: me@mydomain.com
   Password: ********
   Password (again): ********
   Superuser created successfully.
   ```

1. 정적 파일을 저장할 위치를 Django에 알리려면 `settings.py`에서 `STATIC_ROOT`를 정의합니다.  
**Example \$1/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'
   ```

1. `manage.py collectstatic`을 실행하여 `static` 디렉터리를 관리자 사이트의 정적 자산(javascript, CSS, 이미지)으로 채웁니다.

   ```
   (eb-virt) ~/ebdjango$ python manage.py collectstatic
   119 static files copied to ~/ebdjango/static
   ```

1. 애플리케이션 배포

   ```
   ~/ebdjango$ eb deploy
   ```

1. 다음과 같이 사이트 URL에 `/admin/`을 추가하여 브라우저에서 사이트를 열어 관리 콘솔을 봅니다.

   ```
   http://djang-env.p33kq46sfh.us-west-2.elasticbeanstalk.com/admin/
   ```  
![\[2단계에서 생성한 사용자 이름과 암호를 입력하여 관리 콘솔에 로그인합니다.\]](http://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/images/eb_django_admin_login.png)

1. 2단계에서 구성한 사용자 이름과 암호로 로그인합니다.  
![\[Elastic Beanstalk에 배포된 Django 웹사이트의 Django 관리 콘솔\]](http://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/images/eb_django_admin_console.png)

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

### 데이터베이스 마이그레이션 구성 파일 추가
<a name="python-django-migrate-site"></a>

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

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

1. 다음 콘텐츠가 포함된 `db-migrate.config`라는 이름의 [구성 파일](ebextensions.md)을 추가합니다.  
**Example \$1/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`를 지정하면 여러 인스턴스에 배포할 때 한 번만 실행됩니다.

1. 애플리케이션 배포

   ```
   ~/ebdjango$ eb deploy
   ```

## 정리
<a name="python-django-stopping"></a>

개발 세션 간에 인스턴스 시간과 기타 AWS 리소스를 절약하려면를 사용하여 Elastic Beanstalk 환경을 종료합니다**eb terminate**.

```
~/ebdjango$ eb terminate django-env
```

이 명령은 환경과 환경 내에서 실행되는 모든 AWS 리소스를 종료합니다. 그러나 애플리케이션은 삭제되지 않으므로 **eb create**를 다시 실행하여 동일한 구성의 더 많은 환경을 언제든 생성할 수 있습니다.

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

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

## 다음 단계
<a name="python-django-next-steps"></a>

심화 자습서를 포함해 Django에 대한 자세한 내용은 [공식 설명서](https://docs.djangoproject.com/en/2.2/)를 참조하세요.

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