如何解决 Python(Boto3)Lambda 函数中的“未知服务”、“参数验证失败”和“对象没有属性”错误?

2 分钟阅读
0

我的 Python(Boto3)AWS Lambda 函数返回“未知服务”、“参数验证失败”或“对象没有属性”错误。

简短描述

不使用最新的 Boto3 版本的 Python(Boto3)Lambda 函数可能会返回以下任何错误:

  • 未知服务
  • 参数验证失败
  • 对象没有属性

当函数尝试调用需要最新的 Boto3 版本的 AWS 服务或 AWS API 时,就会发生这些错误。
要解决此问题,请创建一个使用最新的 Boto3 版本的 Lambda 层。您可以手动执行此操作,也可以使用 Docker。通过 Docker 升级 Lambda 层效率更高,这样可以确保您的二进制文件在 Lambda 操作系统上是正确的。

**重要事项:**以下过程假设您拥有最新的 Botocore 版本(在 GitHub 上)。如果您没有最新的 Botocore 版本,那么您必须先升级 Botocore,然后才能升级到最新的 Boto3 版本。根据需要按您的特定配置和 Python 配置实施解决方法。

解决方法

**注意:**如果在运行 AWS 命令行界面(AWS CLI)命令时收到错误,请确保您使用的是最新的 Amazon CLI 版本

最佳做法是在 Lambda 运行时系统所基于的操作系统上创建 Lambda 层。例如,Python 版本 3.8 和 3.9 基于 Amazon Linux 2 亚马逊云机器镜像(AMI)。但是,Python 3.7 和 Python 3.6 基于 Amazon Linux AMI。

(先决条件)安装 pip3 和最新的 AWS CLI 版本

1.    如果您尚未安装,请从 pip 网站上安装 pip3 用于 Python 3 打包。

-或-

如果您有 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。请将 REGION_NAME 替换为您的 AWS 区域。此外,还包括您先前指定的兼容运行时。

手动创建使用最新 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 资源名称(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 Lambda 函数

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