如何解决 Python (Boto 3) Lambda 函数出现的“未知服务”、“参数验证失败”或“对象没有属性”错误?
上次更新时间:2021 年 11 月 29 日
我的 Python (Boto 3) AWS Lambda 函数返回“未知服务”、“参数验证失败”或“对象没有属性”错误。为什么我的函数返回这些错误,我该如何解决这个问题?
简短描述
未使用最新版本的 Boto 3 的 Python (Boto 3) Lambda 函数可能会返回以下任意错误:
- 未知服务
- 参数验证失败
- 对象没有属性
当该函数尝试调用需要最新版本的 Boto 3 的 AWS 服务或 AWS API 时,会发生这些错误。
要解决此问题,请创建一个使用最新版本的 Boto 3 的 Lambda 层。然后,将该层添加到函数的配置中。
重要提示:以下过程假定您使用的是最新版本的 Botocore。如果您没有使用最新版本的 Botocore,则必须先升级 Botocore,然后才能升级到最新的 Boto 3 版本。根据特定操作系统和 Python 配置的需要,调整您要采取的步骤。
解决方法
注意:如果您在运行 AWS Command Line Interface (AWS CLI) 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI。
最佳实践是在建立 Lambda 运行时的同一操作系统上创建 Lambda 层。例如,Python 3.8 基于 Amazon Linux 2 Amazon Machine Image (AMI)。但是,Python 3.7 和 Python 3.6 基于 Amazon Linux AMI。
(先决条件)安装 pip3 和最新的 AWS CLI 版本
1. 如果您尚未安装,则安装 pip3 以进行 Python 3 打包。-或者- 如果您有先前版本的 pip,则对其进行升级。
2. 使用 pip3 安装或升级 AWS CLI。注:最新版本的 AWS CLI 包括 Lambda 层 API 模型。
创建一个使用最新版本的 Boto 3 的 Lambda 层
重要提示:以下 AWS CLI 命令适用于 Linux、Unix 和 macOS 操作系统。在每个命令中,确保将 boto3-mylayer 替换为 lib 文件夹和 Lambda 层的首选名称。
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 函数的配置中,请运行以下命令:
重要提示:请将 myfunction 替换为您的函数名称。将 <layer ARN> 替换为层的 ARN。
aws lambda update-function-configuration --function-name myfunction --layers <layer ARN>
现在,所有 AWS 服务和参数均可用于您的 Lambda 函数。
提示:在函数代码中使用 print(boto3.__version__) 和 print(botocore.__version__) 来确认 Boto 3 和 Botocore 的版本。