【发布时间】:2016-07-05 01:28:59
【问题描述】:
我有一个由 AWS 直接调用的 AWS lambda RequestHandler 类。最终我需要让它与 Spring Boot 一起工作,因为我需要它能够从 Spring Cloud 配置服务器检索数据。
问题是代码如果我在我自己的开发环境中本地运行可以工作,但在 AWS 上部署时无法注入配置值。
@Configuration
@EnableAutoConfiguration
@ComponentScan("my.package")
public class MyClass implements com.amazonaws.services.lambda.runtime.RequestHandler<I, O> {
public O handleRequest(I input, Context context) {
ApplicationContext applicationContext = new SpringApplicationBuilder()
.main(getClass())
.showBanner(false)
.web(false)
.sources(getClass())
.addCommandLineProperties(false)
.build()
.run();
log.info(applicationContext.getBean(SomeConfigClass.class).foo);
// prints cloud-injected value when running from local dev env
//
// prints "${path.to.value}" literal when running from AWS
// even though Spring Boot starts successfully without errors
}
}
@Configuration
public class SomeConfigClass {
@Value("${path.to.value}")
public String foo;
}
src/main/resources/bootstrap.yml:
spring:
application:
name: my_service
cloud:
config:
uri: http://my.server
failFast: true
profile: localdev
我尝试了什么:
- 使用常规 Spring MVC,但这是 doesn't have integration with
@Valueinjection/Spring cloud。 - 使用
@PropertySource- 但发现它不支持 .yml 文件 - 经过验证以确保配置服务器正在为任何 IP 地址的请求提供服务(没有 IP 地址过滤)
- 运行
curl以确保恢复值 - 已验证以确保 .jar 在 jar 根目录中实际包含
bootstrap.yml - 已验证以确保 .jar 实际包含 Spring Boot 类。 FWIW 我正在使用 Maven shade 插件,它将项目打包成一个包含所有依赖项的胖 .jar。
注意:AWS Lambda 不支持环境变量,因此我不能设置类似spring.application.name 的任何东西(既不能作为环境变量,也不能作为-D 参数)。我也无法控制实际启动MyClass 的底层类——这对最终用户是完全透明的。我只是打包jar并提供入口点(类名),剩下的就处理好了。
有什么我可能错过的吗?有什么办法可以更好地调试它?
【问题讨论】:
-
您的配置服务器是否可以从“外部”获得?我的意思是,你确定它没有隐藏在 IP 保护或类似的东西后面吗?
-
@freakman 好点,但不 - 刚刚检查过,配置请求是从任何主机提供的。
-
我假设您已经看过这个:cloud.spring.io/spring-cloud-aws/…,但它不适合您?我对 AWS Lambda 了解不多,但看到了这篇文章:github.com/cagataygurturk/aws-lambda-java-boilerplate。也许您已经检查了这些但想确认。
-
@RobBaily 谢谢,aws-java-lambda-boilerplate 正在使用经典的 Spring .xml 应用程序上下文方法(请参阅
AbstractHandler.java:58),但正如我在帖子中提到的那样,它没有与@Value注入/Spring cloud 集成(而 Spring Boot 可以)。回复:文档 - 是的,我在我的 Maven cfg 中使用spring-cloud-configartifactId,不幸的是,文档中没有提到 lambda,所以我无法从那里获得太多信息。 -
@mindas 您是否尝试过在本地为 Spring Cloud 类设置日志级别,您可以在其中看到它在做什么?如果是这样,那么您可以为您的 Lambda 部署设置相同的日志记录级别,看看有什么不同。不确定有多少日志可用,但您也可以克隆它并添加自己的日志消息。
标签: java spring spring-boot spring-cloud aws-lambda