

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 將 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 Web 服務。

於此目錄建立名為 `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
```

在 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_tw/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
```

不過，在 Elastic Beanstalk 上執行應用程式並不需要 `virt` 資料夾。部署時，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
   ```

使用大約需要五分鐘時間建立環境，並且建立下列資源：
+ **EC2 執行個體** ‒ Amazon Elastic Compute Cloud (Amazon EC2) 虛擬機器，已設為在您選擇的平台上執行 Web 應用程式。

  每個平台會執行特定的一套軟體、設定檔和指令碼，來支援特定的語言版本、架構、Web 容器或其組合。大多數的平台使用會 Apache 或 NGINX 做為反向代理，此反向代理會在您 Web 應用程式的前景執行、轉傳遞交給此 Web 應用程式的請求、提供靜態資產，並產生存取和錯誤日誌。
+ **執行個體安全群組** - Amazon EC2 安全群組，已設為允許從連接埠 80 傳入的流量。此資源可讓負載平衡器傳來的 HTTP 傳輸資料，到達執行您 Web 應用程式的 EC2 執行個體。在預設情況下，不允許傳輸資料從其他通訊埠傳送。
+ **負載平衡器** - Elastic Load Balancing 負載平衡器，可設定將請求分配到執行您應用程式的執行個體。負載平衡器也讓您的執行個體不需直接連接到網際網路。
+ **負載平衡器安全群組** - Amazon EC2 安全群組，設為允許從連接埠 80 傳入的流量。此資源可讓來自網際網路的 HTTP 傳輸資料到達負載平衡器。在預設情況下，不允許傳輸資料從其他通訊埠傳送。
+ **Auto Scaling 群組** - Auto Scaling 群組，設為在執行個體終止或無法使用時，取代該執行個體。
+ **Amazon S3 儲存貯體** - 儲存位置，用來儲存當您使用 Elastic Beanstalk 時所建立的原始程式碼、日誌和其他成品。
+ **Amazon CloudWatch 警示** - 兩種 CloudWatch 警示，用來監控您環境中執行個體上的負載，會在負載過高或過低時觸發。當警示觸發時，您的 Auto Scaling 群組會擴展或縮減以進行回應。
+ **CloudFormation 堆疊** – Elastic Beanstalk 使用 CloudFormation 啟動環境中的資源並傳播組態變更。資源定義於範本中，您可在 [CloudFormation 主控台](https://console.aws.amazon.com/cloudformation)中檢視此範本。
+ **網域名稱** – 會路由到您 Web 應用程式的網域名稱，其格式為 **subdomain*.*region*.elasticbeanstalk.com*。
**網域安全**  
為了增強 Elastic Beanstalk 應用程式的安全性，我們會在[公共后缀列表 (PSL)](https://publicsuffix.org/) 中註冊網域 *elasticbeanstalk.com*。  
如果您需要在 Elastic Beanstalk 應用程式的預設網域名稱中設定敏感 Cookie，建議您使用字`__Host-`首為 的 Cookie 以提高安全性。此實務可保護您的網域免於跨網站請求偽造嘗試 (CSRF)。如需更多資訊，請參閱 Mozilla 開發人員網路中的[設定 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_tw/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 資源，例如 [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)。

移除資源不會刪除 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 Web 框架，請參閱[將 Django 應用程式部署至 Elastic Beanstalk](create-deploy-python-django.md)。