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