프로젝트를 진행하던 중, 파일 관리를 위해 AWS의 S3 서버를 스프링 부트와 연동해서 적용했습니다. 그런데 로컬에서 스프링 서버를 실행시켜보니 다음과 같은 오류가 발생했습니다.
오류 내용
com.amazonaws.SdkClientException: Failed to connect to service endpoint
Caused by: java.net.SocketException: Network is unreachable: connect
오류 원인
AWS-SDK 에러가 발생하는 이유는 build.gradle에 spring-cloud-starter-aws 의존성을 주입시, 로컬 환경은 aws 환경이 아니기 때문에 나는 에러입니다.
해결 방법
해결 방법은 다음 2가지가 있다고 한다.
- 로그 자체를 보이지 않게 설정
- amazon EC2가 아닌 환경의 시스템 환경변수를 만들어 주는 것
첫 번째 방법 같은 경우는 그냥 로그가 보이지 않게 설정하는 것 뿐, 근본적인 해결은 되지 않는다고 합니다. 따라서 2번 방법을 적용해 보겠습니다.
해결
저는 인텔리제이를 사용하기 때문에 다음 설정에 들어가서 시스템 환경 변수를 지정해주도록 하겠습니다.
[run] - [configuration] - [vm option 부분에 아래 문장 추가]
-Dcom.amazonaws.sdk.disableEc2Metadata=true
이렇게 설정해주면, 에러의 내용이 변경됩니다.
com.amazonaws.AmazonClientException: EC2 Instance Metadata Service is disabled
- 해당 에러는 EC2 메타데이터를 제외하고 실행한다는 의미로, 애플리케이션 실행 시 딜레이가 없어졌다는 의미입니다.
- 임의의 옵션을 설정하여 첫 에러를 해결했지만 EC2의 메타데이터는 여전히 사용하지 않기 때문에 발생한 것입니다.
- 해당 에러는 엄밀히 말하자면 에러가 아니라 예외 메세지라고 합니다.
[ solution ]
: application.yml에 예외 메세지가 발생되지 않는 설정값을 추가해주어 해결해주었습니다.
logging:
level:
com:
amazonaws:
util:
EC2MetadataUtils: error