S3 와의 접근을 위해 region 을 포함한 여러 설정값들을 지정하였다. 하지만 다음과 같이 ‘region’ 을 찾을 수 없다는 에러가 발생하였다.

Unable to load region from system settings.

일단 에러가 발생하는 지점을 디버깅해보았다.

S3AutoConfiguration.java

Untitled

S3AutoConfiguration 은 S3Client 가 필요한 설정값들을 설정하도록 도와주는 객체이다. 파라미터로 들어오는 설정 객체들은 총 4가지 였고, 각각의 역할은 다음과 같다.

내가 설정한 region 은 S3Properties 에 할당되어 있었지만, 실제로 region 을 설정하는 객체는 AwsRegionProviderChain 였다.

Untitled

AwsRegionProviderChain.java

Untitled

AwsRegionProviderChain 은 내부적으로 AwsRegionProvider 객체를 사용하고 있었다. 즉, 내가 설정한 region 값이 할당은 되었지만 올바른 객체에게 할당된 것은 아니었다. 왜 region 을 관리하는 객체가 두 개가 있을까? region 말고도 4개의 설정 객체들이 관리하는 값들이 중복되어 있었다. 객체의 이름만 보고 추측을 해보았을 때에는 가장 큰 범위로 AWS 에 대한 설정을 지정할 수 있고, 하위의 S3 의 정보를 별도로 지정할 수 있는듯 하였다. 여기에서 나는 S3 의 값을 지정하였지만 이는 선택적인 값일 뿐이었고, 필수인 AWS 의 설정값이 지정되어 있지 않아 에러를 발생시킨듯 하였다. 따라서 Spring Cloud AWS 의 구조에 대해서 찾아보았다.

Untitled

Spring Cloud AWS 와 S3 만 보았을 때의 구조는 다음과 같다.

Application - Spring Cloud AWS Core - S3

Spring Cloud AWS Core 에서 AWS 에 관련된 전반적인 기능들을 담당하고, 각 하위 서버들을 관리한다.

Spring Cloud AWS 공식문서에 따르면 Spring Cloud AWS Core 의 region 을 설정하는 방식이 있고, S3 의 region 을 설정하는 방식이 따로 있다.