You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Lambda上Spring Boot 3.2.4 RESTful API请求事件无效错误求助

问题分析与解决方案

核心错误原因

错误The incoming event is not a valid request from Amazon API Gateway or an Application Load Balancer主要由以下问题导致:

1. Function URL事件格式不兼容

你的Lambda配置了Function URL,但当前使用的SpringBootLambdaContainerHandler.getAwsProxyHandler()仅支持解析API Gateway V1/ALB的事件格式,Function URL的事件结构完全不同,导致无法识别。

2. InputStream被提前读取

在handleRequest方法中,你执行了logger.log("Final string result: " + inputStream.toString());,这会提前消费输入流,导致后续handler.proxyStream无法读取完整的事件数据,引发解析失败。

3. 依赖问题

  • 使用了aws-serverless-java-container-springboot3的里程碑版本2.0.0-M1,稳定性不足;
  • 同时引入spring-boot-starter-web和spring-boot-starter-webflux,存在容器依赖冲突;
  • 引入了仅适用于macOS的netty-resolver-dns-native-macos,Lambda运行在Linux环境,该依赖无用且可能引发加载问题。

4. SAM模板存在冗余配置

Events中重复定义了Api1和Api3,路由规则混乱,可能导致请求路由异常。


分步解决方案

1. 适配Function URL事件格式

将Handler替换为支持Function URL的专用实现,修改TaxHandler.java:

import com.amazonaws.serverless.proxy.model.FunctionUrlRequest;
import com.amazonaws.serverless.proxy.model.FunctionUrlResponse;
import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
import com.amazonaws.serverless.exceptions.ContainerInitializationException;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class TaxHandler implements RequestStreamHandler {

    private static final SpringBootLambdaContainerHandler<FunctionUrlRequest, FunctionUrlResponse> handler;

    static {
        try {
            // 替换为Function URL专用Handler
            handler = SpringBootLambdaContainerHandler.getFunctionUrlHandler(TaxbillApplication.class);
        } catch (ContainerInitializationException e) {
            e.printStackTrace();
            throw new RuntimeException("Could not initialize Spring Boot application", e);
        }
    }

    public TaxHandler() {
        Timer.enable(); // 生产环境请关闭该调试功能
    }

    @Override
    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
        LambdaLogger logger = context.getLogger();
        // 复制输入流用于日志,避免原流被提前消费
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len;
        while ((len = inputStream.read(buffer)) != -1) {
            baos.write(buffer, 0, len);
        }
        byte[] eventBytes = baos.toByteArray();
        logger.log("Received event: " + new String(eventBytes));
        
        // 将复制后的流传入代理方法
        handler.proxyStream(new ByteArrayInputStream(eventBytes), outputStream, context);
    }
}

2. 修复依赖配置

修改pom.xml,调整依赖版本并清理冗余:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- 移除webflux避免容器冲突 -->
    <!-- <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency> -->
    <!-- 移除mac专用netty依赖 -->
    <!-- <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-resolver-dns-native-macos</artifactId>
        <version>4.1.74.Final</version>
        <scope>runtime</scope>
        <classifier>osx-aarch_64</classifier>
    </dependency> -->
    <!-- 使用稳定版的aws-serverless-java-container -->
    <dependency>
        <groupId>com.amazonaws.serverless</groupId>
        <artifactId>aws-serverless-java-container-springboot3</artifactId>
        <version>2.0.2</version>
    </dependency>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-lambda-java-core</artifactId>
        <version>1.2.2</version>
    </dependency>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-lambda-java-runtime-interface-client</artifactId>
        <version>2.4.1</version>
    </dependency>
    <!-- 移除冗余json库(Spring Boot已内置相关依赖) -->
    <!-- <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20231013</version>
    </dependency>
    <dependency>
        <groupId>com.googlecode.json-simple</groupId>
        <artifactId>json-simple</artifactId>
        <version>1.1.1</version>
    </dependency> -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

3. 清理SAM模板冗余配置

修改SAM模板,移除重复事件并优化路由:

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: An AWS Serverless Application Model template describing your function.
Resources:
  myTaxBill:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: target/your-project-name.zip # 替换为实际打包后的zip路径
      MemorySize: 512
      Timeout: 15
      Handler: com.working.taxbill.Handler.TaxHandler::handleRequest
      Runtime: java17
      Architectures:
        - arm64
      EphemeralStorage:
        Size: 512
      EventInvokeConfig:
        MaximumEventAgeInSeconds: 21600
        MaximumRetryAttempts: 2
      FunctionUrlConfig:
        AuthType: NONE
        InvokeMode: BUFFERED
      PackageType: Zip
      Policies:
        - AWSLambdaBasicExecutionRole # 使用内置策略简化配置
      SnapStart:
        ApplyOn: None
      Events:
        ApiProxy:
          Type: Api
          Properties:
            Path: /{proxy+}
            Method: ANY
      RuntimeManagementConfig:
        UpdateRuntimeOn: Auto

4. 正确打包应用

使用shaded-jar profile打包,确保所有依赖被正确合并:

mvn clean package -P shaded-jar

内容的提问来源于stack exchange,提问作者MayXX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:14:56