AWS Lambda
quarkus-amazon-lambda
扩展允许您使用 Quarkus 构建 AWS Lambda。您的 Lambda 可以根据需要使用 CDI 或 Spring 的注入注解以及其他 Quarkus 功能。
Quarkus Lambda 可以使用 Amazon Java Runtime 进行部署,或者您可以构建一个原生可执行文件并使用 Amazon 的 Custom Runtime,以获得更小的内存占用和更快的冷启动启动时间。
Quarkus 与 Lambda 的集成也支持 Quarkus 的 Live Coding 开发周期。您可以在开发或测试模式下启动您的 Quarkus Lambda 项目,并实时编写代码。
先决条件
要完成本指南,您需要
-
大约 30 分钟
-
一个 IDE
-
已安装 JDK 17+ 并正确配置了
JAVA_HOME
-
Apache Maven 3.9.9
-
如果您想使用它,可以选择 Quarkus CLI
-
如果您想构建本机可执行文件(或者如果您使用本机容器构建,则为 Docker),可以选择安装 Mandrel 或 GraalVM 并进行适当的配置
-
AWS SAM CLI,用于本地测试
对于 Gradle 项目,请 参阅下方,或获取更多参考,请参阅 Gradle 设置页面 中的指南。 |
创建 Maven 部署项目
使用我们的 Maven Archetype 创建 Quarkus AWS Lambda Maven 项目。
mvn archetype:generate \
-DarchetypeGroupId=io.quarkus \
-DarchetypeArtifactId=quarkus-amazon-lambda-archetype \
-DarchetypeVersion=3.24.4
如果您更喜欢使用 Gradle,您可以通过 code.quarkus.io 快速轻松地生成一个 Gradle 项目,并添加 将 build.gradle、gradle.properties 和 settings.gradle 复制到上方生成的 Maven Archetype 项目中,以遵循本指南。 执行:gradle wrapper 以设置 Gradle wrapper(推荐)。 有关完整的 Gradle 详细信息,请参阅下方 Gradle 构建 部分。 |
选择您的 Lambda
quarkus-amazon-lambda
扩展会扫描您的项目,查找直接实现 Amazon RequestHandler<?, ?>
或 RequestStreamHandler
接口的类。您的项目中必须找到实现此接口的类,否则将在构建时失败。如果找到多个处理程序类,也会抛出构建时异常。
但是,有时您可能需要处理一些共享代码的、相关的 Lambda,而创建多个 Maven 模块只是您不想要的开销。quarkus-amazon-lambda
扩展允许您在一个项目中打包多个 Lambda,并使用配置或环境变量来选择您要部署的处理程序。
生成的项目中包含三个 Lambda。其中两个实现了 RequestHandler<?, ?>
接口,一个实现了 RequestStreamHandler
接口。其中一个被使用,两个未使用。如果您打开 src/main/resources/application.properties
,您会看到这个
quarkus.lambda.handler=test
quarkus.lambda.handler
属性告诉 Quarkus 要部署哪个 Lambda 处理程序。这也可以通过环境变量覆盖。
如果您查看项目中的三个生成的处理程序类,您会发现它们被 @Named
了不同的名称。
@Named("test")
public class TestLambda implements RequestHandler<InputObject, OutputObject> {
}
@Named("unused")
public class UnusedLambda implements RequestHandler<InputObject, OutputObject> {
}
@Named("stream")
public class StreamLambda implements RequestStreamHandler {
}
处理程序类的 CDI 名称必须与 quarkus.lambda.handler
属性中指定的值匹配。
部署到 AWS Lambda Java Runtime
有几个步骤可以让您的 Lambda 在 AWS 上运行。生成的 Maven 项目包含一个有用的脚本,用于为纯 Java 和原生部署创建、更新、删除和调用您的 Lambda。
创建执行角色
查看 入门指南 以使用 AWS CLI 部署 Lambda。特别是,请确保您已创建了一个 Execution Role
。您需要在您的配置文件或控制台窗口中定义一个 LAMBDA_ROLE_ARN
环境变量。或者,您可以编辑构建生成的 manage.sh
脚本,并将角色值直接放在那里。
LAMBDA_ROLE_ARN="arn:aws:iam::1234567890:role/lambda-role"
额外的构建生成文件
运行构建后,quarkus-amazon-lambda
扩展会生成一些额外的文件。这些文件位于构建目录中:Maven 的 target/
,Gradle 的 build/
。
-
function.zip
- lambda 部署文件 -
manage.sh
- AWS Lambda CLI 命令的包装器 -
bootstrap-example.sh
- 原生部署的示例启动脚本 -
sam.jvm.yaml
- (可选) 与 SAM CLI 和本地测试一起使用 -
sam.native.yaml
- (可选) 与 SAM CLI 和原生本地测试一起使用
创建函数
target/manage.sh
脚本用于通过 AWS Lambda Java Runtime 管理您的 Lambda。此脚本仅为方便您使用而提供。如果您想了解创建、删除和更新 Lambda 所执行的 AWS 命令,请检查 manage.sh
脚本的输出。
manage.sh
支持四种操作:create
、delete
、update
和 invoke
。
为验证您的设置,即您已安装 AWS CLI,已执行 aws configure 以配置 AWS 访问密钥,并已设置 LAMBDA_ROLE_ARN 环境变量(如上所述),请在不带任何参数的情况下执行 manage.sh 。将打印出用法说明以指导您。 |
如果使用 Gradle,manage.sh 中的二进制文件路径必须从 target 更改为 build 。 |
要查看 usage
说明,并验证 AWS 配置
sh target/manage.sh
您可以使用以下命令 create
您的函数
sh target/manage.sh create
或者,如果您尚未在此 shell 中定义 LAMBDA_ROLE_ARN
LAMBDA_ROLE_ARN="arn:aws:iam::1234567890:role/lambda-role" sh target/manage.sh create
请勿更改 handler 开关。这必须硬编码为 io.quarkus.amazon.lambda.runtime.QuarkusStreamHandler::handleRequest 。此处理程序会引导 Quarkus 并包装您的实际处理程序,以便可以执行注入。 |
如果在创建函数时遇到任何问题,必须先使用 delete
函数将其删除,然后再重新运行 create
命令。
sh target/manage.sh delete
命令也可以堆叠使用
sh target/manage.sh delete create
调用 Lambda
使用 invoke
命令来调用您的函数。
sh target/manage.sh invoke
示例 Lambda 通过 --payload
开关接收输入,该开关指向项目根目录下的一个 json 文件。
也可以使用 SAM CLI 本地调用 Lambda,如下所示:
sam local invoke --template target/sam.jvm.yaml --event payload.json
如果您正在处理原生镜像构建,只需将模板名称替换为原生版本即可。
sam local invoke --template target/sam.native.yaml --event payload.json
部署到 AWS Lambda Custom (native) Runtime
如果您希望 Lambda 具有更低的内存占用和更快的初始化时间,可以将 Java 代码编译为原生可执行文件。只需确保使用 -Dnative
开关重新构建项目。
对于 Linux 主机,执行
quarkus build --native
./mvnw install -Dnative
./gradlew build -Dquarkus.native.enabled=true
如果您在非 Linux 系统上构建,您还需要传递一个指示 Quarkus 使用 Docker 构建的属性,因为 Amazon Lambda 需要 Linux 二进制文件。您可以通过将此属性传递给您的构建来实现:-Dquarkus.native.container-build=true 。但这要求您本地安装 Docker。 |
quarkus build --native --no-tests -Dquarkus.native.container-build=true
# The --no-tests flag is required only on Windows and macOS.
./mvnw install -Dnative -DskipTests -Dquarkus.native.container-build=true
./gradlew build -Dquarkus.native.enabled=true -Dquarkus.native.container-build=true
这些命令中的任何一个都将编译并创建一个原生可执行镜像。它还将生成一个 zip 文件 target/function.zip
。此 zip 文件包含您的原生可执行镜像,已重命名为 bootstrap
。这是 AWS Lambda Custom (Provided) Runtime 的要求。
此处的说明与上面完全相同,只有一个变化:您需要将 native
添加为 manage.sh
脚本的第一个参数。
sh target/manage.sh native create
如上所述,命令可以堆叠使用。唯一的要求是,如果您希望使用原生镜像构建,native
必须是第一个参数。脚本将处理管理原生镜像函数部署所需的其余细节。
如果您想了解创建、删除和更新 Lambda 所执行的 AWS 命令,请检查 manage.sh
脚本的输出。
关于原生创建命令的一点需要注意,aws lambda create-function
调用必须设置一个特定的环境变量。
--environment 'Variables={DISABLE_SIGNAL_HANDLERS=true}'
检查 POM 和 Gradle 构建
POM 没有什么特别之处,除了将 quarkus-amazon-lambda
扩展作为依赖项包含在内。该扩展会自动生成您 Lambda 部署可能需要的所有内容。
在以前版本的此扩展中,您必须设置您的 pom 或 gradle 来打包原生部署的可执行文件,但现在不再是这样了。 |
Gradle 构建
同样,对于 Gradle 项目,您只需要添加 quarkus-amazon-lambda
依赖项。该扩展会自动生成您 Lambda 部署可能需要的所有内容。
示例 Gradle 依赖项
dependencies {
implementation enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}")
implementation 'io.quarkus:quarkus-resteasy'
implementation 'io.quarkus:quarkus-amazon-lambda'
testImplementation 'io.quarkus:quarkus-junit5'
testImplementation 'io.rest-assured:rest-assured'
}
Live Coding 和单元/集成测试
为了在开发环境中尽可能地模拟 AWS Lambda 环境,Quarkus AWS Lambda 扩展会在 Quarkus Dev 和 Test 模式下启动一个模拟的 AWS Lambda 事件服务器。这个模拟事件服务器会模拟真正的 AWS Lambda 环境。
在 Quarkus Dev 模式下运行时,您可以通过向 https://:8080
发送 HTTP POST 请求来向其提供事件。模拟事件服务器将接收事件,您的 Lambda 将被调用。您可以对您的 Lambda 进行实时编码,更改将自动重新编译并在您下次调用时可用。例如:
quarkus dev
./mvnw quarkus:dev
./gradlew --console=plain quarkusDev
$ curl -d "{\"name\":\"John\"}" -X POST https://:8080
对于您的单元测试,您也可以使用任何您想要的 HTTP 客户端在模拟事件服务器上进行调用。以下是使用 rest-assured 的示例。Quarkus 在端口 8081 下启动了一个单独的 Mock Event 服务器。Quarkus 会自动将 Rest Assured 的默认端口设置为 8081,因此您可以调用此端点。
import org.junit.jupiter.api.Test;
import io.quarkus.test.junit.QuarkusTest;
import static io.restassured.RestAssured.given;
import static org.hamcrest.CoreMatchers.containsString;
@QuarkusTest
public class LambdaHandlerTest {
@Test
public void testSimpleLambdaSuccess() throws Exception {
Person in = new Person();
in.setName("Stu");
given()
.contentType("application/json")
.accept("application/json")
.body(in)
.when()
.post()
.then()
.statusCode(200)
.body(containsString("Hello Stu"));
}
}
模拟事件服务器也为 @QuarkusIntegrationTest
测试启动,因此也可以与原生二进制文件一起使用。所有这些都提供了与 SAM CLI 本地测试类似的功能,而无需 Docker 的开销。
最后,如果您的计算机上端口 8080 或 8081 不可用,您可以在 application.properties 中修改开发和测试模式的端口。
quarkus.lambda.mock-event-server.dev-port=8082
quarkus.lambda.mock-event-server.test-port=8083
端口值为零将导致随机分配端口。
关闭模拟事件服务器
quarkus.lambda.mock-event-server.enabled=false
使用 SAM CLI 进行测试
如果您不想使用模拟事件服务器,您可以使用 SAM CLI 测试您的 Lambda。
AWS SAM CLI 允许您在模拟 Lambda 环境中,在您的笔记本电脑上本地运行您的 Lambda。这需要安装 docker。如果选择使用,这是一个可选方法。否则,Quarkus JUnit 集成应足以满足您的大部分需求。
已为 JVM 和原生执行模式生成了入门模板。
运行以下 SAM CLI 命令以本地测试您的 Lambda 函数,并传入相应的 SAM template
。event
参数接受任何 JSON 文件,在本例中是示例 payload.json
。
如果使用 Gradle,YAML 模板中的二进制文件路径必须从 target 更改为 build 。 |
sam local invoke --template target/sam.jvm.yaml --event payload.json
也可以使用 sam.native.yaml
模板本地测试原生镜像。
sam local invoke --template target/sam.native.yaml --event payload.json
修改 function.zip
有时您可能需要在构建生成的 function.zip
Lambda 部署中添加一些内容。为此,请在 src/main
中创建一个 zip.jvm
或 zip.native
目录。如果您正在进行纯 Java Lambda,请创建 zip.jvm/
。如果您正在进行原生部署,请创建 zip.native/
。
您在 zip 目录下的任何文件和目录都将包含在 function.zip
中。
自定义 bootstrap
脚本
有时您可能希望在 Lambda 调用您的原生 Quarkus Lambda 部署时设置特定的系统属性或其他参数。如果您在 zip.native
中包含一个 bootstrap
脚本文件,Quarkus 扩展会自动将可执行文件在 function.zip
中重命名为 runner
,并将 bootstrap
脚本的 Unix 模式设置为可执行。
如果您包含自定义 bootstrap 脚本,则必须将原生可执行文件引用为 runner 。 |
该扩展会在 target/bootstrap-example.sh
中生成一个示例脚本。
使用 AWS XRay 和 GraalVM 进行跟踪
如果您正在构建原生镜像,并且希望在 Lambda 中使用 AWS X-Ray Tracing,您需要在您的 pom 中包含 quarkus-amazon-lambda-xray
作为依赖项。AWS X-Ray 库与 GraalVM 的兼容性不完全,因此我们进行了一些集成工作以使其正常工作。
此外,请记住在 manage.sh
的 cmd_create()
函数中启用 AWS X-Ray 跟踪参数。这也可以在 AWS 管理控制台中设置。
--tracing-config Mode=Active
对于 sam 模板文件,请在 YAML 函数属性中添加以下内容。
Tracing: Active
AWS X-Ray 会为您的发行版添加许多类,请确保您至少使用 256MB 的 AWS Lambda 内存大小。这在 manage.sh
cmd_create()
中已明确设置。虽然原生镜像可能始终可以使用较低的内存设置,但建议保持设置相同,尤其有助于比较性能。
使用 HTTPS 或 SSL/TLS
如果您的代码进行 HTTPS 调用(例如,调用微服务、AWS 服务),您需要为原生镜像添加配置,因为 GraalVM 仅在显式声明时才包含依赖项。Quarkus 默认会在隐式需要这些功能的扩展上启用此功能。有关更多信息,请参阅 Quarkus SSL 指南。
打开 src/main/resources/application.properties 并添加以下行以在您的原生镜像中启用 SSL。
quarkus.ssl.native=true
使用 AWS Java SDK v2
Quarkus 现在提供 DynamoDB、S3、SNS 和 SQS 的扩展(更多即将推出)。请参阅 这些指南,了解如何使用各种 AWS 服务与 Quarkus 集成,而不是像下面这样手动连接。 |
通过最少的集成,可以利用 AWS Java SDK v2,该 SDK 可用于调用 SQS、SNS、S3 和 DynamoDB 等服务。
对于原生镜像,当使用同步模式时,必须优先使用 URL Connection 客户端而不是 Apache HTTP 客户端,因为 GraalVM 编译时存在问题(目前)。
将 quarkus-jaxb
添加为 Maven pom.xml
或 Gradle build.gradle
文件中的依赖项。
您还必须强制您的 AWS 服务客户端(如 SQS、SNS、S3 等)使用 URL Connection 客户端,该客户端通过 HTTPS 连接到 AWS 服务,因此需要包含 SSL 启用属性,如上面 使用 HTTPS 或 SSL/TLS 部分所述。
// select the appropriate client, in this case SQS, and
// insert your region, instead of XXXX, which also improves startup time over the default client
client = SqsClient.builder().region(Region.XXXX).httpClient(software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient.builder().build()).build();
对于 Maven,请将以下内容添加到您的 pom.xml
。
<properties>
<aws.sdk2.version>2.10.69</aws.sdk2.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>bom</artifactId>
<version>${aws.sdk2.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>url-connection-client</artifactId>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>apache-client</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<!-- sqs/sns/s3 etc -->
<artifactId>sqs</artifactId>
<exclusions>
<!-- exclude the apache-client and netty client -->
<exclusion>
<groupId>software.amazon.awssdk</groupId>
<artifactId>apache-client</artifactId>
</exclusion>
<exclusion>
<groupId>software.amazon.awssdk</groupId>
<artifactId>netty-nio-client</artifactId>
</exclusion>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>commons-logging-jboss-logging</artifactId>
</dependency>
</dependencies>
如果您看到 java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty 或类似的 SSL 错误,由于 GraalVM 的当前状态,需要进行一些额外的操作来打包 function.zip ,如下所示。有关更多信息,请参阅 Quarkus Native SSL 指南。 |
客户端 SSL 的附加要求
原生可执行文件需要一些额外的步骤来启用 S3 和其他 AWS 库所需的客户端 SSL。
-
自定义
bootstrap
脚本 -
libsunec.so
必须添加到function.zip
-
cacerts
必须添加到function.zip
为此,首先在您的构建中创建一个目录 src/main/zip.native/
。然后在此目录中创建一个名为 bootstrap
的 shell 脚本文件,如下所示。在您的构建文件夹(target 或 build)中会自动创建一个示例,名为 bootstrap-example.sh
。
#!/usr/bin/env bash
./runner -Djava.library.path=./ -Djavax.net.ssl.trustStore=./cacerts
如果您的 cacerts
文件受密码保护,请另外设置 -Djavax.net.ssl.trustStorePassword=changeit
。
接下来,您必须将一些文件从您的 GraalVM 发行版复制到 src/main/zip.native/
。
GraalVM 版本的文件路径可能不同,具体取决于您使用的是 Java 8 还是 11 版本。请相应调整。 |
cp $GRAALVM_HOME/lib/libsunec.so $PROJECT_DIR/src/main/zip.native/
cp $GRAALVM_HOME/lib/security/cacerts $PROJECT_DIR/src/main/zip.native/
现在,当您运行原生构建时,所有这些文件都将包含在 function.zip
中。
如果您使用 Docker 镜像进行构建,那么您必须从该镜像中提取这些文件。 |
要提取所需的 SSL,您必须在后台启动一个 Docker 容器,并连接到该容器以复制工件。
首先,让我们启动 GraalVM 容器,并记下容器 ID 输出。
docker run -it -d --entrypoint bash quay.io/quarkus/ubi9-quarkus-mandrel-builder-image:jdk-21
# This will output a container id, like 6304eea6179522aff69acb38eca90bedfd4b970a5475aa37ccda3585bc2abdde
# Note this value as we will need it for the commands below
首先,libsunec.so
,用于 SSL 实现的 C 库
docker cp {container-id-from-above}:/opt/graalvm/lib/libsunec.so src/main/zip.native/
其次,cacerts
,证书存储。您可能需要定期获取更新的副本。
docker cp {container-id-from-above}:/opt/graalvm/lib/security/cacerts src/main/zip.native/
您的最终存档将如下所示:
jar tvf target/function.zip
bootstrap
runner
cacerts
libsunec.so
使用容器镜像部署到 AWS Lambda
AWS Lambda 支持通过引用 容器镜像 来创建 Lambda,而不是上传 ZIP 文件。这可能有一些好处,例如绕过上传的 ZIP 文件的大小限制。您可以为原生构建和常规 JVM 构建定义 Lambda 函数。
JVM 容器镜像
对于常规的 JVM 发行版,您需要基于官方 AWS Java 基础镜像。下面是一个 Dockerfile 示例,它将从您的 Quarkus Lambda 项目创建容器镜像。它假定已执行 mvn package
,并且二进制文件在 target/
目录中可用。
FROM public.ecr.aws/lambda/java:11
ADD target/my-service-0.0.1-SNAPSHOT-runner.jar /var/task/lib/my-service.jar
ADD target/lib/ /var/task/lib/
CMD ["io.quarkus.amazon.lambda.runtime.QuarkusStreamHandler::handleRequest"]
原生可执行容器镜像
要创建使用原生可执行文件的 Lambda 容器镜像,我们需要做一些不同的事情。在这种情况下,我们不需要使用 AWS 的 java:11
基础镜像,而是使用一个特殊的镜像,该镜像假定 Lambda 的运行时环境已提供。下面的示例创建了一个这样的容器。它假定已执行 Maven 构建(例如 mvn package -Dnative=true
),并将原生二进制文件生成到 target/
目录中。该二进制文件需要命名为 bootstrap
并放置在 /var/runtime/
中。
FROM public.ecr.aws/lambda/provided
ADD target/my-service-0.0.1-SNAPSHOT-runner /var/runtime/bootstrap
RUN chmod ugo+x /var/runtime/bootstrap
CMD ["io.quarkus.amazon.lambda.runtime.QuarkusStreamHandler::handleRequest"]
部署容器镜像 Lambda
下面,您可以看到上述创建的容器镜像如何使用 docker
和 aws
命令行工具构建并部署到 AWS。这些说明适用于原生和 jvm 容器镜像,并假定 aws
命令行工具已登录。
构建 Docker 镜像
# Assuming we are located in the root directory of the project and created a Dockerfile there
docker build .
[output omitted]
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:[SOME SHA] 0.0s
使用您的 ECR 注册表信息标记镜像
docker tag [SOME SHA] [YOUR AWS ACCOUNT ID].dkr.ecr.[YOUR AWS ACCOUNT REGION].amazonaws.com/my/test/quarkus-lambda:v1
将 Docker 登录到您的 ECR 注册表并将其推送到那里
aws ecr get-login-password --region region | docker login --username AWS --password-stdin [YOUR AWS ACCOUNT ID].dkr.ecr.[YOUR AWS ACCOUNT REGION].amazonaws.com
docker push [YOUR AWS ACCOUNT ID].dkr.ecr.[YOUR AWS ACCOUNT REGION].amazonaws.com/my/test/quarkus-lambda:v1
使用 AWS CLI 工具创建 AWS Lambda 函数
确保您引用之前上传的镜像(假定存在一个可用于运行 Lambda 的角色)。请注意,对于 JVM Lambda 函数,默认内存限制 128Mb
可能不足以运行函数。在这种情况下,您可以在创建函数时通过向 aws lambda create-function
命令提供 --memory-size 256
参数来增加内存限制。您也可以在创建函数后在 AWS 控制台中调整该函数。
aws lambda create-function --function-name my-test-quarkus-lambda-function --package-type Image --code ImageUri=[YOUR AWS ACCOUNT ID].dkr.ecr.[YOUR AWS ACCOUNT REGION].amazonaws.com/my/test/quarkus-lambda:v1 --role arn:aws:iam::[YOUR AWS ACCOUNT ID]:role/[SOME ROLE]
现在您可以使用 AWS 控制台查看和测试您的新 Lambda 函数。
Amazon Alexa 集成
要将 Alexa 与 Quarkus native 结合使用,您需要使用 托管在 Quarkiverse Hub 上的 Quarkus Amazon Alexa 扩展。
<dependency>
<groupId>io.quarkiverse.alexa</groupId>
<artifactId>quarkus-amazon-alexa</artifactId>
<version>${quarkus-amazon-alexa.version}</version> (1)
</dependency>
1 | 在您的 POM 文件中定义扩展的最新版本。 |
像往常一样,通过继承抽象的 com.amazon.ask.SkillStreamHandler
来创建您的 Alexa 处理程序,并添加您的请求处理程序实现。
就这么简单!
SnapStart
要优化您的应用程序以支持 Lambda SnapStart,请查看 SnapStart 配置文档。