本文爲 Serverless 社區成員撰稿。做者雲洋,從事信息管理工做,多年電子政務信息系統建設管理經驗,對 Serverless 技術和架構有濃厚興趣。html
這個假期挺長的,不過有幸在騰訊雲 Serverless 在線直播裏看到了 Serverless 的相關課程,從第一期學完,仍是憑添了不少學習樂趣。mysql
前面三節課學了一些 Serverless 的基本知識和架構特色,也跟着開發部署,其實都蠻有趣的,惟一就是都沒有管理後臺。第四期課程很好的彌補了這一不足。劉宇老師給你們帶來的項目 Python+HTML 的動態博客,後臺是基於 Flask 的,雖然我不太熟悉這個框架,可是老師給提供了課程的源碼,因此能夠先用後學。git
這節動態博客的直播回放地址是:github
劉宇老師的項目的 Github 地址是:sql
直播那天我提早準備好手機和電腦,就進教室了,不過當天課程收到網絡的干擾很大,一直很卡,後來劉老師從新錄製了課程,聽說錄到凌晨兩點,這一點必須點贊,敬業精神太感人啦。在老師的熱情帶領下,咱們的學習勁頭也是十足的啊。服務器
個人學習路徑可謂十分曲折,整整折騰了三天,不過最後終於實現了項目的成功部署,很開心!網絡
總體來講,其實項目部署就是四個步驟:架構
我在每個步驟都踩過坑,我基本上按照順序把坑和解決方案列出來,感興趣的同窗能夠基於上面的連接嘗試開發部署,若是遇到相關的坑,能夠對照參考。
Git下載報錯,錯誤信息是這樣以下:
remote: Counting objects: 100% (1438/1438), done.remote: Compressing objects: 100% (1100/1100), done.error: RPC failed; curl 18 transfer closed with outstanding read data remainingfatal: The remote end hung up unexpectedlyfatal: early EOFfatal: index-pack failed
百度以後,發現針對RPC錯誤須要修改Git的buffer,調到700M後依然報了上面的fatal錯誤,和網絡有關,最後放棄用git,選擇老師發在文檔裏的壓縮包,地址上面列出來了,你們能夠去自行取用。
部署過程當中由於 init.py 裏面用到了 pymysql,但是我沒有安裝,因而打開Anaconda Prompt 開始用 pip 安裝,然而 pip 好像死了同樣,徹底沒有反應,最後報錯說找不到包。後來經同窗和老師提醒,修改 pip 的源到國內,我用了清華的源,速度一下很快啊,安裝成功。修改源的代碼是:
pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple
若是你們須要安裝其餘包,就把 pymysql 換成要安裝的包。
可是 init.py 依然報錯,因而就吧 pymysql 的包放在項目目錄中,解決了問題。
init.py 的執行一致不順利,pymysql 的坑填完後繼續報錯。
因而覺得本身沒有安裝對 yaml,後來老師建議刪掉該語句,你們要注意,這個語句裏 Fullloader 出如今一個逗號後面,因此咱們只刪掉逗號後面的 loader=yaml.FullLoader 就行了。
其實若是用老師提供的測試庫的話,這個坑就不是問題,可是我以爲那麼多同窗作做業,老師的庫壓力會很大,正好我本身買了一個騰訊的雲數據庫是 MySql的,能夠直接拿來用。
因而我就天真的把數據庫地址改爲了本身的,覺得它能夠連上,可是鏈接超時,因而我有把用戶和密碼改爲本身的,結果仍是拒絕訪問,一直到我去雲數據庫控制檯去測試鏈接,才發現原來個人數據庫端口沒有寫對。
雲數據庫的外網連接設置仍是很方便的,此次做業讓我還進入了 PMA,進行了在線數據庫操做,挺好用的。到這裏,init.py 的坑就填平了,我看到新建數據庫的成功。
這個坑有點深,我在裏面爬了兩天才爬出來,並且之因此爬出來,徹底是由於換了網絡哦。
不得不說移動的家庭寬帶真的不給力啊,Git 連不上,部署函數老是斷線。我之因此在這個坑裏沒有很快出來,還有一個緣由,就是每次的報錯信息不同,這深深的吸引了我。
個人報錯信息五花八門,給你們分享一下:
這個錯誤出現的緣由其實也很難想通,由於給的信息太少,並不知道究竟是哪裏有問題。後來還報過一個相似的錯誤,印象裏是說讀不到 'admin_add_article',我後來發現 git 上面又更新了一個文件夾 picture,裏面有這個名字對應的圖片,因此我就從新 git clone 了項目文件,把picture文件夾拷貝了過來。
這類 443 的錯誤,我是一直沒有解決啦,直到我更換了網絡。不過你們能夠看到上面有一個存儲桶的部署信息,那個桶不是個人。
關於 InvalidParameterValue 不太理解,什麼樣的 ID 是合法的呢?我考慮應該是網絡中斷丟失了數據,致使有些字符沒了。
ECONNRESET 這個錯誤報了不少次,具體是什麼意思不太明白,socket hang up應該仍是網絡不通暢吧。
還有一個是超時了,估計是網絡狀況很差。
這個 undefined RequestId 也是出現了屢次的錯誤,很奇特。估計是網絡數據丟包形成的吧。
以上全部的問題都是網絡問題,解決方法:同窗們提醒我不要部署到 hongkong 區域,可能海外服務器會有網絡不穩定的狀況,因而我換到了beijing,依然不行,我還換到多 guangdong,網絡錯誤依然不斷。
這個網絡問題引起了個人很多猜疑啊:好比,我是否是頻繁部署系統被封IP了?是否是防止勒索病毒,443端口封閉啦?我家的寬帶是否是該換運營商了?
顯然最後一個猜疑是並確認了的。我利用手機數據流量包部署系統就很快,240s 左右解決問題。
這裏面其實報錯信息不是很友好,首先,我不知道具體到哪個文件的時候網絡斷開的,因此我不能確定是否是某一個文件有問題,若是這時候可以定位一個斷開的時候處理在哪個文件,會對用戶更有幫助。
而關於那個存儲桶,應該是老師的,由於後來在部署成功的一次我在信息裏看到了從老師的存儲桶裏上傳了代碼到一個存儲桶裏,而我在本身的存儲桶列表裏看到了那幾個桶。
之因此有幾個,是由於我換過幾個區來部署。有一些程序老師可能部署在他的桶裏,這樣是否是省咱們的流量呢?也多是爲了部署 Flask Admin 的過程更加平順,老師把一些依賴部署到了線上的桶裏。
記得上節課的老師也用了 Flask,他說 Flask 須要對應 Python 的精確版本,咱們每一個人的版本可能都會有些細小差異,形成部署過程的顛簸,老師爲了不這種情況,就額外處理了。老師,您用心啦!
由於每次網絡問題都發生在部署uploadPicture這個部分,時間很長,因此我都會忍不住cancel重來。
因而這個部分後來被我註釋掉了。註釋以後,部署很順利,由於換用了手機的網絡。這突如其來的順利讓我以爲 uploadPicture 多是無罪的,我應該把它放回來。因而我就取消了註釋,這時候災難發生了,10000s 以後它還在部署。
我很好奇,爲何這個部分這麼特殊,因而我打開一些 uploadPicture 的源文件來看,發如今 demo.py 裏面有不少設置和咱們的 global 設置不同,因而我開始七七八八的修改起來,然而,老師說那個文件不在全局發揮最用,只是qqcloud_cos 這個依賴的一個 demo,因而我又改了回去。
後來,有同窗說清空存儲桶能夠解決這種超長時間部署的問題,因而我試了一下。恩,真的管用哦!感謝同窗的提醒。
PS:我後來回想極可能就是缺乏 picture 那個文件夾吧,我猜想部署的過程可能會跑有些 test 程序,文件的代碼會被執行,而若是裏面的參數讀取不到就會一直停在那裏。
部署成功以後,我訪問後臺,發現只有登錄頁可用,其餘頁面基本上一點就報錯,Internal error。在老師的提示下,我到了函數的控制檯,查看了Blog_Admin的報錯信息,發現是數據庫鏈接不到。
但是我以前明明在數據庫裏新增數據的,因而我打開了 serverless.yml 文件和數據庫裏的庫名稱對照, 發現數據庫的名稱多了一個字母 l,哎,粗心啊粗心。修改了 yaml 文件後再次部署,成功了!
應該說控制檯的日誌挺詳細的,我以爲若是能把成功信息和報錯信息在顏色上區分一下就更好啦,目前看來是用時間戳來區分的,不過有時候請求多起來,不少正確和報錯信息在一塊兒,找起來很麻煩啊。要是有豐富一些的查詢選項也許更好用。
最後,我終於跳過了這些坑,上了岸!
部署成功後的頁面以下:http://blogdemo-1253166145.cos-website.ap-beijing.myqcloud.com/
因而,我帶着劉宇老師佈置的做業來投稿,信息化資產複用最大化,感受是一次很是開心的學習體驗!
傳送門:
- GitHub: github.com/serverless
- 官網:serverless.com
歡迎訪問:Serverless 中文網,您能夠在 最佳實踐 裏體驗更多關於 Serverless 應用的開發!