Ruby 中的 Amazon Lambda 函数错误 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

Ruby 中的 Amazon Lambda 函数错误

当您的代码引发错误时,Lambda 将生成错误的 JSON 表示形式。此错误文档会出现在调用日志中,对于同步调用,它出现在输出中。

本页面介绍了如何使用 Lambda 控制台和 Amazon CLI 查看 Ruby 运行时的 Lambda 函数调用错误 。

语法

例 function.rb

def handler(event:, context:) puts "Processing event..." [1, 2, 3].first("two") "Success" end

此代码将导致类型错误。Lambda 将捕获此错误并生成一个包含错误消息、类型和堆栈跟踪字段的 JSON 文档。

{ "errorMessage": "no implicit conversion of String into Integer", "errorType": "Function<TypeError>", "stackTrace": [ "/var/task/function.rb:3:in `first'", "/var/task/function.rb:3:in `handler'" ] }

工作原理

调用 Lambda 函数时,Lambda 将接收调用请求并验证执行角色中的权限、验证事件文档是否是有效的 JSON 文档,并检查参数值。

如果请求通过验证,Lambda 会将请求发送到函数实例。Lambda 运行时环境会将事件文档转换为一个对象,并将该对象传递给函数处理程序。

如果 Lambda 遇到错误,则会返回指示错误原因的异常类型、消息和 HTTP 状态代码。调用 Lambda 函数的客户端或服务可以通过编程方式处理错误或将其一直传递到最终用户。正确的错误处理行为取决于应用程序的类型、受众以及错误来源。

以下列表描述了您可以从 Lambda 中接收的状态码范围。

2xx

响应中包含 X-Amz-Function-Error 标题的2xx 系列错误指示 Lambda 运行时或函数错误。2xx 系列状态代码表示 Lambda 已接受请求,Lambda 通过在响应中包 X-Amz-Function-Error 含标题,而不是错误代码来指示错误。

4xx

4xx 系列错误指示调用客户端或服务可以通过修改请求、请求权限或重试请求来修复的错误。4xx 系列错误(而不是 429)通常指示请求存在错误。

5xx

5xx 系列错误指示 Lambda 问题,或者函数的配置或资源存在问题。5xx 系列错误可以指示无需用户采取任何操作即可解决的临时情况。调用客户端或服务无法解决这些问题,但 Lambda 函数的拥有者可能能够修复该问题。

有关调用错误的完整列表,请参阅调用 API 错误

使用 Lambda 控制台

您可以通过配置测试事件并查看输出,在 Lambda 控制台上调用函数。输出也会捕获到函数的执行日志中,当启用 active tracing (活动跟踪) 时,会捕获到 Amazon X-Ray 中。

在 Lambda 控制台中调用函数

  1. 打开 Lambda 控制台的“函数”页面

  2. 选择函数。

  3. 选择 Test (测试)

  4. 选择 New event (新事件),然后从下拉列表中选择 Event template (活动模板)

  5. 输入测试事件的名称。

  6. 输入测试事件的 JSON。

  7. 选择 Create event (创建事件)

  8. 选择调用

Lambda 控制台同步调用您的函数并显示结果。要查看响应、日志和其他信息,请展开 Details (详细信息) 部分。

使用 Amazon Command Line Interface (Amazon CLI)

Amazon CLI 是一种开源工具,让您能够在命令行 Shell 中使用命令与 Amazon 服务进行交互。要完成本节中的步骤,您必须满足以下条件:

在 Amazon CLI 中调用 Lambda 函数时,Amazon CLI 会将响应分为两个文档。Amazon CLI 响应将显示在命令提示符中。如果发生错误,响应将包含一个 FunctionError 字段。函数返回的调用响应或错误将写入到输出文件。例如,output.jsonoutput.txt

以下调用 命令示例演示了如何调用函数并将调用响应写入 output.txt 文件。

mac OS/Linux OS
aws lambda invoke --function-name my-function --payload '{"key1": "value1", "key2": "value2", "key3": "value3"}' output.txt
Windows OS
aws lambda invoke --function-name my-function --cli-binary-format raw-in-base64-out --payload '{"key1": "value1", "key2": "value2", "key3": "value3"}' output.txt

命令提示符中应该会显示 Amazon CLI 响应:

{ "StatusCode": 200, "FunctionError": "Unhandled", "ExecutedVersion": "$LATEST" }

output.txt 文件中应该会显示函数调用响应:在同一命令提示符下,您还可以使用以下命令在命令提示符中查看输出:

cat output.txt

命令提示符中应该会显示调用响应。

{"errorMessage":"no implicit conversion of String into Integer","errorType":"Function<TypeError>","stackTrace":["/var/task/function.rb:3:in `first'","/var/task/function.rb:3:in `handler'"]}

其他 Amazon 服务中的错误处理

当其他 Amazon 服务调用您的函数时,服务会选择调用类型和重试行为。Amazon 服务可以按计划调用您的函数,以响应资源上的生命周期事件或者针对来自用户的请求提供响应。某些服务异步调用函数并让 Lambda 处理错误,而其他服务则重试或将错误传回给用户。

例如,API Gateway 将所有调用和函数错误视为内部错误。如果 Lambda API 拒绝调用请求,则 API Gateway 会返回 500 错误代码。如果函数运行但返回错误,或返回格式错误的响应,则 API Gateway 返回 502 错误代码。要自定义错误响应,您必须捕获代码中的错误并以所需格式设置响应的格式。

我们建议使用 Amazon X-Ray 来确定错误的来源及原因。您可以通过 X-Ray 找出哪个组件遇到了错误,并查看有关错误的详细信息。以下示例显示导致来自 API Gateway 的 502 响应的函数错误。


          使用 API Gateway 跟踪函数错误的映射。

有关更多信息,请参阅 在 Amazon Lambda 中检测 Ruby 代码

示例应用程序

以下示例代码适用于 Ruby 运行时。

Ruby 中的示例 Lambda 应用程序

  • blank-ruby – 一个 Ruby 函数,显示日志记录、环境变量、Amazon X-Ray 跟踪、层、单元测试和 Amazon 开发工具包的使用情况。

  • 适用于 Amazon Lambda 的 Ruby 代码示例 – 在 Ruby 中编写的代码示例,演示了如何与 Amazon Lambda 互动。

接下来做什么?