- 确认 Lambda 函数的入口类和 Spring Boot 应用的主类相同,因为 AWS Lambda 会调用入口类的 handleRequest() 方法来处理请求。
- 确认 Lambda 函数的依赖项使用和 Spring Boot 应用相同的版本。
- 确认 Lambda 函数的运行时配置正确,如内存大小和执行时间等。
- 确认 Lambda 函数的执行环境和 Spring Boot 应用的部署环境相同。
- 编写 LambdaHandler 类,并在 handleRequest() 方法中调用 Spring Boot 应用的启动方法。
public class LambdaHandler implements RequestHandler {
private static final SpringApplication application = new SpringApplication(SpringBootLambdaApplication.class);
private static final ApplicationContextAware contextAware = applicationContext -> {
LambdaHandler.application.setApplicationContext(applicationContext);
};
public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent input, Context context) {
APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent();
SpringApplicationBuilder builder = new SpringApplicationBuilder()
.sources(SpringBootLambdaApplication.class)
.listeners(contextAware)
.web(WebApplicationType.NONE);
try (ConfigurableApplicationContext applicationContext = builder.run()) {
SpringBootLambdaApplication application = applicationContext.getBean(SpringBootLambdaApplication.class);
response.setBody(application.handleRequest(input));
} catch (Exception e) {
response.setStatusCode(500);
response.setBody(e.getMessage());
}
return response;
}
}
- 修改 build.gradle 文件,以便正确配置 Spring Boot 应用程序的构建和打包,使其可以在 AWS Lambda 上运行。
plugins {
id 'org.springframework.boot' version '2.3.11.RELEASE' apply false
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web:2.3.11.RELEASE'
implementation 'com.amazonaws:aws-lambda-java-core:1.2.1'
implementation 'com.amazonaws:aws-lambda-java-events:3.7.0'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.11.4'
testImplementation 'org.springframework.boot:spring-boot-starter-test:2.3.11.RELEASE'
}
task buildZip(type: Zip) {
from compileJava
from processResources
from("${