AWS Lambda
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

AWS Lambda 诊断场景

此部分举例讲解如何使用 CloudWatch 的日志记录和监控功能监控和诊断 Lambda 函数。

诊断场景 1:Lambda 函数不按预期运行

在该场景中,您刚刚完成了 教程:将 AWS Lambda 与 Amazon S3 结合使用。但您创建的“在创建 S3 对象时向 Amazon S3 上传缩略图的 Lambda 函数”不按预期运行。在向 Amazon S3 上传对象时,您发现该函数并未上传缩略图像。您可以通过以下方式诊断该问题。

确定您的 Lambda 函数为何不按预期运行

  1. 检查代码并验证其是否正常运行。如果错误率增加,则表明该函数可能未正常工作。

    您可以像对待任何其他 Node.js 函数一样在本地测试代码,也可以使用控制台的测试调用功能或使用 AWS CLI Invoke 命令在 Lambda 控制台中测试代码。每次为响应事件而执行该代码时,它都会向与 Lambda 函数关联的日志组(即 /aws/lambda/<函数名>)中写入一个日志条目。

    以下是日志中可能会显示的错误的一些示例:

    • 如果在日志中看到堆栈跟踪信息,则可能是代码存在错误。请审查代码并调试堆栈跟踪所指的错误。

    • 如果在日志中看到 permissions denied 错误,则可能是所提供的用作执行角色的 IAM 角色没有必要权限。请检查 IAM 角色是并验证其否拥有访问您的代码引用的任何 AWS 资源的所有必要权限。为确保正确设置执行角色,请参阅AWS Lambda 执行角色

    • 如果您在日志中看到 timeout exceeded 错误,则表示您的函数已终止,因为它在配置的超时之前未返回。这可能是因为超时设置过低,或代码执行时间过长。

    • 如果在日志中看到 memory exceeded 错误,则表明内存设置过低。请将其设置为更高的值。有关内存大小限制的信息,请参阅 CreateFunction

  2. 检查 Lambda 函数并验证其是否收到请求。

    即使函数代码按预期运行,也能正确响应测试调用,但函数仍可能无法收到来自 Amazon S3 的请求。如果 Amazon S3 能够调用该函数,您应看到 CloudWatch 请求指标数值增加。如果 CloudWatch 请求数没有增加,请检查与该函数关联的访问权限策略。

诊断场景 2:Lambda 函数执行持续时间增加

在该场景中,您刚刚完成了 教程:将 AWS Lambda 与 Amazon S3 结合使用。但您创建的“在创建 S3 对象时向 Amazon S3 上传缩略图的 Lambda 函数”不按预期运行。向 Amazon S3 上传对象时,您看到正在上传缩略图像,但代码执行时间长于预期。您可以通过几种不同的方法来诊断该问题。例如,您可以监控 Lambda 函数的持续时间指标以确认执行时间是否增加。或者,您也可以检查 Lambda 函数的 CloudWatch 错误数指标是否增加(如果增加,则可能是超时错误导致的)。

确定 Lambda 函数执行的持续时间增加的原因

  1. 使用不同的内存设置测试代码。

    如果代码执行时间过长,可能是代码没有足够的计算资源来执行其逻辑。请尝试增加分配给函数的内存,并使用 Lambda 控制台的测试调用功能再次测试代码。在函数的日志条目中,您会看到占用内存、代码执行时间和所分配的内存。更改内存设置可能会改变对执行时间的收费方式。有关定价的信息,请参阅 AWS Lambda

  2. 使用日志来调查执行瓶颈的来源

    您可以像对待任何其他 Node.js 函数一样在本地测试代码,也可以使用 Lambda 控制台的测试调用功能或 AWS CLI 的 asyncInvoke 命令在 Lambda 中测试代码。每次为响应事件而执行该代码时,它都会向与 Lambda 函数关联的日志组(即名为 aws/lambda/<函数名> 的日志组)中写入一个日志条目。在代码的各个部分(如对其他服务的调用)添加日志记录语句,了解执行代码的不同部分需要花费多长时间。