我创建了一个基于AWS Lambda的Spring Cloud函数,它有多个函数,当我只定义一个";spring_ cloud_function_definition;AWS Lambda配置面板中的环境变量。这些函数的输入和输出是消息<gt,因此负载和http头也可以在运行时访问。
我想在不同的API网关方法中使用这个AWS Lambda函数,例如:
- /item[POST]->应调用saveItem
- /项目[DELETE]->应该调用deleteItem
- 。。。等等
https://cloud.spring.io/spring-cloud-static/spring-cloud-function/3.0.0.RC1/reference/html/spring-cloud-function.html#_function_catalog_and_flexible_function_signatures
我在Spring.io上找到了这个文件,上面说它是可行的:
如果输入参数的类型为Message<gt;,您可以通过设置spring.cloud.function.definition或spring.loud.function.routing-expression消息头之一来传达路由指令。对于更多的静态情况,您可以使用spring.cloud.function.definition标头,它允许您提供单个函数的名称(例如…definition=foo(或组合指令(例如…definition=foo|bar|baz(
因此,以下测试事件应在AWS Lambda中运行,不会出现任何故障:
{"方法":"POST";,"身体":"{"键":"值"}";,"标题":{"spring.cloud.function.definition":"saveItem";}}
但它当然抛出了一个例外:
No function defined: java.lang.IllegalStateException
java.lang.IllegalStateException: No function defined
at org.springframework.cloud.function.context.AbstractSpringFunctionAdapterInitializer.apply(AbstractSpringFunctionAdapterInitializer.java:187)
at org.springframework.cloud.function.adapter.aws.SpringBootRequestHandler.handleRequest(SpringBootRequestHandler.java:51)
at org.springframework.cloud.function.adapter.aws.SpringBootApiGatewayRequestHandler.handleRequest(SpringBootApiGatewayRequestHandler.java:140)
at org.springframework.cloud.function.adapter.aws.SpringBootApiGatewayRequestHandler.handleRequest(SpringBootApiGatewayRequestHandler.java:43)
我尝试了很多配置(application.properties、AWS Lambda env属性、header等(,但都没有成功:
- spring.cloud.function.routing expression=headers.function_name
- 设置spring.cloud.function.definition=saveItem
可能是什么问题?在这种情况下,最佳配置是什么?任何帮助都将不胜感激!
使用的技术:
- 云:AWS
- 云组件:Lambda+API网关
- AWS Lambda处理程序类:org.springframework.cloud.function.adapter.AWS.SpringBootApiGatewayRequestHandler
- AWS Lambda输入和输出事件:APIGatewayProxyRequestEvent,APIGatewayProxy ResponseEvent
- Java:8
- Spring Cloud功能版本:3.0.6.RELEASE
我已经更新到v3.1.3并切换到FunctionInvoker,并且我已经将函数定义添加到请求模板映射头中,它运行得很好。
无论如何,谢谢你的帮助。:(