無伺服器 - 包依賴項
在上一章中,我們學習瞭如何在無伺服器框架中使用外掛。我們特別關注了 Python Requirements 外掛,並瞭解瞭如何將其用於將 numpy、scipy、pandas 等依賴項與 Lambda 函式的應用程式程式碼捆綁在一起。我們甚至看到了一個需要 numpy 依賴項的函式部署示例。我們看到它在本地執行良好,但在 AWS Lambda 控制檯中,如果您使用的是 Windows 或 Mac 機器,則會遇到錯誤。讓我們瞭解為什麼該函式可以在本地執行,但在部署後卻無法執行。
如果您檢視錯誤訊息,您會得到一些提示。我特別指的是一行——“匯入 numpy C 擴充套件失敗”。現在,許多重要的 Python 包(如 numpy、pandas、scipy 等)都需要編譯 C 擴充套件。如果我們在 Windows 或 Mac 機器上編譯它們,那麼 Lambda(Linux 環境)在嘗試載入它們時會丟擲錯誤。所以重要的問題是,如何避免此錯誤?Docker 閃亮登場!
什麼是 Docker?
根據 維基百科,Docker 是一 *套平臺即服務 (PaaS) 產品,它使用作業系統級虛擬化來將軟體交付到稱為容器的包中。*如果您進一步瀏覽 Docker 的維基百科頁面,您會發現一些更相關的陳述——*Docker 可以將應用程式及其依賴項打包到可以在任何 Linux、Windows 或 macOS 計算機上執行的虛擬容器中。這使應用程式能夠在各種位置執行,例如本地、公共雲和/或私有云。*我認為在上述陳述之後應該非常清楚。我們出現錯誤是因為在 Windows/Mac 上編譯的 C 擴充套件在 Linux 中不起作用。
我們可以透過將應用程式打包到可以在任何作業系統上執行的容器中來簡單地繞過該錯誤。Docker 在後臺為了實現這種作業系統級虛擬化所做的事情超出了本章的範圍。
安裝 Docker
您可以訪問 https://dockerdocs.tw/engine/install/ 來安裝 Docker Desktop。如果您使用的是 Windows 10 家庭版,則 Windows 版本應 至少為 1903(2019 年 5 月更新)。因此,您可能需要在安裝 Docker Desktop 之前升級您的 Windows 10 作業系統。Windows 專業版或企業版沒有此類限制。
在無伺服器框架中使用 dockerizePip
在您的機器上安裝 Docker Desktop 後,您只需要在您的 serverless.yml 檔案中新增以下內容即可使用 Docker 打包您的應用程式和依賴項:
custom:
pythonRequirements:
dockerizePip: true
請注意,如果您從上一章開始就一直跟著我做,您很可能已經將程式碼部署到 Lambda 一次了。這會在您的本地儲存中建立一個靜態快取。預設情況下,無伺服器框架會使用該快取來捆綁依賴項,因此不會建立 Docker 容器。因此,為了強制無伺服器框架使用 Docker,我們將向 pythonRequirements 新增另一個語句:
custom:
pythonRequirements:
dockerizePip: true
useStaticCache: false #not necessary if you will be deploying the code to lambda for the first time.
如果您是第一次部署到 Lambda,則不需要最後一條語句。通常,您應該將 useStaticCache 設定為 true,因為這會在您沒有更改依賴項或打包方式時節省一些打包時間。
透過這些新增,serverless.yml 檔案現在如下所示:
service: hello-world-python
provider:
name: aws
runtime: python3.6
profile: yash-sanghvi
region: ap-south-1
functions:
hello_world:
handler: handler.hello
timeout: 6
memorySize: 128
plugins:
- serverless-python-requirements
custom:
pythonRequirements:
dockerizePip: true
useStaticCache: false #not necessary if you will be deploying the code to lambda for the first time.
現在,當您執行 **sls deploy -v** 命令時,請確保 Docker 在後臺執行。在 Windows 上,您只需在“開始”選單中搜索 Docker Desktop 並雙擊該應用程式即可。您很快就會收到一條訊息,表明它正在執行。您也可以透過 Windows 中電池圖示附近的彈出視窗來驗證這一點。如果您可以看到那裡的 Docker 圖示,則表示它正在執行。
現在,當您在 AWS Lambda 控制檯上執行您的函式時,它應該可以工作了。恭喜!!
但是,在 AWS Lambda 控制檯上的“函式程式碼”部分,您會看到一條訊息,提示“Lambda 函式“hello-world-python-dev-hello_world”的部署包太大,無法啟用內聯程式碼編輯。但是,您仍然可以呼叫您的函式。”
看來新增 Numpy 依賴項使捆綁包大小過大,因此我們甚至無法在 Lambda 控制檯中編輯我們的應用程式程式碼。我們如何解決這個問題?請閱讀下一章以瞭解詳情。