排查 Lambda Java 函数的 SnapStart 错误 - AWS Lambda

排查 Lambda Java 函数的 SnapStart 错误

本页内容旨在解决使用 Lambda SnapStart 时出现的常见问题,包括快照创建错误、超时错误和内部服务错误。

SnapStartNotReadyException

错误:调用 Invoke20150331 操作时出现错误 (SnapStartNotReadyException):Lambda 正在初始化函数。只要函数状态变为 ACTIVE,即可加以调用。

常见原因

在尝试调用处于 Inactive 状态的函数版本时,即会发生此错误。如果 14 天未调用函数版本或者 Lambda 定期回收执行环境,函数版本将变为 Inactive

解决方案

函数版本达到 Active 状态之后再调用该函数。

SnapStartTimeoutException

问题:在尝试调用 SnapStart 函数版本时收到 SnapStartTimeoutException

常见原因

还原阶段,Lambda 会恢复 Java 运行时并运行任何 afterRestore() 运行时钩子。如果 afterRestore() 运行时钩子的运行时间超过 10 秒,则 Restore 阶段会超时,并且在尝试调用该函数时会出现错误。网络连接和凭证问题也可能导致 Restore 阶段超时。

解决方案

查看函数的 CloudWatch 日志,了解在还原阶段发生的超时错误。确保所有 afterRestore() 钩子在不到 10 秒的时间内完成。

例 CloudWatch 日志
{ "cause": "Lambda couldn't restore the snapshot within the timeout limit. (Service: Lambda, Status Code: 408, Request ID: 11a222c3-410f-427c-ab22-931d6bcbf4f2)", "error": "Lambda.SnapStartTimeoutException"}

500 内部服务错误

错误:Lambda 无法创建新快照,因为已达到并发快照创建上限。

常见原因

500 错误是 Lambda 服务自身的内部错误,而非函数或代码的问题。这些错误通常间歇性发生。

解决方案

尝试再次发布该函数版本。

401 未经授权

错误:会话令牌或标头密钥错误

常见原因

在 Lambda SnapStart 中使用 AWS Systems Manager Parameter Store 和 AWS Secrets Manager 扩展时会发生此错误。

解决方案

AWS Systems Manager Parameter Store 和 AWS Secrets Manager 与 SnapStart 不兼容。该扩展会在函数初始化期间生成用于与 AWS Secrets Manager 通信的凭证,但该凭证在与 SnapStart 一起使用时会导致凭证过期错误。

UnknownHostException

错误:无法执行 HTTP 请求:abc.us-east-1.amazonaws.com 的证书与任何主题备用名称都不匹配。

常见原因

Lambda 函数已经缓存了 DNS 响应。如果您将另一个 DNS 缓存与 SnapStart 结合使用,则函数从快照恢复时可能会出现连接超时。

解决方案

为了防止 Java 11 运行时出现 UnknownHostException 故障,建议将 networkaddress.cache.negative.ttl 设置为 0。在 Java 17 及更高版本的运行时中,不必执行此步骤。您可以使用 AWS_LAMBDA_JAVA_NETWORKADDRESS_CACHE_NEGATIVE_TTL=0 环境变量为 Lambda 函数设置此属性。

快照创建失败

错误:AWS Lambda 无法调用 SnapStart 函数。如果此错误仍然存在,请检查函数的 CloudWatch 日志,看是否存在初始化错误。

解决方案

查看函数的 Amazon CloudWatch 日志,了解 beforeCheckpoint() 运行时钩子是否超时。有时候,发布新的函数版本也可以解决该问题。

快照创建延迟

问题:在发布新的函数版本时,该函数会长时间保持 Pending 状态

常见原因

Lambda 创建快照时,初始化代码最多可以运行 15 分钟。时间限制为 130 秒或配置的函数超时(最大 900 秒),以较高者为准。

如果函数已附加到 VPC,Lambda 可能还需要在函数变为 Active 之前创建网络接口。如果在函数处于 Pending 状态时尝试调用函数版本,可能会出现 409 ResourceConflictException。如果使用 Amazon API Gateway 端点调用该函数,API Gateway 中可能会出现 500 错误。

解决方案

至少等待 15 分钟让函数版本初始化,然后再调用函数。