簡體   English   中英

將Spring啟動/雲與Amazon AWS一起使用lambda不會注入值

[英]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

我試過了什么:

  • 使用常規的Spring MVC,但這並沒有與@Value注入/ Spring雲集成
  • 使用@PropertySource - 但發現它不支持.yml文件
  • 驗證以確保配置服務器正在為任何IP地址提供請求(沒有IP地址過濾)
  • 運行curl以確保返回值
  • 驗證確保.jar實際上包含jar根的bootstrap.yml
  • 驗證以確保.jar實際上包含Spring Boot類。 FWIW我正在使用Maven shade插件,它將項目打包成一個包含所有依賴項的胖.jar。

注意: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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM