將 Flask 應用程式部署至 Elastic Beanstalk - AWS Elastic Beanstalk

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

將 Flask 應用程式部署至 Elastic Beanstalk

本教學課程將逐步引導您產生 Flask 應用程式並將其部署到 AWS 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 子系統,以取得 Windows 整合版本的 Ubuntu 和 Bash。

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。

設定專案環境
  1. 建立專案目錄。

    ~$ mkdir eb-flask ~$ cd eb-flask
  2. 建立並啟用名為 virt 的虛擬環境:

    ~/eb-flask$ virtualenv virt ~$ source virt/bin/activate (virt) ~/eb-flask$

    您的命令提示字元前方將加上 (virt),表示您正位於虛擬環境中。本教學課程的其餘部分都使用此虛擬環境。

  3. 使用 pip install 安裝 Flask:

    (virt)~/eb-flask$ pip install flask==2.0.3
  4. 使用 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

    本命令列出您虛擬環境安裝的所有套件。由於您位於虛擬環境中,CLI因此不會顯示像 EB 這樣的全域安裝套件。

  5. 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-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.

檢查伺服器日誌,以查看您請求的輸出。您可以輸入 Ctrl+C,停止 web 伺服器並返回您的虛擬環境。

若您看到的是除錯輸出,請修正錯誤,並確認應用程式正於本機執行,之後再針對 Elastic Beanstalk 進行設定。

使用 EB 部署您的網站 CLI

您已新增於 Elastic Beanstalk 部署應用程式所需的所有事物。您的專案目錄現在應如下所示:

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

不過,在 Elastic Beanstalk 上執行應用程式並不需要 virt 資料夾。部署時,Elastic Beanstalk 會在伺服器執行個體上建立新的虛擬環境,並安裝 requirements.txt 中所列的程式庫。若要將部署期間上傳的來源套件大小降至最低,請新增 .ebignore 檔案,告知 EB CLI離開virt資料夾。

範例 ~/eb-flask/.ebignore
virt

接著,您將建立應用程式環境,並透過 Elastic Beanstalk 部署已設定的應用程式。

欲建立環境並部署您的 Flask 應用程式
  1. 使用 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 平台版本建立環境。

  2. (選用) eb init再次執行 以設定預設金鑰對,以便您可以使用 連線到執行應用程式的EC2執行個體SSH:

    ~/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

  3. 透過 eb create 建立環境並於其中部署您的應用程式:

    ~/eb-flask$ eb create flask-env

使用大約需要五分鐘時間建立環境,並且建立下列資源:

  • EC2 執行個體 – Amazon Elastic Compute Cloud (Amazon EC2) 虛擬機器,設定為在您選擇的平台上執行 Web 應用程式。

    每個平台會執行特定的一套軟體、設定檔和指令碼,來支援特定的語言版本、架構、Web 容器或其組合。大多數平台會使用 Apache 或 NGINX 作為反向代理,該代理位於 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 群組會擴展或縮減以進行回應。

  • AWS CloudFormation 堆疊 – Elastic Beanstalk 使用 AWS CloudFormation 啟動環境中的資源並傳播組態變更。資源定義於範本中,您可在 AWS CloudFormation 主控台中檢視此範本。

  • 網域名稱 – 以 形式路由至 Web 應用程式的網域名稱 subdomain.region.elasticbeanstalk.com

    網域安全

    為了增強 Elastic Beanstalk 應用程式的安全性,在公有字尾清單中註冊 elasticbeanstalk.com 網域 ()。 PSL

    如果您需要在 Elastic Beanstalk 應用程式的預設網域名稱中設定敏感 Cookie,我們建議您使用具有__Host-字首的 Cookie 來提高安全性。此做法會保護您的網域,防止跨網站請求偽造嘗試 (CSRF)。如需更多資訊,請參閱 Mozilla 開發人員網路中的設定 Cookie 頁面。

這些資源全都由 Elastic Beanstalk 管理。當您終止環境時,Elastic Beanstalk 會終止其中的所有資源。

注意

Elastic Beanstalk 建立的 Amazon S3 儲存貯體會在環境間共享,且不會在環境終止時刪除。如需詳細資訊,請參閱將 Elastic Beanstalk 與 Amazon S3 搭配使用

當環境建立程序完成,請透過 eb open 開啟您的網站:

~/eb-flask$ eb open

將開啟瀏覽器視窗,並使用為應用程式建立的網域名稱。您應該會看到與本機建立和測試相同的 Flask 網站。

Browser window displaying a Flask web application with a "Hello World!" message and usage hint.

若未顯示您的應用程式正在執行,或收到錯誤訊息,請參閱疑難排解部署尋求協助,以判斷錯誤發生的原因。

若您「確實」看見您的應用程式正在執行,恭喜您,您透過 Elastic Beanstalk 部署的第一個 Flask 應用程式已完成!

清除

當您完成使用 Elastic Beanstalk 時,即可終止您的環境。Elastic Beanstalk 會終止與環境相關聯的所有 AWS 資源,例如 Amazon EC2執行個體資料庫執行個體 負載平衡器 、安全群組和警示

從主控台終止 Elastic Beanstalk 環境
  1. 開啟 Elastic Beanstalk 主控台 ,然後在區域清單中選取您的 AWS 區域。

  2. 在導覽窗格中,選擇環境,然後在清單中選擇您環境的名稱。

    注意

    如果您有許多環境,請使用搜尋列來篩選環境清單。

  3. 選擇 Actions (動作),然後選擇 Terminate Environment (終止環境)。

  4. 使用畫面顯示對話方塊來確認環境終止。

您可以使用 Elastic Beanstalk,隨時輕鬆地為您的應用程式建立新環境。

或者,使用 EB CLI:

~/eb-flask$ eb terminate flask-env

後續步驟

如需 Flask 的詳細資訊,請造訪 flask.pocoo.org

若您欲嘗試其他 Python Web 框架,請參閱將 Django 應用程式部署至 Elastic Beanstalk