GraalVM编译的Spring Native Lambda触发CloudWatch事件后不执行如何解决
核心问题说明
你的应用当前因引入了WebFlux依赖启动了嵌入式Netty HTTP服务,完全没有走Lambda事件处理链路,同时未指定需要触发的函数,导致CloudWatch事件到来时找不到对应的执行逻辑,所以不会输出预期日志。
修正步骤
- 调整依赖配置
删除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类依赖。
添加Lambda环境变量配置
在AWS Lambda控制台的环境变量配置页,新增如下变量:SPRING_CLOUD_FUNCTION_DEFINITION=markFunction
这里的markFunction是你MarkFunctionBean的默认名称(Spring默认将类名首字母小写作为Bean名),该配置会告知Spring Cloud Function触发时要执行的目标函数。补充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); } }
- 确认Lambda基础配置
- 运行时必须选择 提供的AL2(provided.al2),不能使用Java运行时,因为你上传的是原生可执行文件而非Jar包
- Handler配置无需填写自定义类,填写
org.springframework.cloud.function.adapter.aws.SpringBootRequestHandler即可,适配器会自动根据环境变量找到对应的Consumer执行
- 确认打包脚本正确性
你用maven-assembly-plugin打包的zip包中,必须包含名为bootstrap的可执行脚本,内容如下:
#!/bin/sh ./test-mark
注意必须给bootstrap文件添加可执行权限,否则Lambda无法正常启动你的应用。
完成以上配置后重新编译打包上传,触发事件即可看到预期的Native output日志输出。
内容的提问来源于stack exchange,提问作者appel500
相关产品推荐
相关产品推荐

