如何解决我的 Lamda 函数部署 Spring Boot 中的错误?

问题描述 投票:0回答:1

我想在 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

如何修复此错误?

java spring-boot aws-lambda pulumi
1个回答
0
投票

有人可以回答以上问题吗?

© www.soinside.com 2019 - 2024. All rights reserved.