

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

# Elastic Beanstalk를 사용하여 Python 애플리케이션 배포
<a name="create-deploy-python-apps"></a>

이 장에서는 Python 웹 애플리케이션을 구성하고 배포하는 방법에 대한 지침을 제공합니다 AWS Elastic Beanstalk. Elastic Beanstalk를 통해 Amazon Web Services를 사용하는 Python 웹 애플리케이션을 손쉽게 배포, 관리 및 규모 조정할 수 있습니다.

Elastic Beanstalk 명령줄 인터페이스(EB CLI)를 사용하거나 Elastic Beanstalk 콘솔을 사용하여 단 몇 분 만에 애플리케이션을 배포할 수 있습니다. Elastic Beanstalk 애플리케이션을 배포한 후 EB CLI를 계속 사용하여 애플리케이션 및 환경을 관리하거나 AWS CLI Elastic Beanstalk 콘솔 또는 APIs를 사용할 수 있습니다.

[Python에 대한 QuickStart](python-quickstart.md)의 단계별 지침에 따라 EB CLI를 사용하여 Python *Hello World* 웹 애플리케이션을 생성하고 배포합니다.

**Topics**
+ [QuickStart: Elastic Beanstalk에 Python 애플리케이션 배포](python-quickstart.md)
+ [Elastic Beanstalk를 위한 Python 개발 환경 설정](python-development-environment.md)
+ [Elastic Beanstalk Python 플랫폼 사용](create-deploy-python-container.md)
+ [Elastic Beanstalk에 Flask 애플리케이션 배포](create-deploy-python-flask.md)
+ [Elastic Beanstalk에 Django 애플리케이션 배포](create-deploy-python-django.md)
+ [Python Elastic Beanstalk 환경에 Amazon RDS DB 인스턴스 추가](create-deploy-python-rds.md)
+ [Python 도구 및 리소스](create-deploy-python-tools-resources.md)

# QuickStart: Elastic Beanstalk에 Python 애플리케이션 배포
<a name="python-quickstart"></a>

이 QuickStart 자습서에서는 Python 애플리케이션을 생성하고 AWS Elastic Beanstalk 환경에 배포하는 프로세스를 안내합니다.

**프로덕션용으로 사용 불가**  
예제는 설명용으로만 제공됩니다. 예제 애플리케이션을 프로덕션 환경에서 사용하지 마세요.

**Topics**
+ [내 AWS 계정](#python-quickstart-aws-account)
+ [사전 조건](#python-quickstart-prereq)
+ [1단계: Python 애플리케이션 생성](#python-quickstart-create-app)
+ [2단계: 로컬에서 애플리케이션 실행](#python-quickstart-run-local)
+ [3단계: EB CLI를 사용하여 Python 애플리케이션 배포](#python-quickstart-deploy)
+ [4단계: Elastic Beanstalk에서 애플리케이션 실행](#python-quickstart-run-eb-ap)
+ [5단계: 정리](#go-tutorial-cleanup)
+ [AWS 애플리케이션을 위한 리소스](#python-quickstart-eb-resources)
+ [다음 단계](#python-quickstart-next-steps)
+ [Elastic Beanstalk 콘솔을 사용하여 배포](#python-quickstart-console)

## 내 AWS 계정
<a name="python-quickstart-aws-account"></a>

아직 AWS 고객이 아닌 경우 AWS 계정을 생성해야 합니다. 가입하면 Elastic Beanstalk 및 필요한 기타 AWS 서비스에 액세스할 수 있습니다.

이미 AWS 계정이 있는 경우 로 이동할 수 있습니다[사전 조건](#python-quickstart-prereq).

### AWS 계정 생성
<a name="python-quickstart-aws-account-procedure"></a>

#### 에 가입 AWS 계정
<a name="sign-up-for-aws"></a>

이 없는 경우 다음 단계를 AWS 계정완료하여 생성합니다.

**에 가입하려면 AWS 계정**

1. [https://portal.aws.amazon.com/billing/signup](https://portal.aws.amazon.com/billing/signup)을 엽니다.

1. 온라인 지시 사항을 따르세요.

   등록 절차 중 전화 또는 텍스트 메시지를 받고 전화 키패드로 확인 코드를 입력하는 과정이 있습니다.

   에 가입하면 AWS 계정*AWS 계정 루트 사용자*이 생성됩니다. 루트 사용자에게는 계정의 모든 AWS 서비스 및 리소스에 액세스할 권한이 있습니다. 보안 모범 사례는 사용자에게 관리 액세스 권한을 할당하고, 루트 사용자만 사용하여 [루트 사용자 액세스 권한이 필요한 작업](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)을 수행하는 것입니다.

AWS 는 가입 프로세스가 완료된 후 확인 이메일을 보냅니다. 언제든지 [https://aws.amazon.com/](https://aws.amazon.com/)으로 이동하고 **내 계정**을 선택하여 현재 계정 활동을 확인하고 계정을 관리할 수 있습니다.

#### 관리자 액세스 권한이 있는 사용자 생성
<a name="create-an-admin"></a>

에 가입한 후 일상적인 작업에 루트 사용자를 사용하지 않도록 관리 사용자를 AWS 계정보호 AWS IAM Identity Center, AWS 계정 루트 사용자활성화 및 생성합니다.

**보안 AWS 계정 루트 사용자**

1.  **루트 사용자를** 선택하고 AWS 계정 이메일 주소를 입력하여 계정 소유자[AWS Management Console](https://console.aws.amazon.com/)로에 로그인합니다. 다음 페이지에서 비밀번호를 입력합니다.

   루트 사용자를 사용하여 로그인하는 데 도움이 필요하면 *AWS Sign-In 사용 설명서*의 [루트 사용자로 로그인](https://docs.aws.amazon.com/signin/latest/userguide/console-sign-in-tutorials.html#introduction-to-root-user-sign-in-tutorial)을 참조하세요.

1. 루트 사용자의 다중 인증(MFA)을 활성화합니다.

   지침은 *IAM 사용 설명서*의 [AWS 계정 루트 사용자(콘솔)에 대한 가상 MFA 디바이스 활성화를 참조하세요](https://docs.aws.amazon.com/IAM/latest/UserGuide/enable-virt-mfa-for-root.html).

**관리자 액세스 권한이 있는 사용자 생성**

1. IAM Identity Center를 활성화합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [AWS IAM Identity Center설정](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-set-up-for-idc.html)을 참조하세요.

1. IAM Identity Center에서 사용자에게 관리 액세스 권한을 부여합니다.

   를 자격 증명 소스 IAM Identity Center 디렉터리 로 사용하는 방법에 대한 자습서는 사용 *AWS IAM Identity Center 설명서*[의 기본값으로 사용자 액세스 구성을 IAM Identity Center 디렉터리](https://docs.aws.amazon.com//singlesignon/latest/userguide/quick-start-default-idc.html) 참조하세요.

**관리 액세스 권한이 있는 사용자로 로그인**
+ IAM IDentity Center 사용자로 로그인하려면 IAM Identity Center 사용자를 생성할 때 이메일 주소로 전송된 로그인 URL을 사용합니다.

  IAM Identity Center 사용자를 사용하여 로그인하는 데 도움이 필요하면 *AWS Sign-In 사용 설명서*[의 AWS 액세스 포털에 로그인](https://docs.aws.amazon.com/signin/latest/userguide/iam-id-center-sign-in-tutorial.html)을 참조하세요.

**추가 사용자에게 액세스 권한 할당**

1. IAM Identity Center에서 최소 권한 적용 모범 사례를 따르는 권한 세트를 생성합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [Create a permission set](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-started-create-a-permission-set.html)를 참조하세요.

1. 사용자를 그룹에 할당하고, 그룹에 Single Sign-On 액세스 권한을 할당합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [그룹 추가](https://docs.aws.amazon.com//singlesignon/latest/userguide/addgroups.html)를 참조하세요.

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

이 설명서의 절차를 수행하기 위해서는 실행 명령줄을 입력할 쉘 또는 터미널이 필요합니다. 명령은 프롬프트 기호(\$1)와 해당하는 경우 현재 디렉터리 이름 뒤에 리스트로 표시됩니다.

```
~/eb-project$ this is a command
this is output
```

Linux 및 macOS의 경우 선호하는 쉘과 패키지 관리자를 사용할 수 있습니다. Windows의 경우 [Linux용 Windows Subsystem을 설치](https://docs.microsoft.com/en-us/windows/wsl/install-win10)하여 Ubuntu 및 Bash의 Windows 통합 버전을 가져옵니다.

### EB CLI
<a name="python-quickstart-prereq.ebcli"></a>

또한 본 자습서는 Elastic Beanstalk 명령줄 인터페이스(EB CLI)를 사용합니다. EB CLI 설치 및 구성에 대한 자세한 내용은 [설정 스크립트를 사용하여 EB CLI 설치(권장)](eb-cli3.md#eb-cli3-install) 및 [EB CLI 구성](eb-cli3-configuration.md) 단원을 참조하세요.

### Python 및 Flask 프레임워크
<a name="python-quickstart-prereq.runtime"></a>

다음 명령을 실행하여 `pip`가 설치된 Python 버전이 작동하는지 확인합니다.

```
~$ python3 --version
Python 3.N.N
>~$ python3 -m pip --version
pip X.Y.Z from ... (python 3.N.N)
```

이전 명령 중 하나라도 ‘*Python을 찾을 수 없음*’을 반환하는 경우 `python3` 대신 `python`을 사용하는 다음 명령을 실행합니다. 별칭 및 심볼 링크 설정은 운영 체제 및 개별 사용자 지정에 따라 다를 수 있으므로 시스템에서 `python3` 명령이 작동하지 않을 수 있습니다.

```
~$ python --version
Python 3.N.N
>~$ python -m pip --version
pip X.Y.Z from ... (python 3.N.N)
```

로컬 시스템에 Python이 설치되어 있지 않은 경우 [Python 웹 사이트의 Python 다운로드](https://www.python.org/downloads/) 페이지에서 다운로드할 수 있습니다. Elastic Beanstalk에서 지원하는 Python 언어 버전 목록은 **AWS Elastic Beanstalk 플랫폼 가이드의 [지원되는 Python 플랫폼](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.python)을 참조하세요. Python 다운로드 웹 사이트에서 설치 및 설정 지침을 찾을 수 있는 *Python 개발자 가이드* 링크를 제공합니다.

**참고**  
Python `pip` 패키지는 기본적으로 Python 3.4 이상에 포함됩니다.

출력에서 지원되는 버전의 Python이 있지만 `pip`는 없는 것으로 표시되면 *pip.pypa.io* 웹 사이트의 [설치](https://pip.pypa.io/en/stable/installation/) 페이지를 참조하세요. Python 환경에 없는 pip를 설치하는 방법을 안내합니다.



다음 명령을 실행하여 Flask가 설치되어 있는지 확인합니다.

```
~$ pip list | grep Flask
```

Flask가 설치되어 있지 않은 경우에는 다음 명령을 실행하여 설치합니다.

```
~$ pip install Flask
```

## 1단계: Python 애플리케이션 생성
<a name="python-quickstart-create-app"></a>

프로젝트 디렉터리를 만듭니다.

```
~$ mkdir eb-python
~$ cd eb-python
```

샘플 ‘Hello Elastic Beanstalk\$1’ Python 애플리케이션을 생성합니다. 나중에 Elastic Beanstalk를 사용하여 이를 배포할합니다.

방금 생성한 디렉토리에 다음 내용으로 `application.py` 텍스트 파일을 생성합니다.

**Example `~/eb-python/application.py`**  

```
from flask import Flask
application = Flask(__name__)

@application.route('/')
def hello_elastic_beanstalk():
        return 'Hello Elastic Beanstalk!'
```

다음 행으로 `requirements.txt` 텍스트 파일을 생성합니다. 이 파일에는 애플리케이션을 실행하는 데 필요한 `pip` 패키지가 포함되어 있습니다.

**Example `~/eb-python/requirements.txt`**  

```
Flask
```

## 2단계: 로컬에서 애플리케이션 실행
<a name="python-quickstart-run-local"></a>

다음 명령을 실행하여 애플리케이션을 로컬로 실행합니다.

```
~/eb-python$ export FLASK_APP=application.py && flask run --port 5000
```

다음과 유사한 출력 화면이 표시됩니다.

```
Serving Flask app 'application.py'
Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
Running on http://127.0.0.1:5000
Press CTRL+C to quit
127.0.0.1 - - [01/Jan/1970 00:00:00] "GET / HTTP/1.1" 200 -
```

웹 브라우저에서 `http://localhost:5000`으로 이동합니다. 웹 브라우저에 ‘Hello Elastic Beanstalk\$1’가 표시됩니다.

## 3단계: EB CLI를 사용하여 Python 애플리케이션 배포
<a name="python-quickstart-deploy"></a>

다음 명령을 실행하여 이 애플리케이션에 대한 Elastic Beanstalk 환경을 생성합니다.

 

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

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

   ```
   ~/eb-python$ eb init -p python-3.9 python-tutorial --region us-east-2
   ```

   이 명령은 `python-tutorial`이라는 애플리케이션을 생성하고 제공된 Python 플랫폼 버전을 통해 환경을 생성하도록 로컬 리포지토리를 구성합니다.

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

   ```
   ~/eb-python$ 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**로 해당 환경에 애플리케이션을 배포합니다. Elastic Beanstalk는 애플리케이션에 대한 zip 파일을 자동으로 빌드하고 포트 5000에서 시작합니다.

   ```
   ~/eb-python$ eb create python-env
   ```

   Elastic Beanstalk에서 환경을 생성하는 데 약 5분이 걸립니다.

## 4단계: Elastic Beanstalk에서 애플리케이션 실행
<a name="python-quickstart-run-eb-ap"></a>

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

```
~/eb-python$ eb open
```

축하합니다\$1 Elastic Beanstalk를 사용하여 Python 애플리케이션을 배포했습니다\$1 그러면 애플리케이션에 대해 생성된 도메인 이름을 사용하여 브라우저 창이 열립니다.

## 5단계: 정리
<a name="go-tutorial-cleanup"></a>

애플리케이션 작업을 완료하면 환경을 종료할 수 있습니다. Elastic Beanstalk는 환경과 연결된 모든 AWS 리소스를 종료합니다.

EB CLI를 사용하여 Elastic Beanstalk 환경을 종료하려면 다음 명령을 실행하세요.

```
~/eb-python$ eb terminate
```

## AWS 애플리케이션을 위한 리소스
<a name="python-quickstart-eb-resources"></a>

단일 인스턴스 애플리케이션을 생성했습니다. 이 애플리케이션은 단일 EC2 인스턴스를 사용하는 간단한 샘플 애플리케이션 역할을 하므로 로드 밸런싱이나 오토 스케일링이 필요하지 않습니다. 단일 인스턴스 애플리케이션의 경우 Elastic Beanstalk는 다음 AWS 리소스를 생성합니다.
+ **EC2 인스턴스** - 선택한 플랫폼에서 웹 앱을 실행하도록 구성된 Amazon EC2 가상 머신입니다.

  특정 언어 버전, 프레임워크, 웹 컨테이너 또는 조합을 지원하도록 각 플랫폼마다 실행하는 소프트웨어, 구성 파일 및 스크립트 세트가 다릅니다. 대부분의 플랫폼에서는 웹 앱 앞의 웹 트래픽을 처리하고, 웹 앱으로 요청을 전달하고, 정적 자산을 제공하고, 액세스 및 오류 로그를 생성하는 역방향 프록시로 Apache 또는 nginx를 사용합니다.
+ **인스턴스 보안 그룹** - 포트 80에서 수신 트래픽을 허용하도록 구성된 Amazon EC2 보안 그룹입니다. 이 리소스를 통해 로드 밸런서의 HTTP 트래픽이 웹 앱을 실행하는 EC2 인스턴스에 도달할 수 있습니다. 기본적으로 다른 포트에서는 트래픽이 허용되지 않습니다.
+ **Amazon S3 버킷(Amazon S3 bucket)** - Elastic Beanstalk 사용 시 생성된 소스 코드, 로그 및 기타 아티팩트의 스토리지 위치입니다.
+ **Amazon CloudWatch 경보** - 환경의 인스턴스에 대한 로드를 모니터링하는 두 개의 CloudWatch 경보로, 로드가 너무 높거나 너무 낮은 경우 트리거됩니다. 경보가 트리거되면 이에 대한 응답으로 Auto Scaling 그룹이 스케일 업 또는 축소됩니다.
+ **CloudFormation 스택** - Elastic Beanstalk는 CloudFormation 를 사용하여 환경에서 리소스를 시작하고 구성 변경 사항을 전파합니다. 리소스는 [CloudFormation 콘솔](https://console.aws.amazon.com/cloudformation)에서 볼 수 있는 템플릿에서 정의됩니다.
+  **도메인 이름(Domain name)** - **subdomain*.*region*.elasticbeanstalk.com* 형식으로 웹 앱으로 라우팅되는 도메인 이름입니다.

이러한 모든 리소스는 Elastic Beanstalk에서 관리합니다. 사용자가 환경을 종료하면 Elastic Beanstalk는 환경에 있는 모든 리소스를 종료합니다.

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

애플리케이션을 실행하는 환경이 있으면 언제든 다른 애플리케이션 또는 애플리케이션의 새 버전을 배포할 수 있습니다. EC2 인스턴스를 프로비저닝하거나 다시 시작할 필요가 없기 때문에 새 애플리케이션 버전을 매우 빠르게 배포할 수 있습니다. Elastic Beanstalk 콘솔을 사용하여 새로운 환경을 탐색할 수도 있습니다. 자세한 단계는 이 가이드의 *시작하기* 장의 [환경 탐색](GettingStarted.md#GettingStarted.Explore)을 참조하세요.

**더 많은 자습서 보기**  
다른 예제 애플리케이션으로 다른 자습서를 사용하려는 경우 다음 자습서를 참조하세요.  
[Elastic Beanstalk에 Flask 애플리케이션 배포](create-deploy-python-flask.md)
[Elastic Beanstalk에 Django 애플리케이션 배포](create-deploy-python-django.md)

샘플 애플리케이션을 하나 이상 배포하고 Python 애플리케이션을 로컬로 개발하고 실행할 준비가 되면 [Elastic Beanstalk를 위한 Python 개발 환경 설정](python-development-environment.md) 단원을 참조하십시오.

## Elastic Beanstalk 콘솔을 사용하여 배포
<a name="python-quickstart-console"></a>

Elastic Beanstalk 콘솔을 사용하여 샘플 애플리케이션을 시작할 수도 있습니다. 자세한 단계는 이 가이드의 *시작하기* 장의 [예제 애플리케이션 생성](GettingStarted.md#GettingStarted.CreateApp)을 참조하세요.

# Elastic Beanstalk를 위한 Python 개발 환경 설정
<a name="python-development-environment"></a>

이 주제에서는 AWS Elastic Beanstalk로 배포하기 전 로컬 컴퓨터에서 애플리케이션을 테스트하기 위해 Python 개발 환경을 설정하는 지침을 제공합니다. 또한 유용한 도구에 대한 설치 지침을 제공하는 웹 사이트도 알려줍니다.

이 설명서의 절차를 수행하기 위해서는 실행 명령줄을 입력할 쉘 또는 터미널이 필요합니다. 명령은 프롬프트 기호(\$1)와 해당하는 경우 현재 디렉터리 이름 뒤에 리스트로 표시됩니다.

```
~/eb-project$ this is a command
this is output
```

Linux 및 macOS의 경우 선호하는 쉘과 패키지 관리자를 사용할 수 있습니다. Windows의 경우 [Linux용 Windows Subsystem을 설치](https://docs.microsoft.com/en-us/windows/wsl/install-win10)하여 Ubuntu 및 Bash의 Windows 통합 버전을 가져옵니다.

**Topics**
+ [사전 조건](#python-common-prereq)
+ [가상 환경 사용](#python-common-setup-venv)
+ [Elastic Beanstalk에 대해 Python 프로젝트 구성](#python-common-configuring)

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

다음 목록에서는 Elastic Beanstalk 및 Python 애플리케이션 작업을 위한 일반적인 사전 조건을 알려 줍니다.
+ **Python 언어** - 선택한 Elastic Beanstalk Python 플랫폼 버전에 포함된 Python 언어 버전을 설치합니다. 지원되는 Python 언어 버전 목록은 *AWS Elastic Beanstalk 플랫폼* 가이드의 [지원되는 Python 플랫폼](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.python)을 참조하세요. 개발 시스템에 Python이 아직 설정되어 있지 않은 경우 Python 웹 사이트의 [Python 다운로드](https://www.python.org/downloads/) 페이지를 참조하세요.
+ **`pip` 유틸리티** - `pip` 유틸리티는 Python의 패키지 설치 관리자입니다. 이 설치 관리자는 프로젝트의 종속 항목을 설치하고 나열하여 Elastic Beanstalk가 애플리케이션 환경 설정법을 알 수 있도록 합니다. `pip`에 대한 자세한 내용은 *pip.pypa.io* 웹 사이트의 [pip 페이지](https://pip.pypa.io/en/stable/)를 참조하세요.
+ **(선택 사항) Elastic Beanstalk 명령줄 인터페이스(EB CLI)** - [EB CLI](eb-cli3.md)는 필요한 배포 파일로 애플리케이션을 패키징할 수 있습니다. 또한 Elastic Beanstalk 환경을 생성하고 이 환경에 애플리케이션을 배포할 수도 있습니다. Elastic Beanstalk 콘솔을 통해 배포할 수도 있으므로 EB CLI가 반드시 필요한 것은 아닙니다.
+ **작동 중인 `SSH` 설치** - SSH 프로토콜을 사용하여 실행 중인 인스턴스에 연결하여 배포를 검사하거나 디버깅할 수 있습니다.
+ **`virtualenv` 패키지** - 이 `virtualenv` 도구는 애플리케이션을 위한 개발 및 테스트 환경을 생성합니다. Elastic Beanstalk는 애플리케이션에서 필요하지 않은 추가 패키지를 설치하지 않고도 이 환경을 복제할 수 있습니다. 자세한 내용은 [virtualenv](https://virtualenv.pypa.io/en/latest/) 웹사이트를 참조하세요. Python을 설치한 후 다음 명령을 사용하여 `virtualenv` 패키지를 설치할 수 있습니다.

  ```
  $ pip install virtualenv
  ```

## 가상 환경 사용
<a name="python-common-setup-venv"></a>

필수 조건을 설치한 후 `virtualenv`으로 가상 환경을 설정하여 애플리케이션의 종속 항목을 설치합니다. 가상 환경을 사용하면 애플리케이션을 실행할 EC2 인스턴스에 설치 되어야 할 필수 패키지를 정확히 판별하여 설치할 수 있습니다.

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

1. 명령줄 창을 열고 다음을 입력합니다:

   ```
   $ virtualenv /tmp/eb_python_app
   ```

   *eb\$1python\$1app*을 애플리케이션에 적합한 이름으로 변경합니다(애플리케이션의 이름을 사용해도 좋습니다). `virtualenv` 명령은 지정된 디렉터리에 사용자 가상 환경을 생성한 후 해당 작업의 결과를 출력합니다:

   ```
   Running virtualenv with interpreter /usr/bin/python
   New python executable in /tmp/eb_python_app/bin/python3.12
   Also creating executable in /tmp/eb_python_app/bin/python
   Installing setuptools, pip...done.
   ```

1. 가상 환경이 준비되면 환경의 `activate` 디렉터리에 있는 `bin` 스크립트를 실행하여 가상 환경을 실행합니다. 예를 들어 이전 단계에서 생성한 **eb\$1python\$1app** 환경을 시작하려면 다음을 입력합니다:

   ```
   $ source /tmp/eb_python_app/bin/activate
   ```

   가상 환경에서는 각 명령 프롬프트의 시작 부분에서 이름을 출력(예: `(eb_python_app)`)하여 사용자가 Python 가상 환경에 있다는 사실을 알려줍니다.

1. 가상 환경 사용을 중단하고 설치된 모든 라이브러리를 포함하여 시스템의 기본 Python 인터프리터로 돌아가려면 `deactivate` 명령을 실행하세요.

   ```
   (eb_python_app) $ deactivate
   ```

**참고**  
생성한 후에는 `activate` 스크립트를 다시 실행하여 언제든 가상 환경을 다시 시작할 수 있습니다.

## Elastic Beanstalk에 대해 Python 프로젝트 구성
<a name="python-common-configuring"></a>

Elastic Beanstalk CLI를 사용하여 Elastic Beanstalk에 배포하도록 Python 애플리케이션을 준비할 수 있습니다.

**Elastic Beanstalk에 배포하도록 Python 애플리케이션을 구성하려면**

1. [가상 환경](#python-common-setup-venv)에서 프로젝트 디렉터리 트리(`python_eb_app`)의 상단으로 돌아가 다음을 입력합니다.

   ```
   pip freeze >requirements.txt
   ```

   이 명령은 가상 환경에 설치된 패키지의 이름과 버전을 `requirements.txt`로 복사합니다. 예를 들어 *PyYAML* 패키지의 경우, *3.11* 버전이 가상 환경에 설치되어 있으며 파일은 다음 행을 포함됩니다;

   ```
   PyYAML==3.11
   ```

   애플리케이션을 개발하고 테스트하는 데 사용하는 동일한 패키지와 버전을 통해 Elastic Beanstalk는 애플리케이션의 Python 환경을 복제할 수 있습니다.

1. **eb init** 명령으로 EB CLI 리포지토리를 구성합니다. 프롬프트 메시지에 따라 리전, 플랫폼 및 기타 옵션을 선택합니다.

기본적으로 Elastic Beanstalk는 `application.py`라는 파일을 찾아 애플리케이션을 시작합니다. 이 파일이 생성한 Python 프로젝트에 존재하지 않는 경우, 애플리케이션 환경을 일부 조정해야 합니다. 또한 애플리케이션의 모듈을 로드할 수 있도록 환경 변수를 설정해야 합니다. 자세한 내용은 [Elastic Beanstalk Python 플랫폼 사용](create-deploy-python-container.md)를 참조하세요.

# Elastic Beanstalk Python 플랫폼 사용
<a name="create-deploy-python-container"></a>

이 주제에서는 Elastic Beanstalk에서 Python 애플리케이션을 구성, 빌드 및 실행하는 방법을 설명합니다.

AWS Elastic Beanstalk 는 다양한 버전의 Python 프로그래밍 언어에 대해 여러 플랫폼 브랜치를 지원합니다. 전체 목록은 *AWS Elastic Beanstalk 플랫폼* 문서의 [Python](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.python)을 참조하세요.

Python 웹 애플리케이션은 WSGI를 사용하여 프록시 서버 뒤에서 실행할 수 있습니다. Elastic Beanstalk는 [Gunicorn](https://gunicorn.org/)을 기본 WSGI 서버로 제공합니다.

소스 번들에 `Procfile`를 추가하여 애플리케이션의 WSGI 서버를 지정하고 구성할 수 있습니다. 자세한 내용은 [Elastic Beanstalk에서 Procfile을 사용하여 WSGI 서버 구성](python-configuration-procfile.md) 단원을 참조하십시오.

Pipenv에서 생성된 `Pipfile` 및 `Pipfile.lock` 파일을 통해 Python 패키지 종속 파일 및 기타 요구 사항을 지정할 수 있습니다. 종속 파일에 대한 자세한 내용은 [Elastic Beanstalk에서 요구 서헝 파일을 사용하여 종속성 지정](python-configuration-requirements.md)을 참조하십시오.

Elastic Beanstalk가 제공하는 [구성 옵션](command-options.md)을 통해 Elastic Beanstalk 환경EC2 인스턴스에서 실행하는 소프트웨어를 사용자 맞춤형으로 사용할 수 있습니다. 애플리케이션에 필요한 환경 변수를 구성하고, Amazon S3의 로그 로테이션을 활성화하며, 정적 파일을 포함한 애플리케이션 소스 폴더를 프록시 서버에서 제공하는 경로로 매핑할 수 있습니다.

[실행 환경 구성을 수정](environment-configuration-methods-after.md)하기 위해 Elastic Beanstalk 콘솔의 구성 옵션을 사용할 수 있습니다. [저장된 구성](environment-configuration-savedconfig.md)을 사용해 설정을 저장하면 환경 종료 시 구성이 훼손되지 않도록 할 수 있으며, 추후 기타 환경에서도 적용할 수 있습니다.

소스 코드에 설정을 저장하려면 [구성 파일](ebextensions.md)을 포함시킬 수 있습니다. 구성 파일 설정은 환경을 생성하거나 애플리케이션을 배포할 때마다 적용됩니다. 구성 파일을 사용하여 패키지를 설치하거나, 스크립트를 실행하거나, 배포 중 기타 인스턴스 사용자 지정 작업을 수행할 수 있습니다.

Elastic Beanstalk 콘솔에 적용된 설정이 구성 파일에 적용된 동일한 설정(있는 경우)을 덮어씁니다. 이렇게 함으로써 구성 파일은 기본 설정을 갖는 동시에 콘솔에서 환경 특정 설정으로 설정을 덮어 쓸 수 있습니다. 우선 적용 및 기타 설정 변경법에 대한 자세한 내용은 [구성 옵션](command-options.md)을 참조하십시오.

`pip`에서 사용할 수 있는 Python 패키지의 경우 애플리케이션 소스 코드 루트에 필수 요구 파일을 포함할 수 있습니다. Elastic Beanstalk에서는 배포 과정에서 필수 요구 파일이 지정한 모든 종속 패키지 설치합니다. 자세한 내용은 [Elastic Beanstalk에서 요구 서헝 파일을 사용하여 종속성 지정](python-configuration-requirements.md)을 참조하세요.

Elastic Beanstalk Linux 기반 플랫폼 확장을 위한 다양한 방법은 [Elastic Beanstalk Linux 플랫폼 확장](platforms-linux-extend.md)을 참조하세요.

## Python 환경 구성
<a name="create-deploy-python-container-console"></a>

Python 플랫폼 설정을 통해 Amazon EC2 인스턴스를 상세히 조정할 수 있습니다. Elastic Beanstalk 콘솔을 통해 Elastic Beanstalk 환경의 Amazon EC2 인스턴스 구성을 편집할 수 있습니다.

Elastic Beanstalk 콘솔을 사용하여 Python 프로세스 설정을 구성하고, Amazon S3에 대한 AWS X-Ray로그 교체를 활성화하고, 애플리케이션이 환경에서 읽을 수 있는 변수를 구성합니다.

**Elastic Beanstalk 콘솔에서 Python 환경을 구성하려면**

1. [Elastic Beanstalk 콘솔](https://console.aws.amazon.com/elasticbeanstalk)을 열고 **리전** 목록에서를 선택합니다 AWS 리전.

1. 탐색 창에서 **환경**을 선택한 다음 목록에서 환경의 이름을 선택합니다.

1. 탐색 창에서 **구성**을 선택합니다.

1. **업데이트, 모니터링 및 로깅** 구성 범주에서 **편집**을 선택합니다.

### Python 설정
<a name="python-console-settings"></a>
+ **프록시 서버** – 환경 인스턴스에서 사용할 프록시 서버입니다. 기본적으로 nginx를 사용합니다.
+ **WSGI 경로** – 기본 애플리케이션 파일의 이름 또는 경로입니다. 예를 들어 `application.py` 또는 `django/wsgi.py`입니다.
+ **NumProcesses** – 각 애플리케이션 인스턴스에서 실행할 프로세스 수입니다.
+ **NumThreads** – 각 프로세스에서 실행할 스레드 수입니다.

### AWS X-Ray 설정
<a name="python-console-xray"></a>
+ **X-Ray 데몬** - AWS X-Ray 데몬을 실행하여의 트레이스 데이터를 처리합니다[AWS X-Ray SDK for Python](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-python.html).

### 로그 옵션
<a name="create-deploy-python-container.console.logoptions"></a>

로그 옵션 섹션에는 다음의 두 가지 설정이 있습니다:
+ **인스턴스 프로파일(Instance profile)** - 애플리케이션과 연결된 Amazon S3 버킷으로의 액세스할 권한이 있는 인스턴스 프로파일을 지정합니다.
+ **Amazon S3로의 로그 파일 로테이션 활성화(Enable log file rotation to Amazon S3)** – 애플리케이션과 연결된 Amazon S3 버킷에 애플리케이션의 Amazon EC2 인스턴스 로그 파일을 복사하는지 여부를 지정합니다.

### 정적 파일
<a name="python-platform-staticfiles"></a>

성능을 증진하려면 **정적 파일(Static files)** 섹션에서 프록시 서버를 구성하여 웹 애플리케이션 내부 디렉터리 집합으로 정적 파일(예: HTML 또는 이미지)을 제공할 수 있습니다. 각 디렉터리의 디렉터리 매핑 가상 경로를 설정합니다. 지정된 경로에서 프록시 서버가 파일 요청을 수신받으면 요청을 애플리케이션으로 라우팅하지 않고 파일을 직접 제공합니다.

구성 파일 또는 Elastic Beanstalk 콘솔을 사용하여 정적 파일을 구성법에 대한 자세한 내용은 [정적 파일 제공](environment-cfg-staticfiles.md)을 참조하세요.

기본적으로 Python 환경의 프록시 서버는 `static` 경로의 `/static` 폴더에서 모든 파일을 제공합니다. 예를 들어 애플리케이션 소스에 `logo.png` 폴더의 `static` 파일이 포함되어 있는 경우 프록시 서버는 `subdomain.elasticbeanstalk.com/static/logo.png`에서 이 파일을 사용자에게 제공합니다. 본 섹션에서 설명한 대로 추가 매핑을 구성할 수 있습니다.

### 환경 속성
<a name="create-deploy-python-custom-container-envprop"></a>

환경 속성을 사용하여 애플리케이션에 정보를 제공하고 환경 변수를 구성할 수 있습니다. 예를 들어 `CONNECTION_STRING`라는 환경 속성을 생성하여 애플리케이션을 데이터베이스로 연결하는 연결 문자열을 지정할 수 있습니다.

Elastic Beanstalk에서 실행 중인 Python 환경 내에서 Python의 `os.environ` 딕셔너리를 통해 이러한 값에 액세스할 수 있습니다. 자세한 내용은 [http://docs.python.org/library/os.html](http://docs.python.org/library/os.html)을 참조하십시오.

다음과 유사한 코드를 사용하여 키 및 파라미터에 액세스할 수 있습니다.

```
import os
endpoint = os.environ['API_ENDPOINT']
```

환경 속성을 통해 프레임워크로 정보를 제공할 수도 있습니다. 예를 들어 특정 설정 모듈을 사용하도록 하는 `DJANGO_SETTINGS_MODULE`라는 속성을 생성하여 Django를 구성할 수 있습니다. 환경에 따라 이 값은 `development.settings`, `production.settings` 등이 될 수 있습니다.

자세한 정보는 [환경 변수 및 기타 소프트웨어 설정](environments-cfg-softwaresettings.md)을 참조하세요.

## Python 구성 네임스페이스
<a name="python-namespaces"></a>

[구성 파일](ebextensions.md)을 사용하여 구성 옵션을 설정하고 배포 중 다른 인스턴스 구성 작업을 수행할 수 있습니다. 구성 옵션은 [플랫폼별](command-options-specific.md)로 다르거나 Elastic Beanstalk 서비스의 [모든 플랫폼](command-options-general.md)에 전체적으로 적용될 수 있습니다. 구성 옵션은 *네임스페이스*로 구성됩니다.

Python 플랫폼 옵션은 `aws:elasticbeanstalk:environment:proxy`, `aws:elasticbeanstalk:environment:proxy:staticfiles` 및 `aws:elasticbeanstalk:container:python` 네임스페이스에서 정의됩니다.

다음 예제 구성 파일에서는 `DJANGO_SETTINGS_MODULE`라는 환경 속성을 생성하기 위한 구성 옵션 설정을 지정하고, Apache 프록시 서버를 선택하고, `statichtml`이라는 디렉터리를 `/html` 경로에 매핑하고, `staticimages`라는 디렉터리를 `/images` 경로로 매핑하는 두 개의 정적 파일 옵션을 지정하고, `[aws:elasticbeanstalk:container:python](command-options-specific.md#command-options-python)` 네임스페이스의 추가 설정을 지정합니다. 이 네임스페이스는 소스 코드의 WSGI 스크립트 위치 및 WSGI에서 실행할 스레드와 프로세스 수를 지정할 수 있는 옵션을 포함하고 있습니다.

```
option_settings:
  aws:elasticbeanstalk:application:environment:
    DJANGO_SETTINGS_MODULE: production.settings
  aws:elasticbeanstalk:environment:proxy:
    ProxyServer: apache
  aws:elasticbeanstalk:environment:proxy:staticfiles:
    /html: statichtml
    /images: staticimages
  aws:elasticbeanstalk:container:python:
    WSGIPath: ebdjango.wsgi:application
    NumProcesses: 3
    NumThreads: 20
```

**참고**  
Amazon Linux AMI Python 플랫폼 버전(Amazon Linux 2 이전)을 사용하는 경우 `WSGIPath`의 값을 `ebdjango/wsgi.py`로 변경합니다. Gunicorn WSGI 서버에서 작동하는 예제의 값은 Amazon Linux AMI 플랫폼 버전에서는 지원되지 않습니다.
또한 이러한 이전 플랫폼 버전에서는 정적 파일(`aws:elasticbeanstalk:container:python:staticfiles`)을 구성하는 데 다른 네임스페이스를 사용합니다. 옵션 이름 및 의미는 표준 정적 파일 네임스페이스와 동일합니다.

또한 구성 파일은 [사용자 환경 인스턴스에서 소프트웨어를 추가로 수정](customize-containers-ec2.md)할 수 있는 키 몇 가지를 지원합니다. 이 예제에서는 [패키지](customize-containers-ec2.md#linux-packages) 키를 통해 `yum` Memcached를 설치하고, [컨테이너 명령](customize-containers-ec2.md#linux-container-commands)을 통해 배포 중 서버 구성 명령을 실행합니다:

```
packages:
  yum:
    libmemcached-devel: '0.31'

container_commands:
  collectstatic:
    command: "django-admin.py collectstatic --noinput"
  01syncdb:
    command: "django-admin.py syncdb --noinput"
    leader_only: true
  02migrate:
    command: "django-admin.py migrate"
    leader_only: true
  03wsgipass:
    command: 'echo "WSGIPassAuthorization On" >> ../wsgi.conf'
  99customize:
    command: "scripts/customize.sh"
```

Elastic Beanstalk는 사용자가 환경을 맞춤형으로 지정할 수 있는 다양한 구성 옵션을 제공합니다. 구성 파일 외에 콘솔, 저장된 구성, EB CLI 또는 AWS CLI를 통해 구성 옵션을 설정할 수도 있습니다. 자세한 정보는 [구성 옵션](command-options.md)을 참조하세요.

## `python3` 실행 파일
<a name="python3-executable"></a>

Elastic Beanstalk의 Python 환경에서 EC2 인스턴스에 설치된 `python3` 실행 파일의 버전은 플랫폼에서 사용되는 Python 버전과 일치하지 않을 수 있습니다. 예를 들어 Python 3.12 AL2023 플랫폼에서는 `/usr/bin/python3`가 Python 3.9를 가리킵니다. 이는 AL2023에서 Python 3.9가 *시스템 Python*이기 때문입니다. 자세한 내용은 *Amazon Linux 2023 사용 설명서*의 [AL2023의 Python](https://docs.aws.amazon.com/linux/al2023/ug/python.html)을 참조하세요. 플랫폼에서 사용하는 Python 버전에 해당하는 실행 파일은 버전이 지정된 경로(예: `/usr/bin/python3.12`)나 애플리케이션 가상 환경 `bin` 디렉터리(예: `/var/app/venv/staging-LQM1lest/bin/python3`)에서 액세스할 수 있습니다. 플랫폼에서는 플랫폼 브랜치에 해당하는 올바른 Python 실행 파일이 사용됩니다.

# Elastic Beanstalk에서 Procfile을 사용하여 WSGI 서버 구성
<a name="python-configuration-procfile"></a>

소스 번들에 [`Procfile`](platforms-linux-extend.build-proc.md#platforms-linux-extend.proc)를 추가하여 애플리케이션의 WSGI 서버를 지정하고 구성할 수 있습니다. `Procfile`에서 사용자 지정 시작 및 실행 명령을 지정할 수 있습니다.

`Procfile`를 사용하면 구성 파일로 설정한 `aws:elasticbeanstalk:container:python` 네임스페이스 옵션이 덮어쓰여집니다.

다음 예제에서는 `Procfile`를 통해 uWSGI를 서버로 지정하고 구성합니다.

**Example Procfile**  

```
web: uwsgi --http :8000 --wsgi-file application.py --master --processes 4 --threads 2
```

다음 예제에서는 `Procfile`를 통해 기본 WSGI 서버인 Gunicorn을 구성합니다.

**Example Procfile**  

```
web: gunicorn --bind :8000 --workers 3 --threads 2 project.wsgi:application
```

**주의**  
Gunicorn이 아닌 WSGI 서버를 구성하는 경우, 환경 인스턴스에 설치될 수 있도록 애플리케이션의 종속 파일로 지정해야 합니다. 종속 사양에 대한 자세한 내용은 [Elastic Beanstalk에서 요구 서헝 파일을 사용하여 종속성 지정](python-configuration-requirements.md)을 참조하십시오.
WSGI 서버의 기본 포트는 8000입니다. `Procfile` 명령에서 다른 포트를 지정하는 경우, `PORT` [환경 속성](environments-cfg-softwaresettings.md) 역시 이 포트로 설정해야 합니다.

# Elastic Beanstalk에서 요구 서헝 파일을 사용하여 종속성 지정
<a name="python-configuration-requirements"></a>

이 주제에서는 필요한 다른 Python 패키지를 설치하도록 애플리케이션을 구성하는 방법을 설명합니다. 일반적으로 Python 애플리케이션은 타사 Python 패키지에 대한 종속 파일을 가지고 있습니다. Elastic Beanstalk Python 플랫폼에서는 애플리케이션에 필요한 Python 패키지를 지정하는 몇 가지 방법을 제공합니다.

## `pip` 및 `requirements.txt` 사용
<a name="python-configuration-requirements.txt"></a>

Python 패키지를 설치하기 위한 표준 도구는 `pip`입니다. 이는 단일 필수 요구 파일에 필요한 모든 패키지(버전 포함)를 지정할 수 있는 기능을 보유하고 있습니다. 필수 요구 파일에 대한 자세한 내용은 [필수 요구 파일 형식](https://pip.pypa.io/en/latest/reference/requirements-file-format/#requirements-file-format)을 참조하십시오.

`requirements.txt`이라는 파일을 생성하고 소스 번들의 최상위 디렉터리에 배치합니다. 다음은 Django `requirements.txt` 파일의 예입니다.

```
Django==2.2
mysqlclient==2.0.3
```

개발 환경에서 `pip freeze` 명령을 통해 필수 요구 파일을 생성할 수 있습니다.

```
~/my-app$ pip freeze > requirements.txt
```

필수 요구 파일에 애플리케이션에서 실제 사용되는 패키지만 포함되었는지 여부를 확인하려면 설치된 패키지만 포함하는 [가상 환경](python-development-environment.md#python-common-setup-venv)을 사용합니다. 가상 환경 외부에서 `pip freeze` 출력에는 운영 체제와 함께 제공되는 패키지 등 개발 장치에 설치된 모든 `pip` 패키지가 포함됩니다.

**참고**  
Elastic Beanstalk는 Amazon Linux AMI Python 플랫폼 버전에서 기본적으로 Pipenv 또는 Pipfiles를 지원하지 않습니다. Pipenv를 통해 애플리케이션 종속 파일을 관리하는 경우 다음 명령을 사용하여 `requirements.txt` 파일을 생성합니다.  

```
~/my-app$ pipenv lock -r > requirements.txt
```
자세한 내용은 Pipenv 설명서의 [requirements.txt 생성](https://pipenv.readthedocs.io/en/latest/advanced/#generating-a-requirements-txt)을 참조하십시오.

## Pipenv 및 `Pipfile` 사용
<a name="python-configuration-requirements.pipenv"></a>

Pipenv는 최신 Python 패키징 도구입니다. 이 도구는 종속 파일의 생성 및 관리에, 애플리케이션 virtualenv에 패키지 설치를 결합합니다. 자세한 내용은 [Pipenv: 인간 Python 개발 워크플로(Python Dev Workflow for Humans)](https://pipenv.readthedocs.io/en/latest/)를 참조하십시오.

Pipenv는 두 개의 파일을 유지 관리합니다: 
+ `Pipfile`— 이 파일에는 다양한 유형의 종속 파일 및 필수 요구가 포함되어 있습니다.
+ `Pipfile.lock`— 이 파일에는 결정적 빌드를 지원하는 버전 스냅샷이 포함되어 있습니다.

해당 파일들을 개발 환경에서 생성한 후, Elastic Beanstalk에 배포하는 소스 번들에 포함시킵니다. 이 두 파일에 대한 자세한 내용은 [Pipfile 및 Pipfile.lock 예제](https://pipenv.pypa.io/en/latest/basics/#)를 참조하십시오.



다음의 예제에서는 Pipenv를 통해 Django 및 Django REST 프레임워크를 설치합니다. 이 명령을 통해 `Pipfile` 및 `Pipfile.lock`파일을 생성합니다.

```
~/my-app$ pipenv install django
~/my-app$ pipenv install djangorestframework
```

 

## 우선 순위
<a name="python-configuration-requirements.precedence"></a>

본 설명의 필수 요구 파일 중 하나 이상이 포함될 경우 Elastic Beanstalk는 해당 파일 중 하나만 사용합니다. 다음 목록은 우선 순위를 내림차순으로 보여 줍니다.

1. `requirements.txt`

1. `Pipfile.lock`

1. `Pipfile`

**참고**  
2023년 3월 7일 Amazon Linux 2 플랫폼 릴리스부터 이러한 파일이 두 개 이상 제공 될 경우, Elastic Beanstalk는 배포 과정에서 복수 개의 파일 중 어떤 종속 파일이 사용되었는지를 콘솔 메시지에 표시합니다.

다음 단계에서는 인스턴스를 배포할 시 Elastic Beanstalk가 종속 파일을 설치하는 로직을 설명합니다.
+ `requirements.txt`파일이 있으면 `pip install -r requirements.txt`명령을 사용합니다.
+ 2023년 3월 7일 Amazon Linux 2 플랫폼 릴리스부터 `requirements.txt` 파일이 없지만 `Pipfile.lock`파일이 있는 경우 `pipenv sync`명령을 사용해야 합니다. 해당 릴리스 이전에는 `pipenv install --ignore-pipfile`을 사용했습니다.
+ `requirements.txt` 파일도 `Pipfile.lock` 파일도 없지만 `Pipfile`이 있는 경우 `pipenv install --skip-lock`명령을 사용합니다.
+ 세 가지 필구 요구 파일을 찾을 수 없는 경우 모든 애플리케이션 종속 파일을 설치하지 않습니다.

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

이 자습서에서는 Flask 애플리케이션을 생성하고 AWS Elastic Beanstalk 환경에 배포하는 프로세스를 안내합니다. Flask는 Python용 오픈 소스 웹 애플리케이션 프레임워크입니다.

이 자습서에서는 다음을 수행합니다.
+ [Flask로 Python 가상 환경 설정](#python-flask-setup-venv)
+ [Flask 애플리케이션 생성](#python-flask-create-app)
+ [EB CLI를 사용하여 사이트 배포](#python-flask-deploy) 
+ [정리](#python-flask-tutorial-cleanup) 

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

이 자습서에서는 사용자가 기본 Elastic Beanstalk 작업 및 Elastic Beanstalk 콘솔에 대해 어느 정도 알고 있다고 가정합니다. 아직 그렇지 않은 경우 [Elastic Beanstalk를 시작하는 방법 알아보기](GettingStarted.md)의 지침에 따라 첫 Elastic Beanstalk 환경을 시작합니다.

이 설명서의 절차를 수행하기 위해서는 실행 명령줄을 입력할 쉘 또는 터미널이 필요합니다. 명령은 프롬프트 기호(\$1)와 해당하는 경우 현재 디렉터리 이름 뒤에 리스트로 표시됩니다.

```
~/eb-project$ this is a command
this is output
```

Linux 및 macOS의 경우 선호하는 쉘과 패키지 관리자를 사용할 수 있습니다. Windows의 경우 [Linux용 Windows Subsystem을 설치](https://docs.microsoft.com/en-us/windows/wsl/install-win10)하여 Ubuntu 및 Bash의 Windows 통합 버전을 가져옵니다.

이 자습서에서는 Python 3.11과 해당 Elastic Beanstalk 플랫폼 버전을 사용합니다. [Elastic Beanstalk를 위한 Python 개발 환경 설정](python-development-environment.md)의 지침을 따라서 Python을 설치합니다.

자습서의 일부로 [Flask](http://flask.pocoo.org/) 프레임워크가 설치됩니다.

또한 본 자습서는 Elastic Beanstalk 명령줄 인터페이스(EB CLI)를 사용합니다. EB CLI 설치 및 구성에 대한 자세한 내용은 [설정 스크립트를 사용하여 EB CLI 설치(권장)](eb-cli3.md#eb-cli3-install) 및 [EB CLI 구성](eb-cli3-configuration.md) 단원을 참조하세요.

## Flask로 Python 가상 환경 설정
<a name="python-flask-setup-venv"></a>

애플리케이션에 대한 프로젝트 디렉터리와 가상 환경을 생성한 후 Flask를 설치합니다.

**프로젝트 환경을 설정하려면**

1. 프로젝트 디렉터리를 만듭니다.

   ```
   ~$ mkdir eb-flask
   ~$ cd eb-flask
   ```

1. 이름이 `virt`인 가상 환경을 만들어 활성화합니다.

   ```
   ~/eb-flask$ virtualenv virt
   ~$ source virt/bin/activate
   (virt) ~/eb-flask$
   ```

   명령 프롬프트 앞에 추가된 `(virt)`가 보일 것입니다. 이는 가상 환경에 있음을 나타냅니다. 이 자습서의 나머지 부분에서는 가상 환경을 사용합니다.

1. `pip install`을 사용하여 flask를 설치합니다.

   ```
   (virt)~/eb-flask$ pip install flask==3.0.3
   ```

1. `pip freeze`를 사용하여 설치된 라이브러리를 조회합니다.

   ```
   (virt)~/eb-flask$ pip freeze
   blinker==1.8.2
   click==8.1.7
   Flask==3.0.3
   importlib_metadata==8.5.0
   itsdangerous==2.2.0
   Jinja2==3.1.4
   MarkupSafe==2.1.5
   Werkzeug==3.0.4
   zipp==3.20.2
   ```

   이 명령은 가상 환경에 설치된 모든 패키지를 나열합니다. 가상 환경에 있기 때문에 EB CLI와 같은 전역 설치된 패키지는 표시되지 않습니다.

1. `pip freeze`의 출력을 `requirements.txt`이라는 파일에 저장합니다.

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

   이 파일은 배포 중 라이브러리를 설치하도록 Elastic Beanstalk에 명령합니다. 자세한 내용은 [Elastic Beanstalk에서 요구 서헝 파일을 사용하여 종속성 지정](python-configuration-requirements.md)을(를) 참조하세요.

## Flask 애플리케이션 생성
<a name="python-flask-create-app"></a>

그 다음 Elastic Beanstalk를 사용하여 배포할 애플리케이션을 만듭니다. "Hello World" RESTful 웹 서비스를 만듭니다.

다음 내용을 포함하며 이름이 `application.py`인 디렉터리에 새 텍스트 파일을 만듭니다.

**Example `~/eb-flask/application.py`**  

```
from flask import Flask

# print a nice greeting.
def say_hello(username = "World"):
    return '<p>Hello %s!</p>\n' % username

# some bits of text for the page.
header_text = '''
    <html>\n<head> <title>EB Flask Test</title> </head>\n<body>'''
instructions = '''
    <p><em>Hint</em>: This is a RESTful web service! Append a username
    to the URL (for example: <code>/Thelonious</code>) to say hello to
    someone specific.</p>\n'''
home_link = '<p><a href="/">Back</a></p>\n'
footer_text = '</body>\n</html>'

# EB looks for an 'application' callable by default.
application = Flask(__name__)

# add a rule for the index page.
application.add_url_rule('/', 'index', (lambda: header_text +
    say_hello() + instructions + footer_text))

# add a rule when the page is accessed with a name appended to the site
# URL.
application.add_url_rule('/<username>', 'hello', (lambda username:
    header_text + say_hello(username) + home_link + footer_text))

# run the app.
if __name__ == "__main__":
    # Setting debug to True enables debug output. This line should be
    # removed before deploying a production app.
    application.debug = True
    application.run()
```

다음 예시는 서비스 액세스에 사용되는 경로에 따라 달라지는 맞춤화된 인사말을 출력합니다.

**참고**  
애플리케이션을 실행하기 전 `application.debug = True`를 추가하여 오류가 발생하는 경우 디버그 출력을 활성화합니다. 개발할 때는 이렇게 하는 것이 좋지만, 디버그 출력을 통해 애플리케이션의 내부 특성이 드러날 수 있기 때문에 프로덕션 코드에서는 디버그 문을 제거해야 합니다.

`application.py`를 파일 이름으로 사용하고 호출할 수 있는 `application` 객체(이 경우 Flask 객체)를 제공하면, Elastic Beanstalk는 애플리케이션 코드를 쉽게 찾을 수 있습니다.

Python으로 `application.py`를 실행합니다.

```
(virt) ~/eb-flask$ python application.py
 * Serving Flask app "application" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 313-155-123
```

웹 브라우저에서 `http://127.0.0.1:5000/`을 엽니다. 인덱스 페이지가 표시되며 애플리케이션이 실행하는 것을 확인할 수 있습니다.

![\[Web browser displaying "Hello World!" message and a hint about RESTful web service usage.\]](http://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/images/eb_flask_test_local.png)


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

디버그 출력이 대신 나타나는 경우, 오류를 수정하고 애플리케이션이 로컬에서 실행 중인지 확인한 다음 Elastic Beanstalk에 맞게 구성합니다.

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

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

```
~/eb-flask/
|-- virt
|-- application.py
`-- requirements.txt
```

하지만 애플리케이션이 Elastic Beanstalk에서 실행하는 데 `virt` 폴더는 필요하지 않습니다. 배포 시, Elastic Beanstalk는 서버 인스턴스에 가상 환경을 새로 만든 후 `requirements.txt`에 명시된 라이브러리를 설치합니다. 배포 중 업로드하는 소스 번들의 크기를 최소화하기 위해, `virt` 폴더를 배제하도록 EB CLI에 명령하는 [.ebignore](eb-cli3-configuration.md#eb-cli3-ebignore) 파일을 추가합니다.

**Example \$1/eb-flask/.ebignore**  

```
virt
```

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

**환경을 만들고 Flask 애플리케이션을 배포하려면**

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

   ```
   ~/eb-flask$ eb init -p python-3.11 flask-tutorial --region us-east-2
   Application flask-tutorial has been created.
   ```

   이 명령은 라는 새 애플리케이션을 `flask-tutorial` 생성하고 최신 Python 3.11 플랫폼 버전으로 환경을 생성하도록 로컬 리포지토리를 구성합니다.

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

   ```
   ~/eb-flask$ 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**로 해당 환경에 애플리케이션을 배포합니다.

   ```
   ~/eb-flask$ eb create flask-env
   ```

다음 리소스를 사용해 환경을 생성하는 데 약 5분 가량 걸립니다.
+ **EC2 인스턴스(EC2 instance)** - 선택한 플랫폼에서 웹 앱을 실행하도록 구성된 Amazon Elastic Compute Cloud(Amazon EC2) 가상 머신입니다.

  특정 언어 버전, 프레임워크, 웹 컨테이너 또는 그 조합을 지원하도록 각 플랫폼마다 특정 소프트웨어, 구성 파일 및 스크립트 세트를 실행합니다. 대부분의 플랫폼에서는 웹 앱 앞에 위치해 웹 앱으로 요청을 전달하고, 정적 자산을 제공하고, 액세스 및 오류 로그를 생성하는 역방향 프록시로 Apache 또는 NGINX를 사용합니다.
+ **인스턴스 보안 그룹(Instance security group)** - 포트 80에서 인바운드 트래픽을 허용하도록 구성된 Amazon EC2 보안 그룹입니다. 이 리소스를 통해 로드 밸런서의 HTTP 트래픽이 웹 앱을 실행하는 EC2 인스턴스에 도달할 수 있습니다. 기본적으로 다른 포트에서는 트래픽이 허용되지 않습니다.
+ **로드 밸런서(Load balancer)** - 애플리케이션을 실행하는 인스턴스로 요청을 분산하도록 구성된 Elastic Load Balancing 로드 밸런서입니다. 또한 로드 밸런서가 있으면 인터넷에 인스턴스를 직접 노출할 필요가 없습니다.
+ **로드 밸런서 보안 그룹(Load balancer security group)** - 포트 80에서 인바운드 트래픽을 허용하도록 구성된 Amazon EC2 보안 그룹입니다. 이 리소스를 통해 인터넷의 HTTP 트래픽이 로드 밸런서에 도달할 수 있습니다. 기본적으로 다른 포트에서는 트래픽이 허용되지 않습니다.
+ **Auto Scaling 그룹(Auto Scaling group)** - 인스턴스가 종료되거나 사용할 수 없게 될 경우 인스턴스를 대체하도록 구성된 Auto Scaling 그룹입니다.
+ **Amazon S3 버킷(Amazon S3 bucket)** - Elastic Beanstalk 사용 시 생성된 소스 코드, 로그 및 기타 아티팩트의 스토리지 위치입니다.
+ **Amazon CloudWatch 경보(Amazon CloudWatch alarms)** - 환경의 인스턴스에 대한 로드를 모니터링하는 두 개의 CloudWatch 경보로, 로드가 너무 높거나 너무 낮은 경우 트리거됩니다. 경보가 트리거되면 이에 대한 응답으로 Auto Scaling 그룹이 확장 또는 축소됩니다.
+ **CloudFormation 스택** - Elastic Beanstalk는 CloudFormation 를 사용하여 환경에서 리소스를 시작하고 구성 변경 사항을 전파합니다. 리소스는 [CloudFormation 콘솔](https://console.aws.amazon.com/cloudformation)에서 볼 수 있는 템플릿에서 정의됩니다.
+ **도메인 이름(Domain name)** - **subdomain*.*region*.elasticbeanstalk.com* 형식으로 웹 앱으로 라우팅되는 도메인 이름입니다.
**도메인 보안**  
Elastic Beanstalk 애플리케이션의 보안을 강화하기 위해 *elasticbeanstalk.com* 도메인이 [공개 서픽스 목록(PSL)](https://publicsuffix.org/)에 등록되어 있습니다.  
Elastic Beanstalk 애플리케이션의 기본 도메인 이름에 민감한 쿠키를 설정해야 하는 경우 보안을 강화하기 위해 `__Host-` 접두사가 있는 쿠키를 사용하는 것이 좋습니다. 이렇게 쿠키를 설정하면 교차 사이트 요청 위조 시도(CSRF)로부터 도메인이 보호됩니다. 자세한 내용은 Mozilla 개발자 네트워크의 [Set-Cookie](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#cookie_prefixes) 페이지를 참조하세요.

이러한 모든 리소스는 Elastic Beanstalk에서 관리합니다. 사용자가 환경을 종료하면 Elastic Beanstalk는 환경에 있는 모든 리소스를 종료합니다.

**참고**  
Elastic Beanstalk에서 생성하는 Amazon S3 버킷은 환경 간에 공유되며 환경을 종료해도 삭제되지 않습니다. 자세한 내용은 [Amazon S3에서 Elastic Beanstalk 사용](AWSHowTo.S3.md)을(를) 참조하세요.

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

```
~/eb-flask$ eb open
```

그러면 애플리케이션에 대해 생성된 도메인 이름을 사용하여 브라우저 창이 열립니다. 로컬에서 만들고 테스트한 Flask 웹 사이트를 확인할 수 있습니다.

![\[Browser window displaying a Flask web application with a "Hello World!" message and usage hint.\]](http://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/images/eb_flask_deployed.png)


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

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

## 정리
<a name="python-flask-tutorial-cleanup"></a>

데모 코드 작업을 마치면 환경을 종료할 수 있습니다. Elastic Beanstalk는 [Amazon EC2 인스턴스](using-features.managing.ec2.md), [데이터베이스 인스턴스](using-features.managing.db.md), [로드 밸런서](using-features.managing.elb.md), 보안 그룹 및 [경보](using-features.alarms.md#using-features.alarms.title)와 같은 모든 관련 AWS 리소스를 삭제합니다.

리소스를 제거해도 Elastic Beanstalk 애플리케이션은 삭제되지 않으므로 언제든 애플리케이션을 위한 새 환경을 생성할 수 있습니다.

**콘솔에서 Elastic Beanstalk 환경을 종료하려면**

1. [Elastic Beanstalk 콘솔](https://console.aws.amazon.com/elasticbeanstalk)을 열고 **리전** 목록에서를 선택합니다 AWS 리전.

1. 탐색 창에서 **환경**을 선택한 다음 목록에서 환경의 이름을 선택합니다.

1. **작업(Actions)**을 선택한 후 **환경 종료(Terminate Environment)**를 선택합니다.

1. 화면에 표시되는 대화 상자를 사용하여 환경 종료를 확인합니다.

또는 EB CLI를 사용합니다.

```
~/eb-flask$ eb terminate flask-env
```

## 다음 단계
<a name="python-flask-more-info"></a>

Flask에 대한 자세한 내용은 [flask.pocoo.org](http://flask.pocoo.org/)를 참조하십시오.

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

# 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) 단원을 참조하십시오.

# Python Elastic Beanstalk 환경에 Amazon RDS DB 인스턴스 추가
<a name="create-deploy-python-rds"></a>

여기에서는 Elastic Beanstalk 콘솔을 사용하여 Amazon RDS를 생성하는 방법을 설명합니다. Amazon Relational Database Service(RDS) DB 인스턴스를 통해 애플리케이션이 수집하고 수정하는 데이터를 저장할 수 있습니다. Elastic Beanstalk를 통해 데이터베이스를 환경으로 연결한 후 관리하거나 비연결을 통해 생성하여 외부 기타 서버로 관리할 수 있습니다. 이러한 지침에서 데이터베이스는 Elastic Beanstalk를 통해 사용자 환경에 연결되고 관리됩니다. Elastic Beanstalk를 통한 Amazon RDS 통합에 대한 자세한 내용은 [Elastic Beanstalk 환경에 데이터베이스 추가](using-features.managing.db.md)을 참조하십시오.

**Topics**
+ [환경에 DB 인스턴스 추가](#python-rds-create)
+ [드라이버 다운로드](#python-rds-drivers)
+ [데이터베이스로 연결](#python-rds-connect)

## 환경에 DB 인스턴스 추가
<a name="python-rds-create"></a>

**환경에 DB 인스턴스를 추가하려면**

1. [Elastic Beanstalk 콘솔](https://console.aws.amazon.com/elasticbeanstalk)을 열고 **리전** 목록에서를 선택합니다 AWS 리전.

1. 탐색 창에서 **환경**을 선택한 다음 목록에서 환경의 이름을 선택합니다.

1. 탐색 창에서 **구성**을 선택합니다.

1. **데이터베이스** 구성 범주에서 **편집**을 선택합니다.

1. DB 엔진을 선택하고 사용자 이름과 암호를 입력합니다.

1. 변경 사항을 저장하려면 페이지 하단에서 **적용**을 선택합니다.

DB 인스턴스를 추가하는 데 약 10분 정도 소요됩니다. 환경 업데이트가 완료되면 애플리케이션에서 다음 환경 속성을 통해 DB 인스턴스 호스트 이름과 기타 연결 정보를 사용할 수 있습니다:


| 속성 이름 | 설명 | 속성 값 | 
| --- | --- | --- | 
|  `RDS_HOSTNAME`  |  DB 인스턴스의 호스트 이름입니다.  |  Amazon RDS 콘솔 **연결 및 보안** 탭의 **엔드포인트**입니다.  | 
|  `RDS_PORT`  |  DB 인스턴스가 연결을 허용하는 포트입니다. DB 엔진마다 기본값이 다릅니다.  |  Amazon RDS 콘솔 **연결 및 보안** 탭의 **포트**입니다.  | 
|  `RDS_DB_NAME`  |  데이터베이스 이름은 **ebdb**입니다.  |  Amazon RDS 콘솔 **구성** 탭의 **DB 이름**입니다.  | 
|  `RDS_USERNAME`  |  데이터베이스에 구성된 사용자 이름입니다.  |  Amazon RDS 콘솔 **구성** 탭의 **마스터 사용자 이름**입니다.  | 
|  `RDS_PASSWORD`  |  데이터베이스에 구성된 암호입니다.  |  Amazon RDS 콘솔에서 참조용 정보를 사용할 수 없습니다.  | 

Elastic Beanstalk 환경에 결합된 데이터베이스에 대한 자세한 내용은 [Elastic Beanstalk 환경에 데이터베이스 추가](using-features.managing.db.md)을 참조하세요.

## 드라이버 다운로드
<a name="python-rds-drivers"></a>

프로젝트의 [필수 요구 파일](python-configuration-requirements.md)에 데이터베이스 드라이버를 추가합니다.

**Example requirements.txt – MySQL을 포함하는 Django**  

```
Django==2.2
mysqlclient==2.0.3
```

**일반 Python용 드라이버 패키지**
+ **MySQL** – `mysqlclient`
+ **PostgreSQL** – `psycopg2`
+ **Oracle** – `cx_Oracle`
+ **SQL Server** – `adodbapi`

자세한 내용은 [Python 데이터베이스 인터페이스](https://wiki.python.org/moin/DatabaseInterfaces) 및 [Django 2.2 - 지원 가능한 데이터베이스를](https://docs.djangoproject.com/en/2.2/ref/databases)참조하세요.

## 데이터베이스로 연결
<a name="python-rds-connect"></a>

Elastic Beanstalk에서는 환경 속성을 통해 연결된 DB 인스턴스의 연결 정보를 제공합니다. `os.environ['VARIABLE']` 를 통해 속성을 읽고 데이터베이스 연결을 구성합니다.

**Example Django 설정 파일 – 데이터베이스 사전**  

```
import os

if 'RDS_HOSTNAME' in os.environ:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': os.environ['RDS_DB_NAME'],
            'USER': os.environ['RDS_USERNAME'],
            'PASSWORD': os.environ['RDS_PASSWORD'],
            'HOST': os.environ['RDS_HOSTNAME'],
            'PORT': os.environ['RDS_PORT'],
        }
    }
```

# Python 도구 및 리소스
<a name="create-deploy-python-tools-resources"></a>

Python 애플리케이션을 개발할 때 다음과 같은 곳에서 추가적인 도움을 받을 수 있습니다.


****  

| Resource | 설명 | 
| --- | --- | 
| [AWS SDK for Python (Boto3) GitHub의](https://github.com/boto/boto3) | GitHub에서 가져온 Boto3를 설치합니다. | 
| [AWS SDK for Python (Boto3) 홈페이지](https://aws.amazon.com//sdk-for-python/) |  AWS SDK for Python (Boto3) 홈페이지입니다. | 
| [Python 개발자 센터](https://aws.amazon.com/python/) | 샘플 코드, 설명서, 도구 및 추가 리소스를 받을 수 있는 원스톱 상점입니다. | 