Docker部署Spring Cloud Function到AWS Lambda遇FunctionCatalog异常排查
Spring Cloud Function部署AWS Lambda报错:FunctionCatalog找不到+任务超时
将最简Spring Cloud Function应用通过Docker镜像部署至AWS Lambda时,本地运行正常,但云端部署后抛出No qualifying bean of type 'org.springframework.cloud.function.context.FunctionCatalog' available异常,同时出现任务超时。
应用代码
@SpringBootApplication public class GraalvmFuncExampleApplication { public static void main(String[] args) { SpringApplication.run(GraalvmFuncExampleApplication.class, args); } @Bean public Function<Mono<MyRequest>, Mono<MyResponse>> transform() { return req -> { return req.flatMap(r -> Mono.just(MyResponse.builder().name(r.getName().toUpperCase()).build())); }; } }
依赖配置(pom.xml)
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.1.2</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>vlad.dev</groupId> <artifactId>graalvm-func-example</artifactId> <version>0.0.1-SNAPSHOT</version> <name>graalvm-func-example</name> <description>Demo project for Spring Boot</description> <properties> <java.version>17</java.version> <spring-cloud.version>2022.0.4</spring-cloud.version> <start-class>com.amazonaws.services.lambda.runtime.api.client.AWSLambda</start-class> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-function-parent</artifactId> <version>4.0.4</version> <type>pom</type> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-runtime-interface-client</artifactId> <version>2.3.2</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-function-adapter-aws</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-function-webflux</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
报错日志
14:07:40.192 [main] INFO org.springframework.cloud.function.utils.FunctionClassUtils -- Main class: class com.amazonaws.services.lambda.runtime.api.client.AWSLambda . ____ _ __ _ _ /\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.1.2) 2023-08-12T14:07:42.761Z INFO 9 --- [ main] o.s.c.f.a.aws.CustomRuntimeInitializer : AWS Handler: org.springframework.cloud.function.adapter.aws.FunctionInvoker 2023-08-12T14:07:42.824Z INFO 9 --- [ main] c.a.s.l.runtime.api.client.AWSLambda : Starting AWSLambda v2.1.1 using Java 17.0.3 with PID 9 (/var/runtime/lib/aws-lambda-java-runtime-interface-client-2.1.1.jar started by sbx_user1051 in /) 2023-08-12T14:07:42.826Z INFO 9 --- [ main] c.a.s.l.runtime.api.client.AWSLambda : No active profile set, falling back to 1 default profile: "default" 2023-08-12T14:07:43.969Z INFO 9 --- [ main] c.a.s.l.runtime.api.client.AWSLambda : Started AWSLambda in 2.857 seconds (process running for 4.037) No qualifying bean of type 'org.springframework.cloud.function.context.FunctionCatalog' available: org.springframework.beans.factory.NoSuchBeanDefinitionException org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.cloud.function.context.FunctionCatalog' available at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:341) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:332) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1173) at org.springframework.cloud.function.adapter.aws.FunctionInvoker.start(FunctionInvoker.java:109) at org.springframework.cloud.function.adapter.aws.FunctionInvoker.<init>(FunctionInvoker.java:71) at org.springframework.cloud.function.adapter.aws.FunctionInvoker.<init>(FunctionInvoker.java:79) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) START RequestId: 6368b3eb-605f-490b-bc2e-f74972623968 Version: $LATEST 2023-08-12T14:08:35.442Z 6368b3eb-605f-490b-bc2e-f74972623968 Task timed out after 3.09 seconds
问题排查与解决方案
核心原因分析
FunctionCatalog缺失:日志显示启动类是AWS的AWSLambda而非你的Spring Boot主类,导致Spring Cloud Function的自动配置逻辑未触发,核心Bean没初始化。- 任务超时:超时是连锁反应——Lambda请求进来后,
FunctionInvoker找不到函数Bean,处理流程卡住,最终触发Lambda超时限制。
具体修复步骤
1. 修正启动类配置
移除pom.xml中自定义的start-class,让Spring Boot默认用你的GraalvmFuncExampleApplication作为启动类。AWS Runtime Interface Client会通过Spring Cloud Function适配器自动衔接,不需要指定AWS的类。
修改后properties部分:
<properties> <java.version>17</java.version> <spring-cloud.version>2022.0.4</spring-cloud.version> <!-- 移除start-class配置 --> </properties>
2. 优化依赖配置
- 删掉
spring-cloud-function-parent的pom依赖,Spring Cloud版本已经由spring-cloud.version的BOM管理,无需单独指定。 - 添加Spring Cloud BOM来统一管理版本,避免依赖冲突。
调整后的依赖部分:
<dependencies> <!-- 移除spring-cloud-function-parent依赖 --> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-runtime-interface-client</artifactId> <version>2.3.2</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-function-adapter-aws</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-function-webflux</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <!-- 添加Spring Cloud BOM管理版本 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
3. 配置Lambda Handler
在AWS Lambda控制台或部署模板中,指定Handler为org.springframework.cloud.function.adapter.aws.FunctionInvoker,这是Spring Cloud Function适配Lambda的标准入口。
4. 调整Lambda资源配置
适当调高Lambda的内存(比如512MB)和超时时间(比如10秒),给Spring容器足够的启动和处理时间,避免因初始化慢导致超时。
内容的提问来源于stack exchange,提问作者Vladimir
相关产品推荐
相关产品推荐

