编辑此页面

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 基础。 这是一篇简短的阅读!

  • Amazon AWS 帐户

  • AWS CLI

  • AWS SAM CLI,用于本地测试

Funqy AWS Lambdas 基于我们的Quarkus AWS Lambda 支持构建。

安装 AWS 组件

安装所有 AWS 组件可能是本指南中最困难的事情。请确保您按照所有步骤安装 AWS CLI。

快速入门

克隆 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 和原生部署的函数。此脚本在构建时生成。

构建和部署

使用 Maven 构建项目

CLI
quarkus build
Maven
./mvnw install

这将编译和打包您的代码。

创建执行角色

查看入门指南,了解如何使用 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 支持四个操作:createdeleteupdateinvoke

要验证您的设置,您是否已安装 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

更新函数

您可以根据需要更新 Java 代码。重新构建后,可以通过执行 update 命令来重新部署您的函数。

sh target/manage.sh update

部署到 AWS Lambda 自定义(原生)运行时

如果您希望 Funqy 函数具有更低的内存占用和更快的初始化时间,可以将 Java 代码编译为原生可执行文件。只需确保使用 -Dnative 开关重新构建您的项目。

对于 Linux 主机,执行

CLI
quarkus build --native
Maven
./mvnw install -Dnative
如果您在非 Linux 系统上构建,您还需要传入一个属性,指示 Quarkus 使用 Docker 构建,因为 Amazon Lambda 需要 Linux 二进制文件。您可以通过将此属性传递给您的构建来完成此操作:-Dnative-image.docker-build=true。但是,这需要您在本地安装 Docker。
CLI
quarkus build --native --no-tests -Dquarkus.native.container-build=true
# The --no-tests flag is required only on Windows and macOS.
Maven
./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}'

检查 POM

POM 没有什么特别之处,除了将 quarkus-funqy-amazon-lambda 扩展作为依赖项包含在内。该扩展会自动生成 lambda 部署所需的一切。

集成测试

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 templateevent 参数采用任何 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

修改 function.zip

有时您可能需要向构建生成的 function.zip lambda 部署中添加其他条目。为此,请在 src/main 中创建一个 zip.jvmzip.native 目录。如果您正在执行纯 Java,则创建 zip.jvm/。如果您正在执行原生部署,则创建 zip.native/

您在 zip 目录下创建的任何文件和目录都将包含在 function.zip

自定义 bootstrap 脚本

有时您可能希望在 lambda 调用您的原生 Funqy 部署时设置特定的系统属性或其他参数。如果您在 zip.native 中包含一个 bootstrap 脚本文件,Funqy 扩展会自动将可执行文件重命名为 function.zip 中的 runner,并将 bootstrap 脚本的 unix 模式设置为可执行。

如果您包含自定义 bootstrap 脚本,则原生可执行文件必须引用为 runner

该扩展在 target/bootstrap-example.sh 中生成一个示例脚本。

相关内容