[英]Spring Boot App with Batch does not working in Amazon AWS Lambda environment
[英]Using Spring boot/cloud with Amazon AWS lambda does not inject values
我有一個AWS lambda RequestHandler
類,它由AWS直接調用。 最終我需要使用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
我試過了什么:
@Value
注入/ Spring雲集成 。 @PropertySource
- 但發現它不支持.yml文件 curl
以確保返回值 bootstrap.yml
注意:AWS Lambda 不支持環境變量,因此我無法設置spring.application.name
類的spring.application.name
(既不作為環境變量也不作為-D
參數)。 我也無法控制實際啟動MyClass
的底層類 - 這對最終用戶完全透明。 我只是打包jar並提供入口點(類名),休息得到照顧。
有什么我可以錯過的嗎? 我能以更好的方式調試這個嗎?
經過一些調試后,我確定問題在於使用Maven Shade插件。 Spring Boot在其autoconfigure jar中查找META-INF / spring.factories jar, 請參閱此處獲取有關此內容的一些信息。 為了正確打包Spring Boot jar,您需要使用Spring Boot Maven插件並將其設置為在maven重新打包階段運行。 它在本地IDE中工作的原因是因為您沒有運行Shade打包的jar。 他們在插件中做了一些特殊的魔術,以便在Shade插件不知道的地方找到正確的位置。
我能夠創建一些最初沒有注入值的示例代碼,但現在我使用了正確的插件。 看到這個GitHub回購 ,看看我做了什么。
我沒有將它與Spring Cloud連接,但現在Spring Boot注入的其余部分正在工作,我認為它應該是直截了當的。
正如我在評論中提到的,您可能只想考慮一個簡單的REST調用來獲取雲配置並自己注入,以節省在每次請求時加載Spring應用程序的開銷。
更新:對於Spring Boot 1.4.x,您必須在Spring Boot插件中提供此配置:
<configuration>
<layout>MODULE</layout>
</configuration>
如果你沒有,那么默認情況下插件的新行為是將所有jar放在BOOT-INF下,因為jar的目的是可執行並讓bootstrap進程加載它。 我在解決這里遇到的情況警告時發現了這一點。 有關參考,請參閱https://github.com/spring-projects/spring-boot/issues/5465 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.