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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

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

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

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

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

架构和事件结构

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

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

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

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

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

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

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

例 CloudWatch 记录消息事件
{ "awslogs": { "data": "H4sIAAAAAAAAAHWQT0/DMAzFv0vEkbLYcdJkt4qVXmCDteIAm1DbZKjS+kdpB0Jo350MhsQFyVLsZ+unl/fJWjeO5asrPgbH5..." } }

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

例 已解码 CloudWatch 日志事件数据
{ "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" } ] }

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

使用 Amazon X-Ray 进行检测

应用程序使用 Amazon X-Ray 来跟踪函数调用以及函数对Amazon服务的调用。X-Ray 使用从函数处接收的跟踪数据创建服务地图,帮助您确定错误。

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

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

Amazon CloudFormation 模板和其他资源

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

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

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

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

  • CloudWatch 日志订阅 — 日志流的订阅,在记录 ERROR 一词时触发处理器功能。

  • 基于资源的策略 — 允许 CloudWatch 日志调用处理器函数的权限声明。

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

在上查看应用程序模板 GitHub。

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

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