

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 将 Flask 应用程序部署到 Elastic Beanstalk
<a name="create-deploy-python-flask"></a>

本教程将引导您完成生成 Flask 应用程序并将其部署到 AWS Elastic Beanstalk 环境的过程。Flask 是一种适用于 Python 的开源 Web 应用程序框架。

在本教程中，您将执行以下操作：
+ [通过 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 环境。

为了遵循本指南中的步骤，您需要命令行终端或 Shell，以便运行命令。命令显示在列表中，以提示符（\$1）和当前目录名称（如果有）开头。

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

在 Linux 和 macOS 中，您可使用您首选的 Shell 和程序包管理器。在 Windows 上，您可以[安装适用于 Linux 的 Windows 子系统](https://docs.microsoft.com/en-us/windows/wsl/install-win10)，以获取与 Windows 集成的 Ubuntu 和 Bash 版本。

在本教程中，我们使用 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 轻松地找到您的应用程序代码。

将 `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/`。您应该看到应用程序正在运行，并且会显示索引页面：

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


检查服务器日志，查看请求的输出。您可键入 **Ctrl\$1C**，停止 Web 服务器并返回到虚拟环境。

如果您看到的是调试输出，请修复错误并确保应用程序正在本地运行，然后再为 Elastic Beanstalk 配置应用程序。

## 使用 EB CLI 部署站点
<a name="python-flask-deploy"></a>

您已添加在 Elastic Beanstalk 上部署应用程序所需的全部内容。您的项目目录现在应该如下所示：

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

不过，不需要 `virt` 文件夹即可使应用程序在 Elastic Beanstalk 上运行。在部署时，Elastic Beanstalk 会在服务器实例上创建新的虚拟环境，并安装 `requirements.txt` 中列出的库。要最大程度地减小部署期间上传的源包的大小，请添加 [.ebignore](eb-cli3-configuration.md#eb-cli3-ebignore) 文件，此文件告知 EB CLI 忽略 `virt` 文件夹。

**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. （可选）**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**。

1. 使用 **eb create** 创建环境并将应用程序部署到此环境中：

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

环境创建大约需要 5 分钟，将创建以下资源：
+ **EC2 实例** — 配置为在您选择的平台上运行 Web 应用程序的亚马逊弹性计算云 (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 组会扩展或收缩以进行响应。
+ **CloudFormation 堆栈** — Elastic CloudFormation Beanstalk 用于在您的环境中启动资源并传播配置更改。这些资源在您可通过 [CloudFormation 控制台](https://console.aws.amazon.com/cloudformation)查看的模板中定义。
+ **域名**-以表单形式路由到您的 Web 应用程序的域名**subdomain*。 *region*.elasticbeanstalk.com。*
**域安全**  
为增强 Elastic Beanstalk 应用程序的安全性，已将 *elasticbeanstalk.com* 域注册到 [公共后缀列表（PSL）](https://publicsuffix.org/)。  
如果您需要在 Elastic Beanstalk 应用程序的默认域名中设置敏感 Cookie，我们建议您使用带有前缀 `__Host-` 的 Cookie 来提高安全性。这种做法可以保护您的域免遭跨站点请求伪造（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 存储桶将在多个环境之间共享并且在环境终止期间不会被删除。有关更多信息，请参阅 [将 Elastic Beanstalk 和 Amazon S3 结合使用](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/zh_cn/elasticbeanstalk/latest/dg/images/eb_flask_deployed.png)


如果您没有看到应用程序运行，或者出现错误消息，请查看[排查部署问题](troubleshooting.md#troubleshooting-deployments)以获取有关如何确定错误原因的帮助。

如果您*确实* 看到应用程序在运行，那么恭喜，您已使用 Elastic Beanstalk 部署了第一个 Flask 应用程序！

## 清理
<a name="python-flask-tutorial-cleanup"></a>

演示代码使用完毕后，您可以终止环境。[Elastic Beanstalk 会删除 AWS 所有相关资源，[例如 EC2 亚马逊](using-features.managing.ec2.md)[实例、数据库实例、](using-features.managing.db.md)负载均衡器[、安全组](using-features.managing.elb.md)和警报。](using-features.alarms.md#using-features.alarms.title)

移除资源不会删除 Elastic Beanstalk 应用程序，因此您可以随时为您的应用程序创建新环境。

**从控制台终止 Elastic Beanstalk 环境**

1. 打开 [Elastic Beanstalk](https://console.aws.amazon.com/elasticbeanstalk) 控制台，然后**在 “区域” 列表中，选择您**的。 AWS 区域

1. 在导航窗格中，选择 **Environments**（环境），然后从列表中选择环境的名称。

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 Web 框架，请参阅[将 Django 应用程序部署到 Elastic Beanstalk](create-deploy-python-django.md)。