如何解决 Python (Boto3) Lambda 函数中的“unknown service”(未知服务)、“parameter validation failed”(参数验证失败)或“object has no attribute”(对象没有属性)错误?

2 分钟阅读
0

我的 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

创建并应用您的层

完成以下步骤:

  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 替换为您的程序包的自定义名称。
    命令成功完成后,您会在当前目录中看到一个包含您的程序包名称的文件,比如 boto3-mylayer.zip

  3. 要创建或更新您的 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 层的首选名称。

完成以下步骤:

  1. 创建 lib 文件夹:

    LIB_DIR=boto3-mylayer/pythonmkdir
  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)
    输出示例:

    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 函数

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