Amazon AWS 람다와 함께 Spring boot/cloud를 사용해도 값이 주입되지 않습니다.
AWS 람다를 가지고 있습니다.RequestHandler
AWS에서 직접 호출하는 클래스입니다.Spring Cloud 구성 서버에서 데이터를 검색할 수 있어야 하기 때문에 결국 Spring Boot과 함께 작동해야 합니다.
문제는 자신의 개발 환경에서 로컬로 실행하면 코드가 작동하지만 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를 사용하지만 주입/Spring cloud와 통합되지 않습니다.
- 사용.
@PropertySource
하지만 .yml 파일을 지원하지 않는다는 것을 알게 되었습니다. - 구성 서버가 모든 IP 주소에 대한 요청을 처리하는지 확인(IP 주소 필터링 없음)
- 입니다.
curl
가치를 확실히 되찾기 위해 - .jar가 실제로 다음을 포함하는지 확인했습니다.
bootstrap.yml
뿌리째에 - .jar에 실제로 Spring Boot 클래스가 포함되어 있는지 확인합니다.FWIW 나는 모든 의존성을 가진 fat.jar로 프로젝트를 패키지화하는 메이븐 셰이드 플러그인을 사용하고 있습니다.
참고: AWS Lambda는 환경 변수를 지원하지 않으므로 다음과 같이 설정할 수 없습니다.spring.application.name
(환경 변수 또는 로 표시됨)-D
매개 변수).또한 실제로 시작되는 기본 클래스도 제어할 수 없습니다.MyClass
이는 최종 사용자에게 완전히 투명합니다.저는 단지 병을 포장하고 진입점(클래스 이름)을 제공하면 휴식은 해결됩니다.
제가 놓친 게 있나요?더 잘 디버그할 수 있는 방법이 있습니까?
약간의 디버깅 끝에 메이븐 셰이드 플러그인 사용에 문제가 있다는 것을 확인했습니다.Spring Boot은 자동 구성 병에서 META-INF/spring.factories 병을 찾습니다. 이에 대한 자세한 내용은 여기를 참조하십시오.Spring Boot jar를 올바르게 패키지화하려면 Spring Boot Maven Plugin을 사용하여 Maven 재패키지 단계에서 실행되도록 설정해야 합니다.로컬 IDE에서 작동하는 이유는 쉐이드 패키지 병을 실행하고 있지 않기 때문입니다.그들은 그들의 플러그인에서 쉐이드 플러그인이 알지 못하는 정확한 위치에 물건을 넣기 위해 특별한 마법을 부립니다.
처음에는 값을 주입하는 것이 아니라 올바른 플러그인을 사용하여 작동하는 샘플 코드를 만들 수 있었습니다.내가 한 일을 확인하려면 이 GitHub 보고서를 참조하십시오.
Spring Cloud와 연결하지는 않았지만, Spring Boot 주입의 나머지 부분이 작동하고 있기 때문에 단순해야 한다고 생각합니다.
코멘트에서 언급했듯이, 클라우드 구성을 가져오고 모든 요청에 따라 Spring 애플리케이션을 로드하는 오버헤드를 절약하기 위해 직접 주입하는 단순한 REST 호출을 고려하는 것이 좋습니다.
업데이트: Spring Boot 1.4.x의 경우 Spring Boot 플러그인에서 다음 구성을 제공해야 합니다.
<configuration>
<layout>MODULE</layout>
</configuration>
그렇지 않은 경우 기본적으로 플러그인의 새로운 동작은 모든 jar를 BOOT-INF 아래에 두는 것입니다. jar를 실행할 수 있고 부트스트랩 프로세스가 jar를 로드하도록 하는 것입니다.저는 여기서 마주친 상황에 대한 경고를 추가하는 과정에서 이것을 알게 되었습니다.자세한 내용은 https://github.com/spring-projects/spring-boot/issues/5465 을 참조하십시오.
언급URL : https://stackoverflow.com/questions/36081908/using-spring-boot-cloud-with-amazon-aws-lambda-does-not-inject-values
'programing' 카테고리의 다른 글
데이터베이스에 테이블이 있는지 확인 - PL SQL (0) | 2023.08.14 |
---|---|
Gitrepo에서 파일을 정리하지 못했습니다. 새 백업을 만들 수 없습니다. (0) | 2023.08.14 |
Git: 로컬 레포가 최신 상태인지 확인하는 방법은 무엇입니까? (0) | 2023.08.14 |
실행 중인 SetInterval 간격 변경 (0) | 2023.08.14 |
JQuery.handleError를 던지는 Ajax 업로드 플러그인을 찾을 수 없습니다. (0) | 2023.08.14 |