

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

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