我的 Python (Boto3) AWS Lambda 函数返回 "unknown service"、"parameter validation failed" 或 "object has no attribute" 错误。
简短描述
当函数调用需要最新的 Boto3 版本的 AWS 服务或 AWS API 时,将会发生这些错误。
要解决此问题,请创建一个使用最新的 Boto3 版本的 Lambda 层。然后,将新层添加到您的 Lambda 函数的配置中。您可以手动创建 Lambda 层,也可以使用 Docker 创建。最佳做法是通过 Docker 创建或更新 Lambda 层,以确保二进制文件正确无误。
重要事项: 如果您没有最新的 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 网站上的 Installation(安装)。
- 使用 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:[IP_ADDRESS]" /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:[IP_ADDRESS] 替换为您的 Python 版本的基础映像。将 boto3-mylayer 替换为您的程序包的自定义名称。命令成功完成后,您会在当前目录中看到一个包含您的程序包名称的文件,比如 boto3-mylayer.zip。
-
要创建或更新您的 Lambda 层,请运行以下 publish-layer-version 命令:
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 .
-
要发布该层,请运行以下 publish-layer-version 命令:
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 函数的配置中,请运行以下 update-function-configuration 命令:
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__)。在使用这些命令之前,请先导入 boto3 和 botocore 库。
相关信息
使用 Python 构建 Lambda 函数
将 .zip 文件归档用于 Python Lambda 函数