我想在 AWS Lamda 函数上运行 Spring Boot 控制器。我有一个如下所示的处理程序:
package com.amazonaws.serverless.sample.springboot3;
import com.amazonaws.serverless.exceptions.ContainerInitializationException;
import com.amazonaws.serverless.proxy.internal.testutils.Timer;
import com.amazonaws.serverless.proxy.model.AwsProxyRequest;
import com.amazonaws.serverless.proxy.model.AwsProxyResponse;
import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler;
import com.amazonaws.serverless.sample.springboot3.filter.CognitoIdentityFilter;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
import jakarta.servlet.DispatcherType;
import jakarta.servlet.FilterRegistration;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.EnumSet;
public class StreamLambdaHandler implements RequestStreamHandler {
private static SpringBootLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler;
static {
try {
handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(Application.class);
// For applications that take longer than 10 seconds to start, use the async builder:
// handler = new SpringBootProxyHandlerBuilder<AwsProxyRequest>()
// .defaultProxy()
// .asyncInit()
// .springBootApplication(Application.class)
// .buildAndInitialize();
// we use the onStartup method of the handler to register our custom filter
handler.onStartup(servletContext -> {
FilterRegistration.Dynamic registration = servletContext.addFilter("CognitoIdentityFilter", CognitoIdentityFilter.class);
registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");
});
} catch (ContainerInitializationException e) {
// if we fail here. We re-throw the exception to force another cold start
e.printStackTrace();
throw new RuntimeException("Could not initialize Spring Boot application", e);
}
}
public StreamLambdaHandler() {
// we enable the timer for debugging. This SHOULD NOT be enabled in production.
Timer.enable();
}
@Override
public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context)
throws IOException {
handler.proxyStream(inputStream, outputStream, context);
}
}
Gradle 构建如下所示:
apply plugin: 'java'
repositories {
mavenLocal()
mavenCentral()
}
sourceCompatibility = 11
targetCompatibility = 11
dependencies {
implementation (
implementation('org.springframework.boot:spring-boot-starter-web:2.7.13') {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
},
'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)',
)
}
task buildZip(type: Zip) {
from compileJava
from processResources
into('lib') {
from(configurations.compileClasspath) {
exclude 'tomcat-embed-*'
}
}
}
build.dependsOn buildZip
我使用此 Pulumi 代码将代码部署到 Lamda 函数:
import * as aws from "@pulumi/aws"
import * as pulumi from "@pulumi/pulumi";
import {usersExecutionRole} from "./UsersExecutionRole"
const stack = pulumi.getStack()
const handler= "com.amazonaws.serverless.sample.springboot3.StreamLambdaHandler"
export const usersFunction = new aws.lambda.Function("users-function", {
code: new pulumi.asset.FileArchive("../build/distributions/pet.zip"),
runtime: aws.lambda.Runtime.Java11,
handler: handler,
role: usersExecutionRole.arn,
name: stack + '-' +"petsFunction",
memorySize: 10240,
timeout: 900,
tracingConfig:{mode:"Active"},
architectures:["arm64"],
}
},
当我用curl调用Lamda函数时 卷曲https://512lnld1ve.execute-api.eu-north-1.amazonaws.com/dev/pets 我收到以下消息: {"message":"内部服务器错误"}%
ClodWatch 显示以下消息:
Error loading class com.amazonaws.serverless.sample.springboot3.StreamLambdaHandler: javax/servlet/ServletException: java.lang.NoClassDefFoundError
java.lang.NoClassDefFoundError: javax/servlet/ServletException
at org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext$Factory.create(AnnotationConfigServletWebServerApplicationContext.java:230)
at org.springframework.boot.DefaultApplicationContextFactory.getFromSpringFactories(DefaultApplicationContextFactory.java:61)
at org.springframework.boot.DefaultApplicationContextFactory.create(DefaultApplicationContextFactory.java:48)
at org.springframework.boot.SpringApplication.createApplicationContext(SpringApplication.java:566)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:304)
at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:164)
at com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler.initialize(SpringBootLambdaContainerHandler.java:189)
at com.amazonaws.serverless.proxy.InitializationWrapper.start(InitializationWrapper.java:35)
at com.amazonaws.serverless.proxy.spring.SpringBootProxyHandlerBuilder.buildAndInitialize(SpringBootProxyHandlerBuilder.java:79)
at com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler.getAwsProxyHandler(SpringBootLambdaContainerHandler.java:87)
at com.amazonaws.serverless.sample.springboot3.StreamLambdaHandler.<clinit>(StreamLambdaHandler.java:26)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Unknown Source)
Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletException. Current classpath: file:/var/task/:file:/var/task/lib/aws-lambda-java-core-1.2.2.jar:file:/var/task/lib/aws-serverless-java-container-core-2.0.0-M1.jar:file:/var/task/lib/aws-serverless-java-container-springboot3-2.0.0-M1.jar:file:/var/task/lib/commons-io-2.12.0.jar:file:/var/task/lib/jackson-annotations-2.15.1.jar:file:/var/task/lib/jackson-core-2.15.1.jar:file:/var/task/lib/jackson-databind-2.15.1.jar:file:/var/task/lib/jackson-datatype-jdk8-2.15.1.jar:file:/var/task/lib/jackson-datatype-jsr310-2.15.1.jar:file:/var/task/lib/jackson-module-afterburner-2.15.1.jar:file:/var/task/lib/jackson-module-parameter-names-2.15.1.jar:file:/var/task/lib/jakarta.annotation-api-1.3.5.jar:file:/var/task/lib/jakarta.servlet-api-6.0.0.jar:file:/var/task/lib/jakarta.ws.rs-api-3.1.0.jar:file:/var/task/lib/jul-to-slf4j-1.7.36.jar:file:/var/task/lib/log4j-api-2.17.2.jar:file:/var/task/lib/log4j-to-slf4j-2.17.2.jar:file:/var/task/lib/logback-classic-1.2.12.jar:file:/var/task/lib/logback-core-1.2.12.jar:file:/var/task/lib/slf4j-api-2.0.7.jar:file:/var/task/lib/snakeyaml-1.30.jar:file:/var/task/lib/spring-aop-5.3.28.jar:file:/var/task/lib/spring-beans-5.3.28.jar:file:/var/task/lib/spring-boot-2.7.13.jar:file:/var/task/lib/spring-boot-autoconfigure-2.7.13.jar:file:/var/task/lib/spring-boot-starter-2.7.13.jar:file:/var/task/lib/spring-boot-starter-json-2.7.13.jar:file:/var/task/lib/spring-boot-starter-logging-2.7.13.jar:file:/var/task/lib/spring-boot-starter-web-2.7.13.jar:file:/var/task/lib/spring-context-5.3.28.jar:file:/var/task/lib/spring-core-5.3.28.jar:file:/var/task/lib/spring-expression-5.3.28.jar:file:/var/task/lib/spring-jcl-5.3.28.jar:file:/var/task/lib/spring-web-5.3.28.jar:file:/var/task/lib/spring-webmvc-5.3.28.jar
如何修复此错误?
有人可以回答以上问题吗?