本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Python 中的 AWS Lambda 函数错误
您的代码引发错误时,Lambda 将会生成错误的 JSON 表示形式。对于同步调用,此错误文档会出现在调用日志和输出中。
本页介绍如何使用 Lambda 控制台和 AWS CLI 查看 Python 运行时的 Lambda 函数调用错误。
调用 Lambda 函数时,Lambda 将接收调用请求并验证执行角色中的权限、验证事件文档是否是有效的 JSON 文档,并检查参数值。
如果请求通过验证,Lambda 会将请求发送到函数实例。 Lambda 运行时 环境会将事件文档转换为一个对象,并将该对象传递给函数处理程序。
如果 Lambda 遇到错误,则会返回指示错误原因的异常类型、消息和 HTTP 状态代码。调用 Lambda 函数的客户端或服务可以通过编程方式处理错误或将其一直传递到终端用户。正确的错误处理行为取决于应用程序的类型、受众以及错误来源。
以下列表描述了您可以从 Lambda 中接收的状态码范围。
响应中包含
X-Amz-Function-Error
标题的
2xx
系列错误会指示 Lambda 运行时或函数错误。
2xx
系列状态代码表示 Lambda 已接受请求,但 Lambda 通过在响应中包含
X-Amz-Function-Error
标题,而不是通过错误代码来指示错误。
4xx
系列错误指示调用客户端或服务可以通过修改请求、请求权限或重试请求来修复的错误。
4xx
系列错误(而不是
429
)通常指示请求存在错误。
5xx
系列错误指示 Lambda 问题,或者函数的配置或资源存在问题。
5xx
系列错误可以指示无需用户采取任何操作即可解决的临时情况。调用客户端或服务无法解决这些问题,但 Lambda 函数的拥有者可能能够修复该问题。
有关调用错误的完整列表,请参阅 InvokeFunction 错误 。
使用 Lambda 控制台
您可以通过配置测试事件并查看输出,在 Lambda 控制台上调用函数。输出也会捕获到函数的执行日志中,当启用 active tracing (活动跟踪) 时,会捕获到 AWS X-Ray 中。
在 Lambda 控制台中调用函数
-
打开 Lamba 控制台的 Functions page
-
选择要测试的函数,然后选择 Test (测试)。
在 Test event (测试事件)中,选择 New event (新建事件)。
选择 Template (模板)。
对于 Name (名称),输入测试事件的名称。在文本输入框中,输入 JSON 测试事件。
选择 Save changes (保存更改)。
选择 测试 。
Lambda 控制台会 同步 调用您的函数并显示结果。要查看响应、日志和其他信息,请展开 Details (详细信息) 部分。
使用 AWS Command Line Interface (AWS CLI)
AWS CLI 是一种开源工具,让您能够在命令行 Shell 中使用命令与 AWS 服务进行交互。要完成本节中的步骤,您必须满足以下条件:
在 AWS CLI 中调用 Lambda 函数时,AWS CLI 会将响应分为两个文档。AWS CLI 响应将显示在命令提示符中。如果发生错误,响应将包含一个
FunctionError
字段。函数返回的调用响应或错误将写入到输出文件。例如,
output.json
或
output.txt
。
以下
调用
命令示例演示了如何调用函数并将调用响应写入
output.txt
文件。
aws lambda invoke \ --function-name my-function \ --cli-binary-format raw-in-base64-out \ --payload '{"key1": "value1", "key2": "value2", "key3": "value3"}' output.txt
如果使用
cli-binary-format
版本 2,则 AWS CLI 选项是必需的。要将其设为默认设置,请运行
aws configure set cli-binary-format raw-in-base64-out
。有关更多信息,请参阅
版本 2 的 AWS Command Line Interface 用户指南
中的
AWS CLI 支持的全局命令行选项
。
命令提示符中应该会显示 AWS CLI 响应:
"StatusCode": 200, "FunctionError": "Unhandled", "ExecutedVersion": "$LATEST"
output.txt
文件中应该会显示函数调用响应:在同一命令提示符下,您还可以使用以下命令在命令提示符中查看输出:
cat output.txt
命令提示符中应该会显示调用响应。
{"errorMessage": "'action'", "errorType": "KeyError", "stackTrace": [" File \"/var/task/lambda_function.py\", line 36, in lambda_handler\n result = ACTIONS[event['action']](event['number'])\n"]}
Lambda 还会在函数日志中记录错误对象,最多 256 KB。有关更多信息,请参阅 Python 中的 AWS Lambda 函数日志记录 。
其他 AWS 服务中的错误处理
当其他 AWS 服务调用您的函数时,服务会选择调用类型和重试行为。AWS 服务可以按计划调用您的函数,以响应资源上的生命周期事件或者针对来自用户的请求提供响应。某些服务异步调用函数并让 Lambda 处理错误,而其他服务则重试或将错误传回给用户。
例如,API Gateway 将所有调用和函数错误视为内部错误。如果 Lambda API 拒绝调用请求,则 API Gateway 会返回
500
错误代码。如果函数运行但返回错误,或返回格式错误的响应,则 API Gateway 返回 502 错误代码。要自定义错误响应,您必须捕获代码中的错误并以所需格式设置响应的格式。
建议使用 AWS X-Ray 来确定错误来源及其原因。您可使用 X-Ray 找出哪个组件遇到了错误,并查看有关错误的详细信息。以下示例显示导致 API Gateway 发出
502
响应的函数错误。
以下部分介绍了在使用 Python Lambda 运行时 创建、更新或调用函数时可能会遇到的常见错误。
例 运行时异常 — ImportError
{ "errorMessage": "Unable to import module 'lambda_function': Cannot import name '_imaging' from 'PIL' (/var/task/PIL/__init__.py)", "errorType": "Runtime.ImportModuleError"
发生此错误是因为使用 AWS Command Line Interface (AWS CLI) 上传包含 C 或 C++ 库的部署程序包造成的。例如,Pillow (PIL)
、numpy 或 pandas 库。 我们建议将 AWS SAM CLI sam build 命令与
--use-container
选项结合使用,来创建部署程序包。使用带有此选项的 AWS SAM CLI 创建具有类似 Lambda 环境(可与 Lambda 兼容)的 Docker 容器。例 JSON 序列化错误-运行时。 MarshalError
{ "errorMessage": "Unable to marshal response: Object of type AttributeError is not JSON serializable", "errorType": "Runtime.MarshalError"
发生此错误可能是因为在函数代码中使用了 base64 编码机制。例如:
import base64 encrypted_data = base64.b64encode(payload_enc).decode("utf-8")
此错误也可能是由于在创建或更新函数时没有将 .zip 文件指定为二进制文件造成的。我们建议使用 fileb:// 命令选项上传部署程序包(.zip 文件)。
aws lambda create-function --function-name my-function --zip-file fileb://my-deployment-package.zip --handler lambda_function.lambda_handler --runtime python3.8 --role arn:aws:iam::your-account-id:role/lambda-ex
示例应用程序
本指南的 GitHub 存储库包括演示错误用法的示例应用程序。每个示例应用程序都包含用于轻松部署和清理的脚本、一个 AWS Serverless Application Model (AWS SAM) 模板和支持资源。
Python 中的 Lambda 应用程序示例
blank-python
– 一个 Python 函数,用于显示日志记录、环境变量、AWS X-Ray 跟踪、层、单元测试和AWS开发工具包的使用情况。