AWS Lambda
开发人员指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

函数错误 (Node.js)

如果您的 Lambda 函数通知 AWS Lambda 它未能正确执行,Lambda 会尝试将错误对象转换为字符串。考虑以下示例:

Copy
console.log('Loading function'); exports.handler = function(event, context, callback) { // This example code only throws error. var error = new Error("something is wrong"); callback(error); };

当您调用此 Lambda 函数时,它将向 AWS Lambda 通知函数执行已完成但返回错误,并将错误信息传递到 AWS Lambda。AWS Lambda 会将错误信息返回给客户端:

Copy
{ "errorMessage": "something is wrong", "errorType": "Error", "stackTrace": [ "exports.handler (/var/task/index.js:10:17)" ] }

请注意,堆栈跟踪将以堆栈跟踪元素的 stackTrace JSON 数组形式返回。

取回错误信息的方式取决于在函数调用时客户端指定的调用类型:

  • 如果某个客户端指定 RequestResponse 调用类型(即同步执行),该函数会将结果返回到执行调用的客户端。

    例如,控制台始终使用 RequestResponse 调用类型,因此控制台将在 Execution result 部分中显示错误,如下所示:

    相同信息也将发送到 CloudWatch,并且 Log output 部分将显示相同的日志。

  • 如果某个客户端指定了 Event 调用类型(即异步执行),AWS Lambda 不会返回任何信息。相反,它将错误信息记录到 CloudWatch 日志。您还可在 CloudWatch 指标中查看错误指标。

AWS Lambda 可能会重试失败的 Lambda 函数,具体视事件源而定。例如,如果 Kinesis 为事件源,则 AWS Lambda 会重试失败的调用,直到 Lambda 函数成功或流中的记录过期。有关重试的更多信息,请参阅出错时重试

测试上述 Node.js 代码(控制台)

  1. 在控制台中,使用 hello-world 蓝图创建 Lambda 函数。在 runtime 中,选择 Node.js;在 Role 中,选择 Basic execution role。有关如何执行此操作的说明,请参阅 步骤 2.1:创建 Hello World Lambda 函数

  2. 将模板代码替换为此部分中提供的代码。

  3. 使用 Lambda 控制台中提供的名为 Hello WorldSample event template 测试 Lambda 函数。有关如何执行此操作的说明,请参阅 步骤 2.2:手动调用 Lambda 函数并验证结果、日志和指标

函数错误处理

您可以创建自定义错误处理机制,直接从您的 Lambda 函数引发异常,并直接在 AWS Step Functions 状态机中进行处理 (重试或捕获)。有关更多信息,请参阅使用状态机处理错误情况

请将 CreateAccount 状态看作使用 Lambda 函数将客户的详细信息写入数据库的任务

  • 如果任务成功,会创建账户并发送欢迎电子邮件。

  • 如果用户尝试创建的账户用户名已存在,Lambda 函数将出错,状态机会建议其他用户名,并重试账户创建过程。

以下代码示例演示了如何执行此操作。请注意,Node.js 中的自定义错误必须扩展错误原型。

Copy
exports.handler = function(event, context, callback) { function AccountAlreadyExistsError(message) { this.name = "AccountAlreadyExistsError"; this.message = message; } AccountAlreadyExistsError.prototype = new Error(); const error = new AccountAlreadyExistsError("Account is in use!"); callback(error); };

您可以配置 Step Functions,使用 Catch 规则捕获错误:

Copy
{ "StartAt": "CreateAccount", "States": { "CreateAccount": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:CreateAccount", "Next": "SendWelcomeEmail", "Catch": [ { "ErrorEquals": ["AccountAlreadyExistsError"], "Next": "SuggestAccountName" } ] }, … } }

AWS Step Functions 可于运行时捕获错误,按照 Next 转换中指定的方式,转换SuggestAccountName 状态。

注意

Error 对象的名称属性必须匹配 ErrorEquals 值。

自定义错误处理机制使创建无服务器应用程序变得更加容易。此功能与 Lambda 编程模型 支持的所有语言相集成,您可以任选编辑语言设计您的应用程序,并进行混合搭配。

要进一步了解如何使用 AWS Step Functions 和 AWS Lambda 创建您自己的无服务器应用程序,请参阅 AWS Step Functions

本页内容: