本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
将 Flask 应用程序部署到 Elastic Beanstalk
本教程将引导您完成生成 Flask 应用程序并将其部署到 Amazon Elastic Beanstalk 环境的过程。Flask 是一种适用于 Python 的开源 Web 应用程序框架。
在本教程中,您将执行以下操作:
先决条件
本教程假设您对基本 Elastic Beanstalk 操作和 Elastic Beanstalk 控制台有一定了解。如果尚不了解,请按照了解如何开始使用 Elastic Beanstalk中的说明操作以启动您的第一个 Elastic Beanstalk 环境。
为了遵循本指南中的步骤,您需要命令行终端或 Shell,以便运行命令。命令显示在列表中,以提示符($)和当前目录名称(如果有)开头。
~/eb-project$ this is a command
this is output
在 Linux 和 macOS 中,您可使用您首选的 Shell 和程序包管理器。在 Windows 上,你可以安装适用于 Linux 的 Windows 子系统
在本教程中,我们使用 Python 3.11 和相应的 Elastic Beanstalk 平台版本。按照为 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==3.0.3 -
使用
pip freeze查看已安装的库:(virt)~/eb-flask$pip freezeblinker==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。
-
将来自
pip freeze的输出保存到名为requirements.txt的文件中。(virt)~/eb-flask$pip freeze > requirements.txt在部署期间,此文件将指示 Elastic Beanstalk 安装库。有关更多信息,请参阅 在 Elastic Beanstalk 上使用要求文件指定依赖项。
创建 Flask 应用程序
接下来,创建一个您将使用 Elastic Beanstalk 部署的应用程序。我们会创建一个“Hello World”RESTful Web 服务。
在此目录中创建名为 application.py 的新文本文件,包含以下内容:
例~/eb-.py flask/application
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/。您应该看到应用程序正在运行,并且会显示索引页面:
检查服务器日志,查看请求的输出。您可键入 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.11 flask-tutorial --region us-east-2Application flask-tutorial has been created.此命令创建一个名为的新应用程序,
flask-tutorial并配置您的本地存储库以使用最新 Python 3.11 平台版本创建环境。 -
(可选) 再次运行 eb init,以配置默认密钥对,以便连接到使用 SSH 运行应用程序的 EC2 实例:
~/eb-flask$eb initDo you want to set up SSH for your instances? (y/n):ySelect a keypair. 1) my-keypair 2) [ Create new KeyPair ]如果您已有密钥对,请选择一个密钥对,或按提示创建新密钥对。如果您没有看到提示或需要以后更改设置,请运行 eb init -i。
-
使用 eb create 创建环境并将应用程序部署到此环境中:
~/eb-flask$eb create flask-env
环境创建大约需要 5 分钟,将创建以下资源:
-
Beanstalk 标准 — 对于在亚马逊弹性计算云 (亚马逊 EC2) 上运行的环境,Elastic Beanstalk 预置了以下资源:
-
EC2 实例 — 配置为在您选择的平台上运行 Web 应用程序的 Amazon EC2 虚拟机。
各平台运行一组特定软件、配置文件和脚本以支持特定的语言版本、框架、Web 容器或其组合。大多数平台使用 Apache 或 NGINX 作为 Web 应用程序前的反向代理,向其转发请求、提供静态资产以及生成访问和错误日志。
-
实例安全组 - 配置为允许端口 80 上的入站流量的 Amazon EC2 安全组。通过此资源,HTTP 流量可以从负载均衡器到达运行您的 Web 应用程序的 EC2 实例。默认情况下,其他端口不允许流量进入。
-
负载均衡器安全组 – 配置为允许端口 80 上的入站流量的 Amazon EC2 安全组。利用此资源,HTTP 流量可从 Internet 到达负载均衡器。默认情况下,其他端口不允许流量进入。
-
Auto Scaling 组 – 配置为在实例终止或不可用时替换实例的 Auto Scaling 组。
-
Amazon CloudWatch CloudWatch 警报 — 两个警报,用于监控环境中实例的负载,并在负载过高或过低时触发。警报触发后,您的 Auto Scaling 组会扩展或收缩以进行响应。
-
-
Beanstalk 集群 — 对于在亚马逊 EKS 上运行的环境,Elastic Beanstalk 预置了以下资源:
-
亚马逊 EKS 集群 — 由 Elastic Beanstalk 创建和运行的亚马逊 EKS 集群。使用相同子网的同一个账户中的环境共享一个集群。
-
计算 — 由 Amazon EKS 自动模式提供的节点容量,该模式添加和删除节点以适应集群上计划的应用程序副本。
-
IAM 角色 — 您为 Amazon EKS 提供的集群和节点角色,以及 Elastic Beanstalk 用于发布环境指标、日志和跟踪的可观察性角色。
有关此基础架构的更多信息,请参阅Beanstalk 集群架构。
-
-
负载均衡器 -一种负载均衡器,用于在您的应用程序中分配传入请求。负载均衡器还无需将您的应用程序直接暴露给互联网。
-
Amazon S3 存储桶 – 使用 Elastic Beanstalk 时创建的源代码、日志和其他构件的存储位置。
-
Amazon CloudFormation 堆栈 — Elastic Beanstalk Amazon CloudFormation 用于在您的环境中启动资源和传播配置更改。这些资源在您可通过 Amazon CloudFormation 控制台
查看的模板中定义。 -
域名 — 以表单形式路由到您的 Web 应用程序的域名
subdomain。region.elasticbeanstalk.com。域安全
为增强 Elastic Beanstalk 应用程序的安全性,已将 eb.amazonaws.com.cn 域注册到 公共后缀列表(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 网站。
如果您没有看到应用程序运行,或者出现错误消息,请查看排查部署问题以获取有关如何确定错误原因的帮助。
如果您确实 看到应用程序在运行,那么恭喜,您已使用 Elastic Beanstalk 部署了第一个 Flask 应用程序!
资源清理
演示代码使用完毕后,您可以终止环境。Elastic Beanstalk 会删除所有相关 Amazon 资源,例如 Amazon EC2 实例、数据库实例、负载均衡器、安全组和警报。
移除资源不会删除 Elastic Beanstalk 应用程序,因此您可以随时为您的应用程序创建新环境。
从控制台终止 Elastic Beanstalk 环境
打开 E lastic Beanstalk 控制台
,然后在区域列表中选择您的。 Amazon Web Services 区域 -
在导航窗格中,选择 Environments(环境),然后从列表中选择环境的名称。
-
选择 Actions(操作),然后选择 Terminate environment(终止环境)。
-
使用屏幕上的对话框确认环境终止。
或者,使用 EB CLI:
~/eb-flask$ eb terminate flask-env
后续步骤
有关 Flask 的更多信息,请访问 flask.pocoo.org
如果您希望尝试其他 Python Web 框架,请参阅将 Django 应用程序部署到 Elastic Beanstalk。