如何解決 Python(Boto3)Lambda 函數中的「未知服務」、「參數驗證失敗」和「物件無屬性」錯誤?

2 分的閱讀內容
0

我的 Python(Boto3)AWS Lambda 函數傳回「未知服務」、「參數驗證失敗」或「物件無屬性」錯誤訊息。

簡短說明

未使用最新版本的 Boto3 的 Python (Boto3) Lambda 函數可能會傳回以下任何錯誤訊息:

  • 未知的服務
  • 參數驗證失敗
  • 物件無屬性

當函數嘗試呼叫需要最新版本的 Boto3 的 AWS 服務或 AWS API 時,就會發生這些錯誤。
若要解決此問題,請建立使用最新版本的 Boto3 的 Lambda 圖層。您可以手動執行此操作,也可以使用 Docker。透過 Docker 升級 Lambda 圖層會更有效率,這可確保 Lambda 作業系統的二進制數是正確的。

**重要事項:**以下程序假設您(在 GitHub 上)擁有最新版本的 Botocore。如果您沒有最新版本的 Botocore,那麼您必須先升級 Botocore,然後才能升級到最新的 Boto3 版本。在您的特定和 Python 配置需要時執行解決方法。

解決方法

**注意:**如果您在執行 AWS Command Line Interface (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。

(先決條件) 安裝 pip3 和最新版本的 AWS CLI

1、 如果您還沒有,請從 pip 網站安裝 Python 3 套件的 pip3

-或-

如果您有舊版的 pip,請從 pip 網站升級

2、 使用 pip3 安裝或升級 AWS CLI

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

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

**(先決條件) 安裝 Docker **

確保您在系統上安裝了 Docker 並且正在運行。若要下載最新版本的 Docker,請參閱 Docker 的安裝

**建立並套用圖層 **

1、 導覽至您要建立圖層檔案的目錄。

2、 在系統的 CLI 中執行下列命令:

docker run --entrypoint "" -v "$PWD":/var/task "public.ecr.aws/lambda/python:3.9.2023.03.21.20" /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:3.9.2023.03.21.20 取代為您的 Python 版本的基本映像。您可以為您的套件將 boto3-mylayer 取代為自訂名稱。

3、 等待命令完成。成功完成後,您會在目前的目錄中看到有套餐名稱的檔案,例如 ** boto3-mylayer.zip**。

4、 若要建立或更新 Lambda 圖層,請執行下列命令:

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

注意:boto3-mylayer 取代為您的套件名稱。使用**您的 AWS 區域取代 **REGION_NAME。此外,請列入您先前指定的相容執行期。

手動建立使用最新 Boto3 版本的 Lambda 圖層

**重要事項:**下列 AWS CLI 命令適用於 Linux、Unix 和 macOS 作業系統。在每個命令中,請確保您有為 lib 資料夾和 Lambda 圖層將 boto3-mylayer 取代為您所偏好的名稱。

1、 建立一個 lib 資料夾:

LIB_DIR=boto3-mylayer/python
mkdir -p $LIB_DIR

2、 將程式庫安裝到 LIB_DIR

pip3 install boto3 -t $LIB_DIR

3、 將所有相依性壓縮到 /tmp/boto3-mylayer.zip 中:

cd boto3-mylayer
zip -r /tmp/boto3-mylayer.zip .

4、 發佈圖層:

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

該命令傳回新圖層的Amazon Resource Name (ARN)

Lambda 圖層 ARN 範例

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

將新圖層新增至 Lambda 函數的組態

若要將新層新增至 Lambda 函數的組態,請執行下列命令:

**重要事項:**將 MY_FUNCTION 取代為您的函數名稱。將 LAYER_ARN 取代為您圖層的 ARN。

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

所有 AWS 服務和引數現在均可供 Lambda 函數使用。

**提示:**要確認 Boto3 和 Botocore 的版本,請使用函數代碼中的 **print(boto3.__version__)**和 print(botocore.__version__)

相關資訊

使用 Python 構建 Lambda 函數

Lambda 執行期

使用 .zip 檔案存檔部署 Python 函數

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