Funqy AWS Lambda Binding
指南中将对快速入门代码进行介绍,向您展示如何将 Funqy 函数部署到 AWS Lambda。 可以使用 AWS Lambda Java 运行时部署 Funqy 函数,或者在需要更小的内存占用和更快的冷启动时间时,您可以构建原生可执行文件并使用 Lambda 自定运行时。 Unresolved directive in funqy-aws-lambda.adoc - include::{includes}/extension-status.adoc[]
Prerequisites
include::{includes}/prerequisites.adoc[]* 阅读有关 Funqy Basics 的部分。这部分内容篇幅很短!* An Amazon AWS account* AWS CLI* AWS SAM CLI,用于本地测试
|
Funqy AWS Lambdas 构建于我们的 Quarkus AWS Lambda support 之上。 |
The Quickstart
克隆 Git 存储库: git clone {quickstarts-clone-url},或下载 {quickstarts-archive-url}[存档]。
解决方案位于 funqy-amazon-lambda-quickstart directory 中。
The Code
代码没什么特别的,更重要的是没有什么内容是特定于 AWS 的。Funqy 函数可以部署到许多环境,而 AWS Lambda 就是其中之一。Java 代码实际上与 funqy-http-quickstart 的代码完全相同。
Choose Your Function
每个 AWS Lambda 部署只能导出一个 Funqy 函数。如果您在项目中定义了多个函数,那么您需要选择 Quarkus application.properties 中的函数:
quarkus.funqy.export=greet
您可以看到快速入门是如何在自己的 application.properties 中完成的。
或者,您可以在使用 aws cli 创建 AWS Lambda 时设置 QUARKUS_FUNQY_EXPORT 环境变量。
Deploy to AWS Lambda Java Runtime
要想在 AWS Lambda 上运行您的 Funqy 函数,有一些步骤。快速入门 maven 项目会生成一个有用的脚本,用于创建、更新、删除和调用纯 Java 函数和原生部署。此脚本在构建时生成。
Build and Deploy
使用 Maven 构建项目:
Unresolved directive in funqy-aws-lambda.adoc - include::{includes}/devtools/build.adoc[]
这将编译和打包你的代码。
Create an Execution Role
查看 Getting Started Guide 以使用 AWS CLI 部署 Lambda。具体来说,请确保你已经创建了一个 Execution Role。你将需要在你的个人资料或控制台窗口中定义一个 LAMBDA_ROLE_ARN 环境变量,或者,你可以在构建生成的 manage.sh 脚本中编辑并将角色值直接放在其中:
LAMBDA_ROLE_ARN="arn:aws:iam::1234567890:role/lambda-role"
Extra Build Generated Files
在你运行构建后,quarkus-funqy-amazon-lambda 扩展会生成一些额外的文件。这些文件在构建目录中:target/ 用于 Maven,build/ 用于 Gradle。
-
function.zip- lambda 部署文件 -
manage.sh——aws lambda cli 调用的包装器 -
bootstrap-example.sh——原生部署示例引导脚本 -
sam.jvm.yaml——(可选的)用于 sam cli 和本地测试 -
sam.native.yaml——(可选的)用于 sam cli 和原生本地测试
Create the function
target/manage.sh 脚本用于使用 AWS Lambda Java 运行时管理你的 Funqy 函数。该脚本仅为你的方便提供。如果你想要了解用于创建、删除和更新你的函数的 aws 命令,请检查 manage.sh 脚本的输出。
manage.sh 支持四种操作:create、delete、update`和 `invoke。
|
为了验证你的设置,你已经安装了 AWS CLI,执行了 AWS 访问密钥的 aws configure,并且设置了 |
以下载 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
不要更改处理程序开关。这必须硬编码为 io.quarkus.funqy.lambda.FunqyStreamHandler::handleRequest。这个特殊的处理程序是 Funqy 与 AWS Lambda 的集成点。
如果有任何问题在创建函数时发生,你需要使用 delete 删除它,然后重新运行 create 命令。
sh target/manage.sh delete
命令也可以被叠加:
sh target/manage.sh delete create
Invoke the function
使用 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
Deploy to AWS Lambda Custom (native) Runtime
如果您想要 Funqy 函数更低的内存占用和更快的初始化时间,可以将 Java 代码编译为本机可执行文件。请确保使用 -Dnative 开关重建项目。
对于 Linux 主机,执行以下操作:
Unresolved directive in funqy-aws-lambda.adoc - include::{includes}/devtools/build-native.adoc[]
|
如果您在非 Linux 系统上进行构建,还需要传入一个属性,指示 Quarkus 使用 Docker 来构建,因为 AmazonLambda 需要 Linux 二进制文件。可以通过将此属性传入构建来实现: |
Unresolved directive in funqy-aws-lambda.adoc - include::{includes}/devtools/build-native-container.adoc[]
上述命令都将编译并创建一个本机可执行文件。它还生成一个 zip 文件 target/function.zip。此 zip 文件包含重命名为 bootstrap 的本机可执行映像文件。这是 AWS LambdaCustom(提供)Runtime 的要求。
此处的说明与上面完全相同,只有一处更改:您需要将 native 添加为 manage.sh 脚本的第一个参数:
sh target/manage.sh native create
与上面一样,可以堆叠命令。唯一的要求是,如果您希望使用本机映像构建,则第一个参数必须是 native。该脚本将负责管理本机映像函数部署所需的其余详细信息。
如果您想知道执行 aws 命令以创建、删除和更新函数,请检查 manage.sh 脚本的输出。
关于本机创建命令要注意的一件事是 aws lambda create-function 调用必须设置一个特定的环境变量:
--environment 'Variables={DISABLE_SIGNAL_HANDLERS=true}'
Integration Testing
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());
}
}
Testing with the SAM CLI
AWS SAM CLI 允许您在模拟的 Lambda 环境中在自己的笔记本电脑上本地运行函数。这需要安装 docker。这是一个可选途径,如果您选择使用,应予以考虑。否则,Quarkus JUnit 集成应该可以满足您的大部分需求。
已为 JVM 和本机执行模式生成了一个 starter 模板。
运行以下 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