목표
- amazon S3를 사용하는 방법에 대해 알아보자
- Spring Boot에 S3를 연결해 보자
S3 Bucket 생성하기
amazon S3(amazon Simple Storage Service)
S3는 amazon에서 제공하는 클라우드 스토리지 시스템이다. S3에서는 obejct와 bucket을 통해 서비스를 제공하는데 그 정의는 아래와 같다.
object: 우리가 저장할 파일
bucket: 저장할 파일을 담을 root directory 폴더
이제 bucket을 생성해보자.
- AWS 로그인
- AWS management console -> service -> storage -> s3 선택
- 버킷 만들기 선택
버킷 이름을 작성하고 AWS 리전은 본인과 가장 가까운 곳으로 지정해준다. AWS 리전은 실제 스토리지 기기가 있는 곳이므로 가까울 수록 좋다.
퍼블릭 엑세스는 외부에서 파일 시스템에 접근하는 것을 허용한다는 것인데 나는 웹서비스를 만들것이디 때문에 허용으로 설정했다. AWS에서 제공하는 대부분의 서비스는 생성 후 옵션 수정이 가능하기 때문에 나머지는 기본 설정 그대로 두고 bucket을 생성했다.
bucket이 잘 만들어졌다. 이제 루트폴더로 들어가서 하위 폴더도 생성하고 파일도 업로드하면 된다.
S3 액세스 키 발급
외부에서 S3에 접근하기 위해서는 I AM 사용자를 등록하고 액세스 키를 발급받아야한다.
액세스 키를 발급받기 위해서는 먼저 AWS management console 검색창에 I AM을 검색한 후 목록에서 사용자 항목을 선택한 후 사용자 추가를 선택한다.
사용자 이름을 설정한다. 나는 프로젝트 이름이랑 bucket이름을 섞어서 설정했다.
직접 정책 연결을 선택하고 권한 정책으로 AmazonS3FullAccess를 선택하고 사용자 생성을 마무리한다.
이후, 사용자 이름을 클릭한 후 보안 자격 증명으로 들어가면 액세스 키를 만들 수 있다. 액세스키와 시크릿키를 발급해주는데 이는 다시 확인할 수 없으니 .csv 파일을 다운로드 받거나 어디에 잘 저장해두자.
Spring Boot S3 연결하기
우선, gradle에 dependency를 넣어주고 application 파일에 s3설정을 추가한다.
S3를 사용하기 위해서는 S3 Configuration을 등록해야한다.
@Configuration
public class S3Config {
@Value("${cloud.aws.s3.credentials.accessKey}")
private String accessKey;
@Value("${cloud.aws.s3.credentials.secretKey}")
private String secretKey;
@Value("${cloud.aws.s3.region.static}")
private String region;
@Bean
public AmazonS3Client amazonS3Client() {
BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
return (AmazonS3Client) AmazonS3ClientBuilder.standard()
.withRegion(region)
.withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
.build();
}
}
이제 어디서든 AmazonS3Client 인스턴스를 생성해서 S3에 접근할 수 있다. 가장 기본적인 동작은 아래와 같다.
putObject() : S3에 파일 업로드
getObject() : S3로부터 파일 다운로드