AWS Lambda 错误处理器示例应用程序 - 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) – 存储部署构件和应用程序输出。

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

本应用程序中的 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 使用从函数处接收的跟踪数据创建服务地图,帮助您确定错误。

两个 Node.js 函数在模板中配置为进行活动跟踪,并在代码中使用 AWS X-Ray SDK for Node.js 对它们进行检测。通过活动跟踪,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 上查看应用程序模板

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

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