Expose/deploy 不止一个处理程序(quarkus-lambda)
Expose/deploy more than a single handler (quarkus-lambda)
documentation 显示公开的处理程序(通过打包应用程序中的 io.quarkus.amazon.lambda.runtime.QuarkusStreamHandler::handleRequest
)是通过在 application.properties
中设置 quarkus.lambda.handler
来配置的。但是在我的例子中,我想从同一个项目部署多个处理程序。
有没有人知道从 quarkus-lambda 项目中公开多个处理程序的方法,或者是否有可能?
编辑:通读 https://github.com/quarkusio/quarkus/blob/master/extensions/amazon-lambda/runtime/src/main/java/io/quarkus/amazon/lambda/runtime/AmazonLambdaRecorder.java#L89 看来现在确实不可能,对吗?
您应该只编写一个 RestEasy 资源,然后按照此处编写的步骤操作:
https://quarkus.io/guides/amazon-lambda-http
有关 RestEasy 和 DynamoDB 的完整示例,请阅读以下内容:
基本上,想法是您只需在 Quarkus 中编写 Rest Resources,然后 Quarkus 通过 SAM CLI 在 AWS 中将所有资源端点部署和配置为 Api-Gateways 和 Lambda's & Handlers。
确保你的类路径中有这两个依赖项:
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>url-connection-client</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-amazon-lambda-http</artifactId>
</dependency>
然后运行:
mvn clean install
确保在您的 /target 文件夹中创建了必要的工件。
现在可以通过为每个 lambda 函数设置 QUARKUS_LAMBDA_HANDLER
环境变量来实现。此环境变量将覆盖 application.properties
中的 quarkus.lambda.handler
。
例如,如果您定义了多个处理程序:
@Named("Test")
public class TestLambda implements RequestHandler<InputObject, OutputObject> {
@Inject
ProcessingService service;
@Override
public OutputObject handleRequest(InputObject input, Context context) {
return new OutputObject().setRequestId("1").setResult("Test");
}
}
@Named("Sample")
public class SampleLambda implements RequestHandler<InputObject, OutputObject> {
@Inject
ProcessingService service;
@Override
public OutputObject handleRequest(InputObject input, Context context) {
return new OutputObject().setRequestId("2").setResult("Sample");
}
}
您可以使用以下 SAM 模板构建单个项目并部署多个功能。
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: AWS Serverless Quarkus - quarkus-amazon-lambda-common-deployment
Globals:
Api:
EndpointConfiguration: REGIONAL
BinaryMediaTypes:
- "*/*"
Resources:
TestFunction:
Type: AWS::Serverless::Function
Properties:
Handler: io.quarkus.amazon.lambda.runtime.QuarkusStreamHandler::handleRequest
Runtime: java11
CodeUri: target/function.zip
MemorySize: 256
Timeout: 15
Policies: AWSLambdaBasicExecutionRole
Environment:
Variables:
QUARKUS_LAMBDA_HANDLER: Test
Events:
TestFunction:
Type: Api
Properties:
Path: /test
Method: get
SampleFunction:
Type: AWS::Serverless::Function
Properties:
Handler: io.quarkus.amazon.lambda.runtime.QuarkusStreamHandler::handleRequest
Runtime: java11
CodeUri: target/function.zip
MemorySize: 256
Timeout: 15
Policies: AWSLambdaBasicExecutionRole
Environment:
Variables:
QUARKUS_LAMBDA_HANDLER: Sample
Events:
HelloWorld:
Type: Api
Properties:
Path: /sample
Method: get
documentation 显示公开的处理程序(通过打包应用程序中的 io.quarkus.amazon.lambda.runtime.QuarkusStreamHandler::handleRequest
)是通过在 application.properties
中设置 quarkus.lambda.handler
来配置的。但是在我的例子中,我想从同一个项目部署多个处理程序。
有没有人知道从 quarkus-lambda 项目中公开多个处理程序的方法,或者是否有可能?
编辑:通读 https://github.com/quarkusio/quarkus/blob/master/extensions/amazon-lambda/runtime/src/main/java/io/quarkus/amazon/lambda/runtime/AmazonLambdaRecorder.java#L89 看来现在确实不可能,对吗?
您应该只编写一个 RestEasy 资源,然后按照此处编写的步骤操作:
https://quarkus.io/guides/amazon-lambda-http
有关 RestEasy 和 DynamoDB 的完整示例,请阅读以下内容:
基本上,想法是您只需在 Quarkus 中编写 Rest Resources,然后 Quarkus 通过 SAM CLI 在 AWS 中将所有资源端点部署和配置为 Api-Gateways 和 Lambda's & Handlers。
确保你的类路径中有这两个依赖项:
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>url-connection-client</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-amazon-lambda-http</artifactId>
</dependency>
然后运行:
mvn clean install
确保在您的 /target 文件夹中创建了必要的工件。
现在可以通过为每个 lambda 函数设置 QUARKUS_LAMBDA_HANDLER
环境变量来实现。此环境变量将覆盖 application.properties
中的 quarkus.lambda.handler
。
例如,如果您定义了多个处理程序:
@Named("Test")
public class TestLambda implements RequestHandler<InputObject, OutputObject> {
@Inject
ProcessingService service;
@Override
public OutputObject handleRequest(InputObject input, Context context) {
return new OutputObject().setRequestId("1").setResult("Test");
}
}
@Named("Sample")
public class SampleLambda implements RequestHandler<InputObject, OutputObject> {
@Inject
ProcessingService service;
@Override
public OutputObject handleRequest(InputObject input, Context context) {
return new OutputObject().setRequestId("2").setResult("Sample");
}
}
您可以使用以下 SAM 模板构建单个项目并部署多个功能。
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: AWS Serverless Quarkus - quarkus-amazon-lambda-common-deployment
Globals:
Api:
EndpointConfiguration: REGIONAL
BinaryMediaTypes:
- "*/*"
Resources:
TestFunction:
Type: AWS::Serverless::Function
Properties:
Handler: io.quarkus.amazon.lambda.runtime.QuarkusStreamHandler::handleRequest
Runtime: java11
CodeUri: target/function.zip
MemorySize: 256
Timeout: 15
Policies: AWSLambdaBasicExecutionRole
Environment:
Variables:
QUARKUS_LAMBDA_HANDLER: Test
Events:
TestFunction:
Type: Api
Properties:
Path: /test
Method: get
SampleFunction:
Type: AWS::Serverless::Function
Properties:
Handler: io.quarkus.amazon.lambda.runtime.QuarkusStreamHandler::handleRequest
Runtime: java11
CodeUri: target/function.zip
MemorySize: 256
Timeout: 15
Policies: AWSLambdaBasicExecutionRole
Environment:
Variables:
QUARKUS_LAMBDA_HANDLER: Sample
Events:
HelloWorld:
Type: Api
Properties:
Path: /sample
Method: get