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

GraalVM编译的Spring Native Lambda触发CloudWatch事件后不执行如何解决

核心问题说明

你的应用当前因引入了WebFlux依赖启动了嵌入式Netty HTTP服务,完全没有走Lambda事件处理链路,同时未指定需要触发的函数,导致CloudWatch事件到来时找不到对应的执行逻辑,所以不会输出预期日志。


修正步骤

  1. 调整依赖配置
    删除pom中spring-cloud-starter-function-webflux依赖,该依赖会启动HTTP服务,不符合Lambda事件触发场景,同时给基础启动器排除多余web依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </exclusion>
    </exclusions>
</dependency>

你已引入的spring-cloud-function-adapter-aws才是对接Lambda事件的正确适配器,无需额外添加web类依赖。

  1. 添加Lambda环境变量配置
    在AWS Lambda控制台的环境变量配置页,新增如下变量:
    SPRING_CLOUD_FUNCTION_DEFINITION=markFunction
    这里的markFunction是你MarkFunction Bean的默认名称(Spring默认将类名首字母小写作为Bean名),该配置会告知Spring Cloud Function触发时要执行的目标函数。

  2. 补充GraalVM原生编译提示
    原生编译需要提前注册Lambda事件类的反射、序列化信息,避免运行时反序列化失败,在启动类上添加@NativeHint注解:

@SpringBootApplication
@NativeHint(types = {
    ScheduledEvent.class,
    MarkFunction.class
}, serialization = @SerializationHint(types = ScheduledEvent.class))
public class TestMarkApplication {
    public static void main(String[] args) {
        SpringApplication.run(TestMarkApplication.class, args);
    }
}
  1. 确认Lambda基础配置
  • 运行时必须选择 提供的AL2(provided.al2),不能使用Java运行时,因为你上传的是原生可执行文件而非Jar包
  • Handler配置无需填写自定义类,填写org.springframework.cloud.function.adapter.aws.SpringBootRequestHandler即可,适配器会自动根据环境变量找到对应的Consumer执行
  1. 确认打包脚本正确性
    你用maven-assembly-plugin打包的zip包中,必须包含名为bootstrap的可执行脚本,内容如下:
#!/bin/sh
./test-mark

注意必须给bootstrap文件添加可执行权限,否则Lambda无法正常启动你的应用。

完成以上配置后重新编译打包上传,触发事件即可看到预期的Native output日志输出。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:54:04