기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
이 자습서에서는 Flask 애플리케이션을 생성하고 AWS Elastic Beanstalk 환경에 배포하는 프로세스를 안내합니다. Flask는 Python용 오픈 소스 웹 애플리케이션 프레임워크입니다.
이 자습서에서는 다음을 수행합니다.
사전 조건
이 자습서에서는 사용자가 기본 Elastic Beanstalk 작업 및 Elastic Beanstalk 콘솔에 대해 어느 정도 알고 있다고 가정합니다. 아직 그렇지 않은 경우 Elastic Beanstalk 시작하기의 지침에 따라 첫 Elastic Beanstalk 환경을 시작합니다.
이 설명서의 절차를 수행하기 위해서는 실행 명령줄을 입력할 쉘 또는 터미널이 필요합니다. 명령은 프롬프트 기호($)와 해당하는 경우 현재 디렉터리 이름 뒤에 리스트로 표시됩니다.
~/eb-project$ this is a command
this is output
Linux 및 macOS의 경우 선호하는 쉘과 패키지 관리자를 사용할 수 있습니다. Windows의 경우 Linux용 Windows Subsystem을 설치
Flask에는 Python 3.7 이상이 필요합니다. 이 자습서에서는 Python 3.7 및 해당 Elastic Beanstalk 플랫폼 버전을 사용합니다. Elastic Beanstalk를 위한 Python 개발 환경 설정의 지침을 따라서 Python을 설치합니다.
자습서의 일부로 Flask
또한 본 자습서는 Elastic Beanstalk 명령줄 인터페이스(EB CLI)를 사용합니다. EB CLI 설치 및 구성에 대한 자세한 내용은 Elastic Beanstalk 명령줄 인터페이스 설치 및 EB CLI 구성 단원을 참조하세요.
Flask로 Python 가상 환경 설정
애플리케이션에 대한 프로젝트 디렉터리와 가상 환경을 생성한 후 Flask를 설치합니다.
프로젝트 환경을 설정하려면
-
프로젝트 디렉터리를 만듭니다.
~$
mkdir eb-flask
~$cd eb-flask
-
이름이
virt
인 가상 환경을 만들어 활성화합니다.~/eb-flask$
virtualenv virt
~$source virt/bin/activate
(virt) ~/eb-flask$명령 프롬프트 앞에 추가된
(virt)
가 보일 것입니다. 이는 가상 환경에 있음을 나타냅니다. 이 자습서의 나머지 부분에서는 가상 환경을 사용합니다. -
pip install
을 사용하여 flask를 설치합니다.(virt)~/eb-flask$
pip install flask==2.0.3
-
pip freeze
를 사용하여 설치된 라이브러리를 조회합니다.(virt)~/eb-flask$
pip freeze
click==8.1.1 Flask==2.0.3 itsdangerous==2.1.2 Jinja2==3.1.1 MarkupSafe==2.1.1 Werkzeug==2.1.0이 명령은 가상 환경에 설치된 모든 패키지를 나열합니다. 가상 환경에 있기 때문에 EB CLI와 같은 전역 설치된 패키지는 표시되지 않습니다.
-
pip freeze
의 출력을requirements.txt
이라는 파일에 저장합니다.(virt)~/eb-flask$
pip freeze > requirements.txt
이 파일은 배포 중 라이브러리를 설치하도록 Elastic Beanstalk에 명령합니다. 자세한 내용은 Elastic Beanstalk에서 요구 서헝 파일을 사용하여 종속성 지정을(를) 참조하세요.
Flask 애플리케이션 생성
그 다음 Elastic Beanstalk를 사용하여 배포할 애플리케이션을 만듭니다. "Hello World" RESTful 웹 서비스를 만듭니다.
다음 내용을 포함하며 이름이 application.py
인 디렉터리에 새 텍스트 파일을 만듭니다.
예 ~/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/
을 엽니다. 인덱스 페이지가 표시되며 애플리케이션이 실행하는 것을 확인할 수 있습니다.

