티스토리 뷰

AWS 관리자가 되면서 AWS 프로필을 왔다갔다할 일이 많이 생겼다.

(일단 나는 Windows, Powershell로 작업을 했다)

 

그래서 아래와 같이 프로필을 여러개를 두고 왔다갔다 했다.

 

 

그렇게 이런저런 AWS 관련 설정을 하고 나서(EKS 관련 설정을 할일이 있었다)

 

다시 개발작업으로 넘어오기 위해서 Intellij를 켜보니 아래와 같은 에러가 발생했다.

00:27:42.899 [main] WARN  c.a.i.InstanceMetadataServiceResourceFetcher - Fail to retrieve token 
com.amazonaws.SdkClientException: Failed to connect to service endpoint: 
....

Caused by: java.net.SocketException: Network is unreachable: no further information
....

00:27:42.905 [main] WARN  com.amazonaws.util.EC2MetadataUtils - Unable to retrieve the requested metadata (/latest/dynamic/instance-identity/document). Failed to connect to service endpoint: 
com.amazonaws.SdkClientException: Failed to connect to service endpoint
....

Invocation of init method failed; nested exception is com.amazonaws.SdkClientException: Unable to load region information from any provider in the chain
....

코드상에선 아무것도 만진게 없었고,

 

눈에 띄는건 토큰을 찾을 수 없다... 연결을 할 수 없다..

 

EC2 데이터를 찾을 수 없다.. region을 찾을 수 없다...

 

이정도 였다.

 

원인을 찾기엔 OpenLens를 설치하기 위해 환경 변수도 건드리고, AWS CLI도 설치하는 등 환경 설정을 건드리는 작업을 많이했다.

 

거기다 DB 접근제어까지 건드렸어서 어디가 원인인지 바로 알아채기가 어려웠다.

 

일단 눈에 띄는 것부터 확인을 시작했다.

 

EC2의 metadata를 찾을 수 없다에 대한 정보는 많이 찾아 볼 수 있지만, 대부분은 Spring cloud starter를 의존성을 넣었을 때 생기는 문제다.

 

이번에는 프로젝트의 의존성을 따로 추가하지 않았다.

 

검색을 해서 비슷한 익셉션이 발생했을 때의 문제가 전혀 해결되지 않았다.

(VM option 추가, static 옵션으로 EC2MetadataUtils를 제외시키기 등)

 

다음으로 알아본 건 region을 찾을 수 없다.

 

credential 파일에는 분명히 region이 있고, 삭제해도 똑같았기 때문에

 

현재 java aws sdk의 client가 이 파일(~/.aws/credential 파일)을 바라보지 않고 있다는 추론을 할 수 있었다.

 

그래서 찾아봤던게 아래의 AWS 자격 증명 제공자 체인에 관한 글이었다.

https://docs.aws.amazon.com/ko_kr/sdk-for-java/latest/developer-guide/credentials-chain.html

 

요약하면 AWS 자격 증명 제공자 체인은 아래와 같은 순서로 자격 증명 설정 순서를 검색한다.

1. Java의 시스템 속성
2. 환경 변수
3. 웹 아이덴티티 토큰 출처
4. 공유 credentials와 config 파일
5. AWS ECS 컨테이너 자격 증명
6. AWS EC2 인스턴스의 IAM 역할 제공 자격 증명

 

 

디폴트로 aws cli나 sdk를 사용한다면 1,2,3번은 설정할 일이 없기 때문에 4번으로 바로가게 된다.

 

이걸보니 알게된게 나는 프로필 변경을 위해서 2번 환경 변수를 건드렸었다는 걸 떠올렸다.

 

Powershell에서 환경 변수를 검색

AWS_PROFILE이 강제로 설정되어 있었다.

 

엥 AWS_PROFILE이 있네? 일반적인 시스템 환경변수 설정은 휘발성이 아닌가? 생각했지만, 강제로 등록하는 명령어를 사용했었다.

 

아래 한줄이 만악의 근원이었다.

setx AWS_PROFILE prod

성공: 지정한 값을 저장했습니다.

 

이 명령어를 입력하면 환경변수에 AWS PROFILE이 영구적으로 추가된다.

 

이 환경변수를 삭제해주자.

 

불행히도 windows에서는 환경변수를 영구 삭제하는 shell 명령어가 없으니 직접 설정으로 가서 삭제해야한다.

 

시스템 환경 변수 편집 검색

 

AWS_PROFILE 삭제

 

 

프로필을 삭제하니 정상적으로 프로젝트가 실행이 된다.

 

처음에는 공식 문서를 보고도 환경 변수 문제인지 아닌지 긴가민가했다.

 

AWS 공식 문서의 환경 변수 설정에 대한 내용에는 프로필에 대한 내용이 없었기 때문이다.  

환경 변수 SDK는 다음을 사용합니다. EnvironmentVariableCredentialsProvider클래스에서 임시 자격 증명을 로드하는 데 사용됩니다. AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY, 그리고 AWS_SESSION_TOKEN환경 변수.

 

그래도 가장 처음 바라보니까 Credential 파일의 프로필을 사용하려면 환경 변수를 꼭 확인하고 제거해주자.

 

마치며

위에서도 이야기 했지만, 환경 변수를 직접 건드리지 않으면

 

aws는 기본 자격 증명을 .aws/credential 경로에 존재하는 프로필을 기본으로 보기 때문에 별 문제가 없다.

 

shell에서 명령어를 쓸 때는 당연한 이야기지만 무슨 일이 일어날지 잘 알고 명령어를 입력해야할 것 같다.

 

이 단순한 문제로 거의 반나절을 소비했다.

 

비슷한 케이스로 다른 이슈가 발생했어서 이제는 그 문제를 해결하러 가야한다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함