跳至內容

如何解決 Python (Boto 3) Lambda 函式執行時期錯誤?

2 分的閱讀內容
0

我的 Python (Boto3) AWS Lambda 函式傳回「unknown service」、「parameter validation failed」或「object has no attribute」錯誤。

簡短說明

當函式呼叫需要最新版 Boto3 的 AWS 服務或 AWS API 時,就會發生這些錯誤。

若要解決此問題,請建立使用最新版 Boto3 的 Lambda 層。接著,將新層新增至 Lambda 函式的組態。您可以手動建立 Lambda 層,也可以使用 Docker 建立。最佳實務是透過 Docker 建立或更新 Lambda 層,以確保二進位檔案正確無誤。

重要: 如果您沒有最新版 Botocore,必須先升級 Botocore,才能升級至最新版 Boto3。如需更多資訊,請參閱 GitHub 網站上的 botocore

解決方法

注意: 如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

最佳實務是在與 Lambda 執行時期所採用的作業系統相同的系統上建立 Lambda 層。例如,Python 3.8 和 3.9 以 Amazon Linux 2 Amazon Machine Image (AMI) 為基礎。Python 3.7 和 Python 3.6 以 Amazon Linux AMI 為基礎。

先決條件:

  • 安裝適用於 Python 3 的 pip3 套件。如果您使用舊版 pip,請將其升級。如需更多資訊,請參閱 pip 網站上的安裝
  • 使用 pip3 安裝或更新 AWS CLI。

注意: 最新版 AWS CLI 包含 Lambda Layers API 模型。

使用 Docker 建立或更新採用最新版 Boto3 的 Lambda 層

先決條件: 在您的系統上安裝 Docker。若要下載最新版 Docker,請參閱安裝 Docker

完成以下步驟:

  1. 前往您要建立層檔案的目錄。

  2. 在系統的 CLI 中執行以下命令:

    docker run --entrypoint "" -v "$PWD":/var/task "public.ecr.aws/lambda/python:[IP_ADDRESS]" /bin/sh -c "mkdir -p /tmp/python && pip3 install boto3 -t /tmp/python && cd /tmp && yum install -y zip && zip -r /var/task/boto3-mylayer.zip ."

    注意:public.ecr.aws/lambda/python:[IP_ADDRESS] 替換為適用於您所用 Python 版本的基礎映像檔。將 boto3-mylayer 替換為您的自訂套件名稱。命令成功完成後,目前目錄中會出現以套件命名的檔案,例如 boto3-mylayer.zip

  3. 若要建立或更新 Lambda 層,請執行以下 publish-layer-version 命令:

    aws lambda publish-layer-version --layer-name boto3-mylayer --zip-file fileb://boto3-mylayer.zip --compatible-runtimes python3.9 --region REGION_NAME

    注意:boto3-mylayer 替換為您的套件名稱。將 REGION_NAME 替換為您的 AWS 區域。此外,請納入您先前指定的相容執行時期。

手動建立採用最新版 Boto3 的 Lambda 層

以下 AWS CLI 命令適用於 Linux、Unix 和 macOS 作業系統。

注意: 在每個命令中,請確定將 boto3-mylayer 替換為您要用於 lib 資料夾和 Lambda 層的名稱。

完成以下步驟:

  1. 建立 lib 資料夾:

    LIB_DIR=boto3-mylayer/pythonmkdir
  2. LIB_DIR 中安裝程式庫:

    pip3 install boto3 -t $LIB_DIR
  3. 若要將所有相依套件壓縮至 /tmp/boto3-mylayer.zip,請執行以下命令:

    cd boto3-mylayer
    zip -r /tmp/boto3-mylayer.zip .
  4. 若要發佈該層,請執行以下 publish-layer-version 命令:

    aws lambda publish-layer-version --layer-name boto3-mylayer --zip-file fileb:///tmp/boto3-mylayer.zip

    上述命令會傳回新層的 Amazon Resource Name (ARN)。

    輸出範例:

    arn:aws:lambda:region:$ACC_ID:layer:boto3-mylayer:1

將新層新增至 Lambda 函式的組態

若要將新層新增至 Lambda 函式的組態,請執行以下 update-function-configuration 命令:

aws lambda update-function-configuration --function-name MY_FUNCTION --layers LAYER_ARN

注意:MY_FUNCTION 替換為您的函式名稱。將 LAYER_ARN 替換為您的層 ARN。

您的 Lambda 函式現在可以使用所有 AWS 服務和引數。

若要確認 Boto3 和 Botocore 的版本,請在函式程式碼中使用 print(boto3.__version__)print(botocore.__version__)。使用這些命令前,請先匯入 boto3 和 botocore 程式庫。

相關資訊

使用 Python 建置 Lambda 函式

使用 Python Lambda 函式的 .zip 檔案封存

AWS 官方已更新 6 個月前