如何將帶有編譯二進製檔的 Python 套件添加到我的部署套件中,並使該套件與 Lambda 兼容?

2 分的閱讀內容
0

我使用了 pip 安裝包含已編譯程式碼的 Python 套件,現在我的 AWS Lambda 函數傳回「無法匯入模組」錯誤。

簡短描述

預設情況下,包含編譯程式碼 (例如 NumPy 和 pandas) 的 Python 套件並不總是與 Lambda 執行期相容。如果您使用 pip 安裝這些套件,這些套件會下載並編譯適用於本機電腦架構的 module-name 套件。如果您不使用 Linux 作業系統 (OS),這會使您的部署套件與 Lambda Python 執行期不相容。

若要讓您的部署套件或層與非 Linux 作業系統上的 Lambda 相容,請使 manylinux2014 作為-平台參數值執行** pip 安裝指令****。**

注意macOS --平台 標籤不起作用。例如:win_amd64macosx_10_6_intel 標籤不會安裝與 Lambda 相容的部署套件。

解決方法

**注意:**下列範例程序說明如何為在 x86\ _64 架構上執行的 Lambda Python 3.9 執行期安裝 pandas。

  1. 開啟命令提示字元。然後,運行以下 pip 命令以確認您使用的是 19.3.0 版本或更新版本的 pip:

    pip --version

    如果您使用的 pip 版本 比 19.3.0 版本的 pip 更舊,請升級到最新版本的 pip:

    python3.9 -m pip install --upgrade pip
  2. 在 Lambda 函數的專案目錄中,將預先編譯的 Python 套件的 .whl 檔案安裝為相依性:

    重要事項: my-lambda-function 替換為函數專案目錄名稱。

    pip install \    
        --platform manylinux2014_x86_64 \
        --target=my-lambda-function \
        --implementation cp \
        --python-version 3.9 \
        --only-binary=:all: --upgrade \
        pandas
  3. 開啟 Lambda 函數的專案目錄。如果您使用 macOS,請執行下列命令:

    cd my-lambda-function
  4. 在文字編輯器中,建立名為lambda\ _function.py的新檔案。然後,將以下範例代碼複製並粘貼到檔案中:

    import numpy as np
    import pandas as pd
    def lambda_handler(event, context):
        df2 = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),columns=["a", "b", "c"])
        number = np.pi
        print(df2)
        print(number)

    將此檔案儲存在 Lambda 函數的專案目錄中。

  5. 建立 Lambda 部署套件 .zip 檔案封存,其中包含所有已安裝的程式庫和原始程式碼:

    zip -r ../my-deployment-package.zip .

    您可以使用 my-deployment-package.zip檔案封存來建立新的 Python 3.9 Lambda 函數,或是更新現有函數。如需指示,請參閱使用 Python Lambda 函數的 .zip 檔案封存。

    **注意:**您可以使用類似的程序建立可跨多個函數使用的 Lambda 層。例如,下列命令會建立新的 Lambda 層來安裝 Lambda Python 3.9 執行期的 pandas,並在 arm64 架構上執行:

    pip install \
        --platform manylinux2014_aarch64 \
        --target=./python/lib/python3.9/site-packages \
        --implementation cp \
        --python-version 3.9 \
        --only-binary=:all: --upgrade \
        pandas

相關資訊

建立和共用 Lambda 層

AWS 官方
AWS 官方已更新 10 個月前