使用 Lambda 处理唯一性 SnapStart - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用 Lambda 处理唯一性 SnapStart

在 SnapStart 函数上扩展调用时,Lambda 使用单个初始化的快照来恢复多个执行环境。如果您的初始化代码生成了唯一内容,而此内容包含在快照中,则跨执行环境重复使用该内容时,该内容可能不唯一。要在使用时保持唯一性 SnapStart,必须在初始化后生成唯一的内容。这包括唯一的 ID、唯一的密钥和用于生成伪随机性的熵。

我们推荐使用以下最佳实践来帮助您保持代码的唯一性。Lambda 还提供开源SnapStart 扫描工具,以帮助检查假设唯一性的代码。如果您在初始化阶段生成唯一的数据,则可以使用运行时挂钩来还原唯一性。使用运行时挂钩,您可以在 Lambda 拍摄快照之前立即运行特定代码,也可以在 Lambda 从快照恢复函数后立即运行特定代码。

避免在初始化期间保存依赖唯一性的状态

在函数的初始化阶段,避免缓存旨在保持唯一性的数据,例如生成用于日志记录的唯一 ID。相反,我们建议您在函数处理程序中生成唯一的数据或使用运行时挂钩

例 – 在函数处理程序中生成唯一的 ID

以下示例演示如何在函数处理程序中生成 UUID。

import java.util.UUID; public class Handler implements RequestHandler<String, String> { private static UUID uniqueSandboxId = null; @Override public String handleRequest(String event, Context context) { if (uniqueSandboxId == null) uniqueSandboxId = UUID.randomUUID(); System.out.println("Unique Sandbox Id: " + uniqueSandboxId); return "Hello, World!"; } }

使用加密安全的伪随机数生成器(CSPRNG)

如果您的应用程序依赖随机性,我们建议您使用加密安全的随机数生成器(CSPRNG)。适用于 Java 的 Lambda 托管运行时包括两个内置的 csprNG(openSSL 1.0.2 java.security.SecureRandom 和),它们可以自动保持随机性。 SnapStart始终从中获取随机数/dev/random/dev/urandom同时保持随机性的软件。 SnapStart

例 — java.security。 SecureRandom

以下示例使用 java.security.SecureRandom,即使函数从快照中恢复,它也会生成唯一的数字序列。

import java.security.SecureRandom; public class Handler implements RequestHandler<String, String> { private static SecureRandom rng = new SecureRandom(); @Override public String handleRequest(String event, Context context) { for (int i = 0; i < 10; i++) { System.out.println(rng.next()); } return "Hello, World!"; } }

SnapStart 扫描工具

Lambda 提供扫描工具,以帮助您检查假设唯一性的代码。 SnapStart 扫描工具是一个开源SpotBugs插件,可根据一组规则运行静态分析。该扫描工具有助于识别可能打破有关唯一性假设的潜在代码实施。有关安装说明和扫描工具执行的检查列表,请参阅上 GitHub的 aws-lambda-snapstart-java- rules 存储库。

要详细了解如何使用处理唯一性 SnapStart,请参阅 Amazon Compute 博客Amazon Lambda SnapStart上的 “更快地启动”。