Amazon Lambda 错误处理器示例应用程序 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

Amazon Lambda 错误处理器示例应用程序

本错误处理器示例应用程序演示如何使用 Amazon Lambda 处理来自 Amazon CloudWatch Logs 订阅的事件。CloudWatch Logs 允许您在日志条目与模式匹配时调用 Lambda 函数。该应用程序中的订阅监控函数的日志组来查找包含单词 ERROR 的条目。它调用处理器 Lambda 函数作为响应。处理器函数检索导致错误的请求的完整日志流和跟踪数据,并将其存储下来以备后用。

函数代码包含在以下文件中:

使用 Amazon CLI 和 Amazon CloudFormation 可在数分钟内部署本示例。要在您的账户中下载、配置和部署本示例,请按照 README 中的说明操作。

架构和事件结构

本示例应用程序使用以下 Amazon 服务:

  • Amazon Lambda – 运行函数代码,将日志发送到 CloudWatch Logs,并将跟踪数据发送到 X-Ray。

  • Amazon CloudWatch Logs – 收集日志,并在日志条目与筛选器模式匹配时调用函数。

  • Amazon X-Ray – 收集跟踪数据,对跟踪建立索引以方便搜索,并生成服务地图。

  • Amazon Simple Storage Service (Amazon S3) – 存储部署构件和应用程序输出。

标准费用适用于每项服务。

本应用程序中的 Lambda 函数将随机生成错误。当 CloudWatch Logs 在函数的日志中检测到单词 ERROR 时,即向处理器函数发送一个事件以进行处理。

例 CloudWatch Logs 消息事件

{ "awslogs": { "data": "H4sIAAAAAAAAAHWQT0/DMAzFv0vEkbLYcdJkt4qVXmCDteIAm1DbZKjS+kdpB0Jo350MhsQFyVLsZ+unl/fJWjeO5asrPgbH5..." } }

解码后,数据包含有关日志事件的详细信息。该函数使用这些详细信息来标识日志流,并解析日志消息以获取导致错误的请求的 ID。

例 解码的 CloudWatch Logs 事件数据

{ "messageType": "DATA_MESSAGE", "owner": "123456789012", "logGroup": "/aws/lambda/lambda-error-processor-randomerror-1GD4SSDNACNP4", "logStream": "2019/04/04/[$LATEST]63311769a9d742f19cedf8d2e38995b9", "subscriptionFilters": [ "lambda-error-processor-subscription-15OPDVQ59CG07" ], "logEvents": [ { "id": "34664632210239891980253245280462376874059932423703429141", "timestamp": 1554415868243, "message": "2019-04-04T22:11:08.243Z\t1d2c1444-efd1-43ec-b16e-8fb2d37508b8\tERROR\n" } ] }

处理器函数使用来自 CloudWatch Logs 事件的信息下载导致错误的请求的完整日志流和 X-Ray 跟踪。它将这些信息存储在 Amazon S3 存储桶中。为了最终确定日志流和跟踪时间,函数在访问数据前将等待一小段时间。

使用 Amazon X-Ray 进行检测

该应用程序使用 Amazon X-Ray 跟踪函数调用以及函数对 Amazon 服务的调用。X-Ray 使用从函数接收的跟踪数据创建服务地图,以帮助您确定错误。以下服务地图显示为部分请求生成错误的随机错误函数。它还显示调用 X-Ray、CloudWatch Logs 和 Amazon S3 的处理器函数。

两个 Node.js 函数在模板中配置为进行活动跟踪,并在代码中使用 Amazon X-Ray SDK for Node.js 对它们进行检测。通过活动跟踪,Lambda 标签会向传入请求添加跟踪标头,并将带有计时详细信息的跟踪发送到 X-Ray。此外,随机错误函数使用 X-Ray 开发工具包在注释中记录请求 ID 和用户信息。注释附加到跟踪,您可用它们来查找特定请求的跟踪。

处理器函数从 CloudWatch Logs 事件获取请求 ID,并使用Amazon SDK for JavaScript在 X-Ray 中搜索该请求。它使用 Amazon 开发工具包客户端(使用 X-Ray 开发工具包进行检测)下载跟踪和日志流。然后将它们存储在输出存储桶中。X-Ray 开发工具包记录这些调用,它们在跟踪中显示为子分段。

Amazon CloudFormation 模板和其他资源

该应用程序在两个 Node.js 模块中实现,并使用一个 Amazon CloudFormation 模板和提供支持的 shell 脚本进行部署。模板创建处理器函数、随机错误函数和以下支持资源。

  • 执行角色 – 一个 IAM 角色,授予函数访问其他 Amazon 服务的权限。

  • 初级函数 – 一个附加函数,它调用随机错误函数来创建日志组。

  • 自定义资源 – 一个 Amazon CloudFormation 自定义资源,在部署期间调用初级函数来确保日志组存在。

  • CloudWatch Logs 订阅 – 一个日志流订阅,在记录单词 ERROR 时触发处理器函数。

  • 基于资源的策略 – 关于处理器函数的权限声明,以允许 CloudWatch Logs 调用该函数。

  • Amazon S3 存储桶 – 处理器函数输出的存储位置。

在 GitHub 上查看应用程序模板

为了解决 Lambda 与 Amazon CloudFormation 集成的限制,模板创建了一个在部署期间运行的额外函数。所有 Lambda 函数都附带一个 CloudWatch Logs 日志组,用于存储函数执行的输出。但是,在第一次调用函数之前,不会创建日志组。

为了创建订阅(它取决于日志组是否存在),应用程序使用第三个 Lambda 函数来调用随机错误函数。模板包含内联初级函数的代码。Amazon CloudFormation 自定义资源在部署期间调用它。DependsOn 属性确保在订阅之前创建日志流和基于资源的策略。