<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          開(kāi)源框架 Zappa:上線 Python 應(yīng)用僅需一條命令!

          共 8541字,需瀏覽 18分鐘

           ·

          2021-03-14 17:14

           △點(diǎn)擊上方“Python貓”關(guān)注 ,回復(fù)“2”加入交流群

          劇照:旺達(dá)幻視

          作者:HelloGitHub-吱吱

          這里是 HelloGitHub 推出的《講解開(kāi)源項(xiàng)目》系列,今天要向小伙伴們介紹一個(gè) Python 無(wú)服務(wù)(Serverless)框架 Zappa。

          Zappa 讓我們可以輕松部署 Python 應(yīng)用程序:僅需幾條命令、打包代碼、上傳云服務(wù)器、程序上線,bingo 一氣呵成!從此減少部署成本,放下運(yùn)維的重?fù)?dān)。僅需你有一點(diǎn)點(diǎn) Python Web 基礎(chǔ)!

          它到底有多便捷?一條命令即刻部署!

          項(xiàng)目地址:https://github.com/Miserlou/Zappa

          下面就讓我們動(dòng)手來(lái)試試吧!

          一、前言

          1.1 介紹 Serverless

          剛開(kāi)篇便提到了一個(gè)莫名其妙的名詞:無(wú)服務(wù)(Serverless),一開(kāi)始我也是問(wèn)號(hào)臉,經(jīng)過(guò)多方搜證,我們可以簡(jiǎn)單的認(rèn)為 Serverless 是指不必?fù)?dān)心底層基礎(chǔ)結(jié)構(gòu),不需要管理服務(wù)器,從而來(lái)構(gòu)建和運(yùn)行應(yīng)用程序。具體概念小課堂如下:

          1.1.1 什么鬼?

          回憶一下,平時(shí)上線一個(gè)簡(jiǎn)單的 Python Web 應(yīng)用的過(guò)程。

          • 一個(gè) 24 小時(shí)不間斷運(yùn)行的服務(wù)器:比如云主機(jī),用以搭建代碼運(yùn)行環(huán)境和進(jìn)行系統(tǒng)配置,維持著運(yùn)行我們的應(yīng)用;
          • 部署 Web 服務(wù)器:我們需要選擇合適的 Web 服務(wù)器,經(jīng)過(guò)配置和啟動(dòng),實(shí)現(xiàn)反向代理和負(fù)載均衡;
          • 域名綁定:最后如果要被廣泛用戶訪問(wèn),我們需要注冊(cè)域名,并且綁定在服務(wù)器;
          • 運(yùn)營(yíng)維護(hù):配置和啟動(dòng)在應(yīng)用上線之后,我們還需要管理和維護(hù)我們的服務(wù)器,預(yù)防黑客攻擊,應(yīng)對(duì)未來(lái)用戶訪問(wèn)高峰期。

          而對(duì)于使用 Serverless 架構(gòu)的應(yīng)用,我們只需要關(guān)心我們的應(yīng)用編寫(xiě)和核心業(yè)務(wù),無(wú)需操心云主機(jī)、操作系統(tǒng)、資源分配和 Web 服務(wù)器配置等相關(guān)問(wèn)題,無(wú)需考慮服務(wù)器的規(guī)格大小、存儲(chǔ)類(lèi)型、網(wǎng)絡(luò)帶寬、自動(dòng)擴(kuò)縮容問(wèn)題,無(wú)需再對(duì)服務(wù)器進(jìn)行運(yùn)維、不斷打系統(tǒng)補(bǔ)丁和應(yīng)用補(bǔ)丁、無(wú)需進(jìn)行數(shù)據(jù)備份等工作。一切非核心業(yè)務(wù)都外包給了公共云營(yíng)運(yùn)商,讓開(kāi)發(fā)人員從復(fù)雜的部署和運(yùn)維環(huán)境中脫身出來(lái),專(zhuān)注于業(yè)務(wù)本身的價(jià)值。

          用 Zappa 里的一句話說(shuō)就是 “without any permanent infrastructure”(無(wú)需任何永久性基礎(chǔ)設(shè)施)。

          敲黑板,盡管從名字上說(shuō)是 Serverless,但是仍然需要物理服務(wù)器,只是我們開(kāi)發(fā)人員成了甩手掌柜。

          1.1.2 好處有?

          • 降低運(yùn)維需求和維護(hù)成本;
          • 完全自動(dòng)化的彈性擴(kuò)容和縮容:在業(yè)務(wù)高峰期時(shí),產(chǎn)品的計(jì)算能力和容量自動(dòng)擴(kuò)大,承載更多的用戶請(qǐng)求;反之,在業(yè)務(wù)下降時(shí),所使用的資源也會(huì)同時(shí)收縮,避免資源浪費(fèi);
          • 節(jié)省開(kāi)支,全新的計(jì)量計(jì)費(fèi)模式:開(kāi)發(fā)者僅需根據(jù)使用量來(lái)付費(fèi)。在無(wú)業(yè)務(wù)量的情況下,不會(huì)有空閑資源占用,也不會(huì)有費(fèi)用產(chǎn)生。

          1.1.3 普遍認(rèn)為 Serverless = FaaS + BaaS

          • BaaS(Backedn as a Service 后端即服務(wù))
            • 后端,指的就是各種云產(chǎn)品和云服務(wù),例如對(duì)象存儲(chǔ) OS ,消息隊(duì)列 MQ,云數(shù)據(jù)庫(kù) DB,云緩存 Redis以及各種以 API 形式提供的服務(wù)。用戶直接開(kāi)通即可使用,無(wú)需考慮部署、擴(kuò)容、備份、安全等各種運(yùn)維工作。
          • FaaS(Functions as a Service 函數(shù)即服務(wù))
            • 是 Serverless 的核心,讓用戶僅需編寫(xiě)和上傳核心業(yè)務(wù)代碼,交由平臺(tái)完成部署、調(diào)度、流量分發(fā)和彈性伸縮等能力,它提供了一種新的方式來(lái)提供計(jì)算資源,進(jìn)一步降低云計(jì)算的使用門(mén)檻。

          1.1.4 AWS Lambda

          在該項(xiàng)目中,伸手白piao AWS 海外區(qū)域賬戶免費(fèi) AWS Lambda 套餐。AWS Lambda 作為 Serverless 最早的框架產(chǎn)品由亞馬遜在2014年推出,是一種無(wú)服務(wù)器的計(jì)算服務(wù),無(wú)需預(yù)置或管理服務(wù)器即可運(yùn)行代碼。Lambda 幾乎可以為任何類(lèi)型的應(yīng)用程序或后端服務(wù)運(yùn)行代碼,我們只需上傳相應(yīng)的代碼,它會(huì)處理運(yùn)行和擴(kuò)展代碼所需的一切工作。

          1.2 Python 的 Serverless 框架

          本篇文章的主角:Zappa 登場(chǎng)!我們可以通過(guò) Zappa 工具體驗(yàn)一下 Serverless 技術(shù),用它實(shí)現(xiàn)我們 Python 應(yīng)用程序的無(wú)服務(wù)器部署,初步體驗(yàn)無(wú)限伸縮擴(kuò)展、零宕機(jī)、零維護(hù)的快捷。有了 Zappa,我們無(wú)需:

          • 配置 Web 服務(wù)器
          • 付費(fèi) 24/7 服務(wù)器的正常運(yùn)行時(shí)間
          • 擔(dān)心負(fù)載平衡和可擴(kuò)展性
          • 保持自己的服務(wù)器時(shí)刻在線狀態(tài)

          二、親自動(dòng)手

          實(shí)戰(zhàn)時(shí)間:已經(jīng)實(shí)驗(yàn)(踩坑)成功(不斷)的我就來(lái)分享部署一個(gè)簡(jiǎn)單的 Flask 應(yīng)用的過(guò)程,不要擔(dān)心跟著做你也可以~

          2.1 環(huán)境

          1. Python版本要求:3.6/3.7/3.8
          2. 測(cè)試系統(tǒng):Ubuntu 18.04.4 LTS

          2.2 準(zhǔn)備

          1. 保證自己的項(xiàng)目是運(yùn)行在虛擬環(huán)境下。

            # 需要安裝 Python 3.x 版本
            python --version

            # 安裝 Pipenv
            pip install --user pipenv

            # 進(jìn)入自己的項(xiàng)目
            cd demo

            # 實(shí)例化 pipfile 和 venv
            pipenv shell
          2. 安裝 Zappa 和 Flask,項(xiàng)目需要其他庫(kù)的話,可自行添加。

            $ pipenv install zappa flask
          3. 在目錄下創(chuàng)建 my_app.py 文件,寫(xiě)入官方樣例,可以先 pipenv run python my_app.py看看是否能正常運(yùn)行

            from flask import Flask
            app = Flask(__name__)

            @app.route('/')
            def hello():
                return "hello, from Zappa!\n"

            if __name__ == '__main__':
                app.run()
          4. 注冊(cè) AWS 賬戶,并且正確安裝 AWS credentials file

            • 登錄 AWS,找到 My Security Credentials 下的 Access keys (access key ID and secret access key) ,如果沒(méi)有則創(chuàng)建一個(gè),記住 access key IDsecret access key

            • 安裝 AWS 的命令行界面,添加 credentials

              # 在虛擬環(huán)境下安裝
              pipenv install awscli

              # 查看信息
              aws configure list

              # 添加,并且按照提示將 access key ID 和 secret access key 填入
              aws configure

              # 后兩個(gè) region name 和 output format 選填
            • 此時(shí)在 ~/.aws 目錄下會(huì)出現(xiàn)兩個(gè)文件 config 和 credentials,credentials 中儲(chǔ)存了 AWS 的 access key IDsecret access key, config 中儲(chǔ)存了 region name 和  output format 信息。

            • 如果是在 Windows 上操作的同學(xué),可以查看官方提供的安裝 AWS credentials file 的教程。

          2.3 安裝與配置

          1. 通過(guò)執(zhí)行下面語(yǔ)句進(jìn)行初始化,定義部署和配置的設(shè)置,自動(dòng)檢測(cè)應(yīng)用類(lèi)型(Flask 或 Django)

            $ zappa init

            在執(zhí)行過(guò)程中,可能需要如下設(shè)置,后續(xù)也可以在新生成的 zappa_setting.json 的配置文件中修改:

            完成后,我們的項(xiàng)目目錄中將有一個(gè) zappa_settings.json 文件,里面是我們剛剛定義的基本部署設(shè)置,后期我們可以按照自己的需求修改此文件。

            {
                "dev": {
                    "app_function""my_app.app",
                    "profile_name"null,
                    "project_name""demo",
                    "runtime""python3.6",
                    "s3_bucket""zappa-ti0ra29xi"
                }
            }
          2. 注意如果之前已經(jīng)在 ~/.aws/config 文件中添加 region 信息,則會(huì)在 zappa init 的時(shí)候自動(dòng)尋找到這些 region 信息,無(wú)需后續(xù)修改。

            如果之前沒(méi)有添加,則修改 zappa_settings.json,添加 region 信息如下:

            # 修改如下
            {
                "dev": {
                    "app_function""my_app.app",
                    "profile_name": null,
                    "project_name""demo",
                    "runtime""python3.6",
                    "s3_bucket""zappa-ti0ra29xi"
                    "aws_region""us-west-2"
                }
            }

            region 的信息可以自行選擇。

          2.4 部署和使用

          配置設(shè)置后,可以使用如下命令將應(yīng)用程序打包并部署:

          $ zappa deploy dev

          當(dāng)我們調(diào)用 deploy 時(shí),Zappa 會(huì)自動(dòng)將我們的應(yīng)用程序和本地虛擬環(huán)境打包到 Lambda 兼容的 archive,用為 Lambda 預(yù)先編譯的版本替換所有依賴(lài)項(xiàng),設(shè)置功能處理程序和必要的 WSGI 中間件,然后上傳 archive 到 S3,創(chuàng)建和管理必要的Amazon IAM 策略和角色,將其注冊(cè)為新的 Lambda function,創(chuàng)建新的 API 網(wǎng)關(guān)資源,為其創(chuàng)建 WSGI 兼容的路由,將其鏈接到新的 Lambda function,最后從 S3 bucket 中刪除 archive。

          執(zhí)行成功后,就會(huì)出現(xiàn)一個(gè)鏈接,點(diǎn)擊鏈接即可訪問(wèn)我們的簡(jiǎn)易 Web 應(yīng)用。看到已上線的應(yīng)用程序,心內(nèi)竊喜,直呼快準(zhǔn)狠。

          三、其他命令

          1. 更新操作:假設(shè)應(yīng)用程序已經(jīng)部署完畢,并且只需要上傳新的 Python 代碼,而無(wú)需修改基礎(chǔ)路由,則可以執(zhí)行以下操作:

            $ zappa update dev

            這將創(chuàng)建一個(gè)新的 archive,將其上傳到 S3 并更新 Lambda function 以使用新代碼。

          2. 查看部署和事件計(jì)劃的狀態(tài),只需使用命令:

            $ zappa status production
          3. 查看部署的日志:

            $ zappa tail dev

            # 過(guò)濾 HTTP 請(qǐng)求
            $ zappa tail dev --http

            # 執(zhí)行相反操作,并且僅顯示非 HTTP 事件和日志消息
            $ zappa tail dev --non-http

            # 選擇時(shí)長(zhǎng)
            $ zappa tail dev --since 4h # 4 hours
          4. 回滾操作:通過(guò)提供要返回的修訂版本數(shù)將部署的代碼回滾到以前的版本。

            # 回滾到3年前部署的版本
            $ zappa rollback production -n 3
          5. 安排 function 定期執(zhí)行:修改 zappa_setting.json ,加入如下內(nèi)容:

            {
                "dev": {
                    ...
                    "events": [{
                        // The function to execute
                        "function""your_module.your_function",
                        // When to execute it (in cron or rate format)
                        "expression""rate(1 minute)" 
                    }],
                    ...
                }
            }

            然后執(zhí)行如下操作,我們的 function 就會(huì)在每分鐘執(zhí)行一次。

            $ zappa schedule dev

            # cancal
            $ zappa unschedule dev
          6. 取消部署:如果要?jiǎng)h除以前發(fā)布的 API Gateway 和 Lambda function,則只需:

            $ zappa unschedule dev

          四、踩坑建議

          在成功運(yùn)行一次之前,踩坑千千萬(wàn)萬(wàn)遍,都是因?yàn)樽约菏謿堁巯鼓Ц牧撕芏嗟胤剑呀?jīng)歷過(guò)的報(bào)錯(cuò)記錄下來(lái),分享給和我一樣的小小白。

          1. “Unable to import module ‘handler’: attempted relative import with no known parent package”:原因是我們期望的依賴(lài)在虛擬的環(huán)境中沒(méi)有,需要查看自己虛擬環(huán)境中的依賴(lài)是否完整。

          2. 出現(xiàn)如下報(bào)錯(cuò),可以更換一個(gè) region 信息。

            $ zappa deploy dev
            Calling deploy for stage dev..
            Creating demo-dev-ZappaLambdaExecutionRole IAM Role..
            Error: Failed to manage IAM roles!
            You may lack the necessary AWS permissions to automatically manage a Zappa execution role.
            Exception reported by AWS:An error occurred (InvalidClientTokenId) when calling the CreateRole operation: The security token included in the request is invalid.
            To fix this, see here: https://github.com/Miserlou/Zappa#custom-aws-iam-roles-and-policies-for-deployment
          3. 如果我們?cè)?zappa init 的時(shí)候,不使用默認(rèn)分配的 s3_bucket ,則須注意自己的名稱(chēng)是不允許重名的,否則會(huì)報(bào)錯(cuò) botocore.errorfactory.BucketAlreadyExists: An error occurred (BucketAlreadyExists) when calling the CreateBucket operation: The requested bucket name is not available. The bucket namespace is shared by all users of the system. Please select a different name and try again.

          五、寫(xiě)在最后

          是不是當(dāng)自己成功部署后,突然覺(jué)得妙不可言,一身輕松,好像再也沒(méi)有了之前所說(shuō)的繁瑣的過(guò)程,反而幾條命令,白piao AWS 的服務(wù),咱的應(yīng)用程序就輕巧上線了呢,還不趕緊把生成的鏈接分享給小伙伴們點(diǎn)擊一下。

          至此,我們已經(jīng)可以基本實(shí)現(xiàn)快速部署一個(gè)簡(jiǎn)單的 Flask 應(yīng)用了,由于篇幅有限,還有部分 Zappa 的高級(jí)功能沒(méi)有提及,以及如何使用 Zappa 部署 Django 應(yīng)用或者一個(gè)更為龐大的項(xiàng)目(包含數(shù)據(jù)庫(kù)等),希望感興趣的小伙伴們能夠多多嘗試,我已經(jīng)開(kāi)始期待得搓搓手了。

          近兩年里,我原創(chuàng)和翻譯了130+技術(shù)文章,主要關(guān)注Python進(jìn)階、小技巧、編程設(shè)計(jì)、PEP翻譯、Python哲學(xué)等話題。現(xiàn)已集結(jié)出了一本電子書(shū)《優(yōu)雅的Python》,請(qǐng)回復(fù)數(shù)字『1』,獲取下載地址。

          近期熱門(mén)文章推薦:

          Python 中 -m 的典型用法、原理解析與發(fā)展演變
          你可能不知道的 Python 技巧
          Python 進(jìn)階:enum 模塊源碼分析
          6 個(gè)例子教你重構(gòu) Python 代碼
          非常適合小白的 Asyncio 教程

          分享在看是對(duì)我最大的支持!

          瀏覽 45
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  啪啪网站网址 | 九九精品视频在线播放 | 国产高清无码一级片 | 久久夜色婷婷 | 特黄AAAAAAA片免费视频 |