在使用 Python (Boto 3) Lambda 函数时,为什么会收到“unknown service”、“parameter validation failed”或“object has no attribute”错误?
上次更新时间:2019 年 9 月 26 日
在运行使用 Python 编写的 AWS Lambda 函数时,我收到如下错误:“unknown service”、“parameter validation failed”或“object has no attribute”。如何处理这些错误?
简短描述
当您的 Lambda 函数配置为使用其中一个 适用于 Python 的 Lambda 运行时,并且它尝试调用较新的 AWS 服务或最新版本的 AWS API 时,会发生这些错误。Lambda 执行环境中提供的适用于 Python 的 AWS 开发工具包 (Boto 3) 版本不是最新版本。对于某些 AWS 服务和 API,它可能缺少一些参数。
创建使用最新版 Boto 3 的层,然后将层添加到您的函数的配置。
解决方法
注意:以下说明用作指南,并且假定您具有全新的工作目录。如果您使用现有工作目录,可能需要升级 botocore 才能升级 Boto 3。根据特定操作系统和 Python 配置的需要,调整您要采取的步骤。
安装 pip 和 AWS CLI
1.如果您尚未安装适用于 Python 3 打包的 pip3,请进行安装。如果您拥有的是之前版本的 pip,请进行升级。
2.使用 pip3 安装或升级 AWS 命令行界面 (AWS CLI)。最新版本的 AWS CLI 包括 Lambda Layers API 模型。
创建层并将其添加到您的 Lambda 函数
注意:这些命令仅适用于 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 资源名称 (ARN),如下所示:
arn:aws:lambda:region:$ACC_ID:layer:boto3-mylayer:1
5.通过运行以下命令将层添加到 Lambda 函数的配置中:
注意:请将 myfunction 替换为您的函数名称。将 arn:aws:lambda:region:ACC_ID:layer:boto3-mylayer:1 替换为您的层的 ARN。
aws lambda update-function-configuration --function-name myfunction --layers arn:aws:lambda:region:ACC_ID:layer:boto3-mylayer:1
现在,所有 AWS 服务和参数/关键字参数均可用于您的 Lambda 函数。
提示:在函数代码中使用 print(boto3.__version__) 和 print(botocore.__version__) 来确认 Boto 3 和 Botocore 的版本。