본문 바로가기
DevOps/AWS

Spring) AWS S3 연동 후 액세스키 파일화 작업 - Boot (X)

by 어렵다어려웡 2021. 4. 13.

개발환경 - Spring , MyBatis, Maven

 

우선 해당 글은 스프링 부트가 아닌 스프링환경에서 코드를 포스팅했습니다.

 

요즘 스프링의 경우 boot를 많이 쓴다

boot와 S3를 연동하는 경우 예제가 많이 있고 S3의 경우 보안키인 액세스키를 사용할 때

특정 의존성이 application.yum 파일의 내용을 읽어서 자동으로 연동시켜주는 코드가 있는데

 

나의 경우 Boot를 사용하지않고 프로젝트를 만들고 있기떄문에

해당 액세스 키를 어떻게 파일화시켜서 넘길지에 대한 고민이 많았다.

그래야 스프링부트에서 하는 것처럼 .gitignore 파일을 만들어서 숨기든지 할 수 있기 떄문이다.

 

stackoverflow에서 답변을 얻어서 일단 해결을 했는데 우선 그 해결방안부터 얘기하고자함,

해당 출처 - stackoverflow.com/questions/45831555/aws-s3-java-file-upload-without-access-keys-credentials

 


1. 이전 코드

@Component
@Getter
@Setter
public class AWSs3 {

	private AmazonS3 s3Client;
	
	private final String accesskey = "";
	private final String secretkey = "";

	public AWSs3() {
		try{
            BasicAWSCredentials creds = new BasicAWSCredentials(accesskey, secretkey);
            this.s3Client = AmazonS3ClientBuilder
                    .standard()
                    .withCredentials(new AWSStaticCredentialsProvider(creds))
                    .withRegion("ap-northeast-2")
                    .build();
        }catch(Exception e){
            System.out.println(e);
            e.printStackTrace();
        }
	}
}

 

우선 이전 코드부터 보여줘야 바뀐 곳을 알려줄 수 있으니 먼저 올린다..

기존에 테스트를 할때는 직접 클래스를 만들어서 해당 클래스를 통해 서비스계층에서

업로드를 하게끔 했었다. 

 

보면 직접적으로 accessKey와 secretKey가 나타나기 때문에 노출위험성이 너무 크다.

 

2. 바꾼 코드

public class AWSs3 {

	private AmazonS3 s3Client;

	public AWSs3() {
		try{
            this.s3Client = AmazonS3ClientBuilder
                    .standard()
                    .withCredentials(new ClasspathPropertiesFileCredentialsProvider())
                    .withRegion("ap-northeast-2")
                    .build();
        }catch(Exception e){
            System.out.println(e);
            e.printStackTrace();
        }
	}
}

 

바뀐부분은 .withCredentials에 넘겨준 인자부분이다.

스택오버플로우에서 도움을 받아서 사용한것이긴하다. 

 

* ClasspathPropertiesFileCredentialsProvider()

해당 생성자가 프로젝트의 classpath에 있는 AwsCredentials.properties 파일을 읽어서

파일에 적힌 accessKey와 secretKey의 값을 가져와서 자동으로 사용한다.

 

이처럼 프로젝트에 AwsCredentials.properties 라는 파일명으로 파일을 하나 생성해서 

해당 파일에 아래와 같이 적으면 된다.


accessKey= 액세스 키
secretKey= 시크릿 키

스택오버플로우에서 해당 해결법을 작성한 사람이 말하기를

Java 코드로 작성한 서비스에서는 잘 작동한다고 한다.

 

Boot 환경이 아닌 스프링환경에서 S3 업로드를 이용할 경우 해당 코드로 이용해보면 될 것같다.

 

이외에도 홈경로에서 ".aws/credential" 의 경로에서 파일을 찾아 연동시키는 등의

여러가지 방법이 있다고 한다.