本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
将 Flask 应用程序部署到 Elastic Beanstalk
Flask 是一种适用于 Python 的开源 Web 应用程序框架。本教程将引导您完成生成 Flask 应用程序并将其部署到 AWS Elastic Beanstalk 环境的过程。
在本教程中,您将执行以下操作:
先决条件
本教程假设您对基本 Elastic Beanstalk 操作和 Elastic Beanstalk 控制台有一定了解。如果尚不了解,请按照开始使用 Elastic Beanstalk中的说明操作以启动您的第一个 Elastic Beanstalk 环境。
为了遵循本指南中的步骤,您需要命令行终端或 Shell,以便运行命令。命令显示在列表中,以提示符($)和当前目录名称(如果有)开头。
~/eb-project$ this is a command
this is output
在 Linux 和 macOS 中,您可使用您首选的 Shell 和程序包管理器。在 Windows 上,你可以安装适用于 Linux 的 Windows 子系统
Flask 需要 Python 3.7 或更高版本。在本教程中,我们使用 Python 3.7 和相应的 Elastic Beanstalk 平台版本。按照设置 Python 开发环境上的说明操作来安装 Python。
Flask
本教程还使用 Elastic Beanstalk 命令行界面 (EB CLI)。有关安装和配置 EB CLI 的详细信息,请参阅 安装 EB CLI 和 配置 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 安装库。有关更多信息,请参阅 使用要求文件指定依赖项。
创建 Flask 应用程序
接下来,创建一个您将使用 Elastic Beanstalk 部署的应用程序。我们会创建一个“Hello World”RESTful Web 服务。
在此目录中创建名为 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 轻松地找到您的应用程序代码。
将 application.py
与 Python 一起运行:
(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
在您的 Web 浏览器中打开 http://127.0.0.1:5000/
。您应该看到应用程序正在运行,并且会显示索引页面:
![](images/eb_flask_test_local.png)
检查服务器日志,查看请求的输出。您可键入 Ctrl+C,停止 Web 服务器并返回到虚拟环境。
如果您看到的是调试输出,请修复错误并确保应用程序正在本地运行,然后再为 Elastic Beanstalk 配置应用程序。
使用 EB CLI 部署站点
您已添加在 Elastic Beanstalk 上部署应用程序所需的全部内容。您的项目目录现在应该如下所示:
~/eb-flask/
|-- virt
|-- application.py
`-- requirements.txt
不过,不需要 virt
文件夹即可使应用程序在 Elastic Beanstalk 上运行。在部署时,Elastic Beanstalk 会在服务器实例上创建新的虚拟环境,并安装 requirements.txt
中列出的库。要最大程度地减小部署期间上传的源包的大小,请添加 .ebignore 文件,此文件告知 EB CLI 忽略 virt
文件夹。
例 ~/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 平台版本创建环境。 -
(可选) 再次运行 eb init,以配置默认密钥对,以便连接到使用 SSH 运行应用程序的 EC2 实例:
~/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 实例 – 配置为在您选择的平台上运行 Web 应用程序的 Amazon Elastic Compute Cloud(Amazon EC2)虚拟机。
各平台运行一组特定软件、配置文件和脚本以支持特定的语言版本、框架、Web 容器或其组合。大多数平台使用 Apache 或 NGINX 作为 Web 应用程序前的反向代理,向其转发请求、提供静态资产以及生成访问和错误日志。
-
实例安全组 - 配置为允许端口 80 上的入站流量的 Amazon EC2 安全组。通过此资源,HTTP 流量可以从负载均衡器到达运行您的 Web 应用程序的 EC2 实例。默认情况下,其他端口不允许流量进入。
-
负载均衡器 – 配置为向运行您的应用程序的实例分配请求的 Elastic Load Balancing 负载均衡器。负载均衡器还使您无需将实例直接公开在 Internet 上。
-
负载均衡器安全组 – 配置为允许端口 80 上的入站流量的 Amazon EC2 安全组。利用此资源,HTTP 流量可从 Internet 到达负载均衡器。默认情况下,其他端口不允许流量进入。
-
Auto Scaling 组 – 配置为在实例终止或不可用时替换实例的 Auto Scaling 组。
-
Amazon S3 存储桶 – 使用 Elastic Beanstalk 时创建的源代码、日志和其他构件的存储位置。
-
Amazon CloudWatch CloudWatch 警报 — 两个警报,用于监控环境中实例的负载,并在负载过高或过低时触发。警报触发后,您的 Auto Scaling 组会扩展或收缩以进行响应。
-
AWS CloudFormation 堆栈 — Elastic AWS CloudFormation Beanstalk 用于在您的环境中启动资源并传播配置更改。这些资源在您可通过 AWS CloudFormation 控制台
查看的模板中定义。 -
域名 – 一个域名,它以下面的形式路由到您的 Web 应用程序:
subdomain
.region
.elasticbeanstalk.com。注意
为增强 Elastic Beanstalk 应用程序的安全性,已将 elasticbeanstalk.com 域注册到 公共后缀列表(PSL)
。为进一步增强安全性,如果您需要在 Elastic Beanstalk 应用程序的默认域名中设置敏感 Cookie,我们建议您使用带 __Host-
前缀的 Cookie。这将有助于保护您的域,防范跨站点请求伪造(CSRF)攻击。要了解更多信息,请参阅 Mozilla 开发者网络中的 Set-Cookie页面。
所有这些资源都由 Elastic Beanstalk 管理。当您终止环境时,Elastic Beanstalk 会终止其包含的所有资源。
注意
Elastic Beanstalk 创建的 Amazon S3 存储桶将在多个环境之间共享并且在环境终止期间不会被删除。有关更多信息,请参阅 将 Elastic Beanstalk 和 Amazon S3 结合使用。
当环境创建过程完成时,请使用 eb open 打开网站:
~/eb-flask$ eb open
这将使用为应用程序创建的域名打开一个浏览器窗口。您应该看到在本地创建和测试的相同 Flask 网站。
![](images/eb_flask_deployed.png)
如果您没有看到应用程序运行,或者出现错误消息,请查看排查部署问题以获取有关如何确定错误原因的帮助。
如果您确实 看到应用程序在运行,那么恭喜,您已使用 Elastic Beanstalk 部署了第一个 Flask 应用程序!
清除
Elastic Beanstalk 使用完毕时,您可以终止您的环境。Elastic Beanstalk AWS 会终止与您的环境关联的所有资源,例如 Amazon EC2 实例、数据库实例、负载均衡器、安全组和警报。
从控制台终止你的 Elastic Beanstalk 环境
打开 Elastic Beanstalk
控制台,然后在 “区域” 列表中,选择您的。 AWS 区域 -
在导航窗格中,选择 Environments(环境),然后从列表中选择环境的名称。
注意
如果您有多个环境,请使用搜索栏筛选环境列表。
-
选择 Actions(操作),然后选择 Terminate environment(终止环境)。
-
使用屏幕上的对话框确认环境终止。
利用 Elastic Beanstalk,可以随时为您的应用程序轻松创建新环境。
或者,使用 EB CLI:
~/eb-flask$ eb terminate flask-env
后续步骤
有关 Flask 的更多信息,请访问 flask.pocoo.org
如果您希望尝试其他 Python Web 框架,请参阅将 Django 应用程序部署到 Elastic Beanstalk。