본문 바로가기
Spring/Spring Boot

Spring Boot, EC2에 배포했을때, The requested metadata is not found 오류 해결과정

by 졸린개발자 2022. 4. 28.

안녕하세요 졸린개발자입니다.

 

오늘은 AWS EC2 Instance에 Sping Application을 배포할때

com.amazonaws.SdkClientException: The requested metadata is not found

를 해결했던 과정에 대해 포스팅해보겠습니다.

 

Ec2에서 제대로 배포가 되는지 테스트 도중 아래와 같은 오류를 만났습니다. (클릭하면 크게보입니다)

<그림1 오류발생>

오류 코드를 자세히 읽어보니

http://196.254.169.254/latest/user-data/에 접근하는것이 실패한것 같다는 추측을 할 수 있겠네요.

 

저 ip는 대체 어떤 ip이길래 접근하는건지 궁금하군요.

저 ip는 특별한 ip인걸까요?

 

 

대체 196.254.169.254는 어떤 ip인가?

 

그럼 Ec2에서 직접 이 url로 요청을 날려봅시다.

<그림3 user-data조회>

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)

https://stackoverflow.com/questions/56987939/unable-to-retrieve-the-requested-metadata-latest-meta-data-public-hostname

위의 링크로 따라가면 사용자 정보를 가져오는 Bean을 등록하지 않는 방법으로 해결하고 있습니다.

 

저는 이 방법은 우회하는것 같다고 생각이 드네요. 

사용자 정보를 가져와서 언젠가 쓸일이 있을지도 모르니, 이런 해결방법은 피해야할 것 같다는 판단을 하였습니다.

 

또한 이 Bean을 등록하지 않아 어떤 side effect가 발생할지 알 수 없으니

다른 방법을 찾아봅시다.

 

 

사용자 데이터를 등록하여 해결하는 방법(방법 2/2)

 

사용자 데이터를 조회하는 url로 요청을 날렸을 때 404에러가 뜬 이유는,

ec2에 사용자 데이터가 등록되지 않았기 때문입니다.

 

그럼 사용자 데이터를 조회할 수 잇게 등록하면 되겠네요.

 

https://velog.io/@_woogie/EC2%EC%8B%9C%EC%9E%91%ED%95%A0-%EB%95%8C-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%9E%90%EB%8F%99%EC%8B%A4%ED%96%89%ED%95%98%EC%97%AC-%EC%84%9C%EB%B2%84-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0feat.-pm2

 

사용자 데이터를 등록하는 방법이 담긴 좋은 블로그입니다

저도 이 블로그를 따라서 사용자 데이터를 등록했습니다

 

이제 사용자 데이터를 등록했으니 아까 오류가 났던 url에 다시 조회해 봅시다

 

<그림 4 user-data조회>

 

그림 3에서 똑같은 url로 조회했을 때 오류가 났던것 기억하시나요?

이번에는 제대로 조회가 되고 있습니다.

 

그럼 다시 배포하여 오류가 생기는지 확인해봅시다.

 

<그림5 정상>

해결되었군요.

 

 

결론

오늘은 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버전이 최신버전이기 때문에,

많은 분들이 이러한 문제를 겪으실 것 같습니다.