안녕하세요 졸린개발자입니다.
오늘은 AWS EC2 Instance에 Sping Application을 배포할때
com.amazonaws.SdkClientException: The requested metadata is not found
를 해결했던 과정에 대해 포스팅해보겠습니다.
Ec2에서 제대로 배포가 되는지 테스트 도중 아래와 같은 오류를 만났습니다. (클릭하면 크게보입니다)
오류 코드를 자세히 읽어보니
http://196.254.169.254/latest/user-data/에 접근하는것이 실패한것 같다는 추측을 할 수 있겠네요.
저 ip는 대체 어떤 ip이길래 접근하는건지 궁금하군요.
저 ip는 특별한 ip인걸까요?
대체 196.254.169.254는 어떤 ip인가?
그럼 Ec2에서 직접 이 url로 요청을 날려봅시다.
curl http://169.254.169.254/latest/user-data/ 으로 조회해 본 결과 404 응답이 뜨는군요.
그럼 이 URL은 뭐고, 어떤 정보가 들어있는지 알아봅시다.
aws ec2공식문서에서 답을 찾았습니다.
https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/ec2-instance-metadata.html
EC2에서는 EC2내부에서 자신에 대한 정보를 조회할 수 있게 해줍니다.
자신의 id, 어디에서 실행되는지 등등의 자신의 정보를 말이죠.
자신의 정보는 2가지의 URL로 나눠서 조회할 수 있습니다.
1.메타데이터조회 2.사용자 정보 조회
메타데이터 조회는 Ec2 자신의 메타데이터입니다.
http://169.254.169.254/latest/meta-data/ 로 조회할 수 있고,
ec2의 정보를 조회할 수 있습니다.
사용자 정보는 이 Ec2 인스턴스가 실행될때 자동으로 실행되는 스크립트 정보입니다.
http://169.254.169.254/latest/user-data/ 로 조회할 수 있습니다.
오류는 이 사용자 정보가 조회가 안되서 발생했던 거군요
그럼 왜 이런 오류가 발생할까요?
spring boot cloud AWS에서는 자신이 속한 EC2의 정보에 접근하도록 시도합니다.
그 정보 중에 하나가 user-data인 것입니다.
AWS의 정보를 따로 파일에 지정해 줄 수 있겠지만,
클라우드 특성상, ec2 인스턴스를 스케일아웃, 스케일인 하기위해 언제든지 내려지거나 올려질 수 있습니다.
그래서 일일이 파일에 이러한 정보를 다 기입하면서 개발/운영할 수는 없으니,
ec2의 정보를 스스로 조회할 수 있게 해준 겁니다.
하지만 이번에는 이러한 정보가 없으니 에러를 표시합니다.
그럼 원인을 찾았으니, 해결해 봅시다.
저는 방법 2가지중, 2번째 방법으로 해결했습니다.
사용자 정보를 가져오는 Bean을 등록하지 않는 방법 (방법 1/2)
위의 링크로 따라가면 사용자 정보를 가져오는 Bean을 등록하지 않는 방법으로 해결하고 있습니다.
저는 이 방법은 우회하는것 같다고 생각이 드네요.
사용자 정보를 가져와서 언젠가 쓸일이 있을지도 모르니, 이런 해결방법은 피해야할 것 같다는 판단을 하였습니다.
또한 이 Bean을 등록하지 않아 어떤 side effect가 발생할지 알 수 없으니
다른 방법을 찾아봅시다.
사용자 데이터를 등록하여 해결하는 방법(방법 2/2)
사용자 데이터를 조회하는 url로 요청을 날렸을 때 404에러가 뜬 이유는,
ec2에 사용자 데이터가 등록되지 않았기 때문입니다.
그럼 사용자 데이터를 조회할 수 잇게 등록하면 되겠네요.
사용자 데이터를 등록하는 방법이 담긴 좋은 블로그입니다
저도 이 블로그를 따라서 사용자 데이터를 등록했습니다
이제 사용자 데이터를 등록했으니 아까 오류가 났던 url에 다시 조회해 봅시다
그림 3에서 똑같은 url로 조회했을 때 오류가 났던것 기억하시나요?
이번에는 제대로 조회가 되고 있습니다.
그럼 다시 배포하여 오류가 생기는지 확인해봅시다.
해결되었군요.
결론
오늘은 com.amazonaws.SdkClientException의 해결과정에 대해 설명해 보았습니다.
해결하는 방법이 2가지가 존재하고
각각의 해결방법을 찾아나가는 과정이 꽤 힘들었네요.
특히 ec2에서 자신의 정보를 조회할 수 있다는 것을 모르고
저 오류를 처음 접하였는데, 왜 저런 오류가 발생했는지 감이 전혀 안잡혔습니다.
어쨌거나 오류를 오늘도 한건 해결했네요
기분좋게 하루를 마칠 수 있을 것 같습니다.
그럼 긴글 읽어주셔서 감사하고, 좋은 하루 보내세요.
추가
Spring Cloud AWS 2.3.0버전에서는 유저 정보를 가져오는 것이 default가 false가 되었고,
cloud.aws.instance.data.enabled 를 true로 줘서 유저정보를 가져오게 만들 수 있다고 하네요.
https://github.com/spring-attic/spring-cloud-aws/issues/556
즉, 2.3.0버전을 쓰면 위의 문제가 발생하지 않습니다.
그러나 글을쓰고 있는 2022-4-28기준으로
Spring cloud starter aws에서는 2.2.6버전이 최신버전이기 때문에,
많은 분들이 이러한 문제를 겪으실 것 같습니다.
'Spring > Spring Boot' 카테고리의 다른 글
@SpringBootApplication에는 어떤 Annotation으로 이루어져 있을까요? (0) | 2022.05.17 |
---|---|
Spring에서 생기는 Failed to connect to service endpoint 해결과정 (0) | 2022.05.14 |
SpringBoot에서 Web server를 끄고 실행하는법 (0) | 2022.04.17 |