我的 Python (Boto3) AWS Lambda 函数返回“unknown service”(未知服务)、“parameter validation failed”(参数验证失败)或“object has no attribute”(对象没有属性)错误。
简短描述
不使用最新的 Boto3 版本的 Python (Boto3) Lambda 函数可能会返回以下错误:
- unknown service(未知服务)
- 参数验证失败
- object has no attribute(对象没有属性)
当函数调用需要最新的 Boto3 版本的 AWS 服务或 AWS API 时,将会发生这些错误。
要解决此问题,请创建一个使用最新的 Boto3 版本的 Lambda 层。您可以手动创建 Lambda 层,也可以使用 Docker 创建。最佳做法是通过 Docker 升级 Lambda 层,以确保您的二进制文件在 Lambda 操作系统上是正确的。
**重要事项:**以下过程假设您拥有最新的 Botocore 版本。如果您没有最新的 Botocore 版本,那么您必须先升级 Botocore,然后才能升级到最新的 Boto3 版本。有关详细信息,请参阅 GitHub 网站上的 botocore。
解决方法
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,确保您使用的是最新版本的 AWS CLI。
最佳做法是在 Lambda 运行时系统所基于的同一操作系统上创建 Lambda 层。例如,Python 版本 3.8 和 3.9 基于 Amazon Linux 2 亚马逊机器映像 (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。
创建并应用您的层
完成以下步骤:
-
导航到用于创建层文件的目录。
-
在系统的 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 替换为您的程序包的自定义名称。
命令成功完成后,您会在当前目录中看到一个包含您的程序包名称的文件,比如 boto3-mylayer.zip。
-
要创建或更新您的 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。请将 REGION_NAME 替换为您的 AWS 区域。此外,还包括您先前指定的兼容运行时。
手动创建使用最新 Boto3 版本的 Lambda 层
以下 AWS CLI 命令适用于 Linux、Unix 和 macOS 操作系统。
**注意:**在每条命令中,确保将 boto3-mylayer 替换为 lib 文件夹和 Lambda 层的首选名称。
完成以下步骤:
-
创建 lib 文件夹:
LIB_DIR=boto3-mylayer/pythonmkdir
-
将库安装到 LIB_DIR
pip3 install boto3 -t $LIB_DIR
-
要将所有依赖项压缩到 /tmp/boto3-mylayer.zip,请运行以下命令。
cd boto3-mylayer
zip -r /tmp/boto3-mylayer.zip
-
要发布层,请运行以下命令。
aws lambda publish-layer-version --layer-name boto3-mylayer --zip-file fileb:///tmp/boto3-mylayer.zip
该命令将返回新层的 Amazon 资源名称 (ARN)。
输出示例:
arn:aws:lambda:region:$ACC_ID:layer:boto3-mylayer:1
将新层添加到您的 Lambda 函数的配置中
要将新层添加到您的 Lambda 函数的配置中,请运行以下命令:
aws lambda update-function-configuration --function-name MY_FUNCTION --layers LAYER_ARN
**注意:**请将 MY_FUNCTION 替换为您的函数名称。请将 LAYER_ARN 替换为您的层的 ARN。
现在,所有 AWS 服务和参数均可用于您的 Lambda 函数。
要确认 Boto3 和 Botocore 的版本,请在您的函数代码中使用 print(boto3.__version__) 和 print(botocore.__version__)。
相关信息
使用 Python 构建 Lambda 函数
将 .zip 文件归档用于 Python Lambda 函数