如何解决 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 的版本。