本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
將 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 子系統
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。
設定專案環境
-
建立專案目錄。
~$
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本命令列出您虛擬環境安裝的所有套件。由於您位於虛擬環境中,CLI因此不會顯示像 EB 這樣的全域安裝套件。
-
將
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/
。您應看到應用程式正在執行,並顯示索引頁面:
檢查伺服器日誌,以查看您請求的輸出。您可以輸入 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 應用程式
-
使用 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再次執行 以設定預設金鑰對,以便您可以使用 連線到執行應用程式的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。
-
透過 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 管理。當您終止環境時,Elastic Beanstalk 會終止其中的所有資源。
注意
Elastic Beanstalk 建立的 Amazon S3 儲存貯體會在環境間共享,且不會在環境終止時刪除。如需詳細資訊,請參閱將 Elastic Beanstalk 與 Amazon S3 搭配使用。
當環境建立程序完成,請透過 eb open 開啟您的網站:
~/eb-flask$ eb open
將開啟瀏覽器視窗,並使用為應用程式建立的網域名稱。您應該會看到與本機建立和測試相同的 Flask 網站。
若未顯示您的應用程式正在執行,或收到錯誤訊息,請參閱疑難排解部署尋求協助,以判斷錯誤發生的原因。
若您「確實」看見您的應用程式正在執行,恭喜您,您透過 Elastic Beanstalk 部署的第一個 Flask 應用程式已完成!
清除
當您完成使用 Elastic Beanstalk 時,即可終止您的環境。Elastic Beanstalk 會終止與環境相關聯的所有 AWS 資源,例如 Amazon EC2執行個體 、資料庫執行個體 、負載平衡器 、安全群組和警示 。
從主控台終止 Elastic Beanstalk 環境
開啟 Elastic Beanstalk 主控台
,然後在區域清單中選取您的 AWS 區域。 -
在導覽窗格中,選擇環境,然後在清單中選擇您環境的名稱。
注意
如果您有許多環境,請使用搜尋列來篩選環境清單。
-
選擇 Actions (動作),然後選擇 Terminate Environment (終止環境)。
-
使用畫面顯示對話方塊來確認環境終止。
您可以使用 Elastic Beanstalk,隨時輕鬆地為您的應用程式建立新環境。
或者,使用 EB CLI:
~/eb-flask$ eb terminate flask-env
後續步驟
如需 Flask 的詳細資訊,請造訪 flask.pocoo.org
若您欲嘗試其他 Python Web 框架,請參閱將 Django 應用程式部署至 Elastic Beanstalk。