AWS Lambda
开发人员指南

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

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

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

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

架构和事件结构

本示例应用程序使用以下 AWS 服务。

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

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

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

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

  • AWS CloudFormation – 创建应用程序资源并部署函数代码。

本应用程序中的 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 存储桶中。为了最终确定日志流和跟踪时间,函数在访问数据前将等待一小段时间。

使用 AWS X-Ray 进行检测

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

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

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

AWS CloudFormation 模板和其他资源

本应用程序在两个 Node.js 模块(一个 AWS CloudFormation 模板和提供支持的 shell 脚本)中实现。模板创建处理器函数、随机错误函数和以下支持资源。

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

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

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

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

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

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

在 GitHub 上查看模板 error-processor.yaml

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

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