서버 로그를 확인하여 요청에서 출력을 봅니다. Ctrl+C를 입력하여 웹 서버를 중지하고 가상 환경으로 돌아갈 수 있습니다.
디버그 출력이 대신 나타나는 경우, 오류를 수정하고 애플리케이션이 로컬에서 실행 중인지 확인한 다음 Elastic Beanstalk에 맞게 구성합니다.
EB CLI를 사용하여 사이트 배포
Elastic Beanstalk에 애플리케이션을 배포하기 위해 필요한 모든 항목을 추가했습니다. 프로젝트 디렉터리가 이제 다음과 같을 것입니다.
~/eb-flask/
|-- virt
|-- application.py
`-- requirements.txt
하지만 애플리케이션이 Elastic Beanstalk에서 실행하는 데 virt
폴더는 필요하지 않습니다. 배포 시, Elastic Beanstalk는 서버 인스턴스에 가상 환경을 새로 만든 후 requirements.txt
에 명시된 라이브러리를 설치합니다. 배포 중 업로드하는 소스 번들의 크기를 최소화하기 위해, virt
폴더를 배제하도록 EB CLI에 명령하는 .ebignore 파일을 추가합니다.
예 ~/eb-flask/.ebignore
virt
다음으로 애플리케이션 환경을 생성하고 Elastic Beanstalk에 구성된 애플리케이션을 배포합니다.
환경을 만들고 Flask 애플리케이션을 배포하려면
-
eb init 명령으로 EB CLI 리포지토리를 초기화합니다.
~/eb-flask$
eb init -p python-3.7 flask-tutorial --region us-east-2
Application flask-tutorial has been created.이 명령은 이름이
flask-tutorial
인 새 애플리케이션을 만들고 최신 Python 3.7 플랫폼 버전을 통해 환경을 생성하도록 로컬 리포지토리를 구성합니다. -
(선택 사항) 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를 실행합니다.
-
환경을 만들고 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 그룹이 확장 또는 축소됩니다.
-
AWS CloudFormation 스택 - Elastic Beanstalk는 AWS CloudFormation 를 사용하여 환경에서 리소스를 시작하고 구성 변경 사항을 전파합니다. 리소스는 AWS CloudFormation 콘솔
에서 볼 수 있는 템플릿에서 정의됩니다. -
도메인 이름(Domain name) -
subdomain
.region
.elasticbeanstalk.com 형식으로 웹 앱으로 라우팅되는 도메인 이름입니다.도메인 보안
Elastic Beanstalk 애플리케이션의 보안을 강화하기 위해 elasticbeanstalk.com 도메인이 공개 서픽스 목록(PSL)
에 등록되어 있습니다. Elastic Beanstalk 애플리케이션의 기본 도메인 이름에 민감한 쿠키를 설정해야 하는 경우 보안을 강화하기 위해
__Host-
접두사가 있는 쿠키를 사용하는 것이 좋습니다. 이렇게 쿠키를 설정하면 교차 사이트 요청 위조 시도(CSRF)로부터 도메인이 보호됩니다. 자세한 내용은 Mozilla 개발자 네트워크의 Set-Cookie페이지를 참조하세요.
이러한 모든 리소스는 Elastic Beanstalk에서 관리합니다. 사용자가 환경을 종료하면 Elastic Beanstalk는 환경에 있는 모든 리소스를 종료합니다.
참고
Elastic Beanstalk에서 생성하는 Amazon S3 버킷은 환경 간에 공유되며 환경을 종료해도 삭제되지 않습니다. 자세한 내용은 Amazon S3에서 Elastic Beanstalk 사용을(를) 참조하세요.
환경 생성 프로세스가 완료되면 eb open으로 웹 사이트를 엽니다.
~/eb-flask$ eb open
그러면 애플리케이션에 대해 생성된 도메인 이름을 사용하여 브라우저 창이 열립니다. 로컬에서 만들고 테스트한 Flask 웹 사이트를 확인할 수 있습니다.

실행 중인 애플리케이션이 보이지 않거나 오류 메시지를 받은 경우, 배포 문제 해결에서 오류의 원인을 확인하는 방법에 대한 도움말을 보십시오.
실행 중인 애플리케이션이 보인다면 성공한 것입니다. Elastic Beanstalk로 처음 Flask 애플리케이션을 배포하였습니다.
정리
Elastic Beanstalk 작업을 완료하면 환경을 종료할 수 있습니다. Elastic Beanstalk는 Amazon EC2 인스턴스, 데이터베이스 인스턴스, 로드 밸런서, 보안 그룹, 경보 등 환경과 연결된 모든 AWS 리소스를 종료합니다.
콘솔에서 Elastic Beanstalk 환경을 종료하려면
Elastic Beanstalk 콘솔
을 열고 리전 목록에서를 선택합니다 AWS 리전. -
탐색 창에서 환경을 선택한 다음 목록에서 환경의 이름을 선택합니다.
참고
여러개의 환경을 보유한 경우 검색 창을 통해 환경 목록을 필터링합니다.
-
작업(Actions)을 선택한 후 환경 종료(Terminate Environment)를 선택합니다.
-
화면에 표시되는 대화 상자를 사용하여 환경 종료를 확인합니다.
Elastic Beanstalk로 언제든지 애플리케이션을 위한 새로운 환경을 쉽게 생성할 수 있습니다.
또는 EB CLI를 사용합니다.
~/eb-flask$ eb terminate flask-env
다음 단계
Flask에 대한 자세한 내용은 flask.pocoo.org
다른 Python 웹 프레임워크를 사용해 보고 싶은 경우 Elastic Beanstalk에 Django 애플리케이션 배포 단원을 참조하십시오.