Funqy AWS Lambda 绑定
本指南通过快速入门代码向您展示如何将 Funqy 函数部署到 AWS Lambda。
可以使用 AWS Lambda Java 运行时部署 Funqy 函数,或者您可以构建原生可执行文件并使用 Lambda 自定义运行时,如果您想要更小的内存占用和更快的冷启动启动时间。
此技术被认为是预览版。 在预览中,不保证向后兼容性和在生态系统中的存在。具体的改进可能需要更改配置或 API,并且成为稳定的计划正在进行中。欢迎在我们的邮件列表或我们的GitHub 问题跟踪器中提供反馈。 有关可能的完整状态列表,请查看我们的常见问题解答条目。 |
先决条件
要完成本指南,您需要
-
大约 30 分钟
-
一个 IDE
-
已安装 JDK 17+ 并正确配置了
JAVA_HOME
-
Apache Maven 3.9.9
-
如果您想使用它,可以选择 Quarkus CLI
-
如果您想构建本机可执行文件(或者如果您使用本机容器构建,则为 Docker),可以选择安装 Mandrel 或 GraalVM 并进行适当的配置
-
阅读关于 Funqy 基础。 这是一篇简短的阅读!
-
AWS SAM CLI,用于本地测试
Funqy AWS Lambdas 基于我们的Quarkus AWS Lambda 支持构建。 |
快速入门
克隆 Git 存储库:git clone https://github.com/quarkusio/quarkus-quickstarts.git
,或下载存档。
解决方案位于 funqy-amazon-lambda-quickstart
目录中。
代码
代码没有什么特别之处,更重要的是没有任何 AWS 特定的东西。 Funqy 函数可以部署到许多环境,AWS Lambda 只是其中之一。 Java 代码实际上与funqy-http-quickstart中的代码完全相同。
选择您的函数
每个 AWS Lambda 部署只能导出一个 Funqy 函数。如果您的项目中定义了多个函数,则需要在 Quarkus application.properties
中选择该函数。
quarkus.funqy.export=greet
您可以在自己的application.properties中看到 quickstart 是如何完成的。
或者,您可以在使用 aws
cli 创建 AWS Lambda 时设置 QUARKUS_FUNQY_EXPORT
环境变量。
部署到 AWS Lambda Java 运行时
有几个步骤可以让您的 Funqy 函数在 AWS Lambda 上运行。 quickstart maven 项目生成一个有用的脚本来创建、更新、删除和调用纯 Java 和原生部署的函数。此脚本在构建时生成。
创建执行角色
查看入门指南,了解如何使用 AWS CLI 部署 lambda。具体来说,请确保您已创建 Execution Role
。您需要在您的配置文件或控制台窗口中定义 LAMBDA_ROLE_ARN
环境变量,或者,您可以编辑构建生成的 manage.sh
脚本并将角色值直接放在那里。
LAMBDA_ROLE_ARN="arn:aws:iam::1234567890:role/lambda-role"
额外的构建生成文件
运行构建后,quarkus-funqy-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 运行时管理您的 Funqy 函数。此脚本仅为方便您而提供。如果您想了解执行哪些 aws 命令来创建、删除和更新您的函数,请检查 manage.sh
脚本的输出。
manage.sh
支持四个操作:create
、delete
、update
和 invoke
。
要验证您的设置,您是否已安装 AWS CLI,为 AWS 访问密钥执行 aws configure,并设置 LAMBDA_ROLE_ARN 环境变量(如上所述),请执行不带任何参数的 manage.sh 。将打印一个使用说明来相应地指导您。 |
要查看 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.funqy.lambda.FunqyStreamHandler::handleRequest 。此特殊处理程序是 Funqy 与 AWS Lambda 的集成点。 |
如果创建函数时出现任何问题,您必须使用 delete
函数将其删除,然后再重新运行 create
命令。
sh target/manage.sh delete
命令也可以堆叠
sh target/manage.sh delete create
调用函数
使用 invoke
命令调用您的函数。
sh target/manage.sh invoke
示例函数接受通过 --payload
开关传入的输入,该开关指向项目根目录中的 json 文件。
也可以使用 SAM CLI 在本地调用该函数,如下所示
sam local invoke --template target/sam.jvm.yaml --event payload.json
如果您正在使用您的原生镜像构建,只需将模板名称替换为原生版本
sam local invoke --template target/sam.native.yaml --event payload.json
部署到 AWS Lambda 自定义(原生)运行时
如果您希望 Funqy 函数具有更低的内存占用和更快的初始化时间,可以将 Java 代码编译为原生可执行文件。只需确保使用 -Dnative
开关重新构建您的项目。
对于 Linux 主机,执行
quarkus build --native
./mvnw install -Dnative
如果您在非 Linux 系统上构建,您还需要传入一个属性,指示 Quarkus 使用 Docker 构建,因为 Amazon Lambda 需要 Linux 二进制文件。您可以通过将此属性传递给您的构建来完成此操作:-Dnative-image.docker-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
这些命令中的任何一个都将编译并创建一个原生可执行文件。它还会生成一个 zip 文件 target/function.zip
。此 zip 文件包含您的原生可执行镜像,已重命名为 bootstrap
。这是 AWS Lambda 自定义(提供的)运行时的要求。
此处的说明与上述完全相同,但有一个更改:您需要在 manage.sh
脚本中添加 native
作为第一个参数
sh target/manage.sh native create
如上所述,命令可以堆叠。唯一的要求是,如果您希望使用原生镜像构建,则 native
必须是第一个参数。该脚本将处理管理原生镜像函数部署所需的其余详细信息。
如果您想了解执行哪些 aws 命令来创建、删除和更新您的函数,请检查 manage.sh
脚本的输出。
关于原生创建命令需要注意的一件事是 aws lambda create-function
调用必须设置一个特定的环境变量
--environment 'Variables={DISABLE_SIGNAL_HANDLERS=true}'
集成测试
Funqy AWS Lambda 支持利用 Quarkus AWS Lambda 测试框架,以便您可以对 Funqy 函数进行单元测试。这对于 JVM 和原生模式都是如此。此测试框架提供与 SAM CLI 类似的功能,而没有 Docker 的开销。
如果您打开 FunqyTest.java,您将看到该测试复制了 AWS 执行环境。
package org.acme.funqy;
import io.quarkus.amazon.lambda.test.LambdaClient;
import io.quarkus.test.junit.QuarkusTest;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
@QuarkusTest
public class FunqyTest {
@Test
public void testSimpleLambdaSuccess() throws Exception {
Friend friend = new Friend("Bill");
Greeting out = LambdaClient.invoke(Greeting.class, friend);
Assertions.assertEquals("Hello Bill", out.getMessage());
}
}
使用 SAM CLI 进行测试
AWS SAM CLI 允许您在模拟的 Lambda 环境中在笔记本电脑本地运行您的函数。这需要安装 docker。如果您选择利用它,这是一种可选方法。否则,Quarkus JUnit 集成应该足以满足您的大部分需求。
已为 JVM 和原生执行模式生成了一个启动模板。
运行以下 SAM CLI 命令以本地测试您的函数,传递相应的 SAM template
。 event
参数采用任何 JSON 文件,在本例中为示例 payload.json
。
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