S3 = simple storage service 의 줄임말.
기능
1) 파일 관리 자동화
2) 버전 관리
S3를 이용해서 내 파일 안전하게 보관하기!
구성 요소
1) 버킷
예) 하나의 프로젝트
2) 폴더
3) 오브젝트 (파일)
build.gradle
< 주요 사용 라이브러리 >
spring-cloud-starter-aws
spring-boot-starter-web
lombok
Thymleaf
➕ S3UploaderService.java
[AWS] Springboot에 AWS S3 연동 (이미지, 동영상 업로드)에서 자세한 코드 참고 !
여기서 특이한 부분은 별다른 Configuration 코드 없이 AmazonS3Client 를 DI 받은것인데요. Spring Boot Cloud AWS를 사용하게 되면 S3 관련 Bean을 자동 생성해줍니다.
-> 그래서 AmazonS3, AmazonS3Client, ResourceLoader는 직접 설정할 필요 X
💡 basicDir, fileDir는 Profile별 저장될 파일 경로 !
로컬에서 테스트할 경우 {프로젝트 경로}/resource/static/files 경로에 파일을 저장할 수 있게 하기 위해 !
EC2에서 테스트할 경우 /home/ec2-user/files 에 저장이 될 것임.
➕ S3UploaderController.java
➕ AWS S3에 필요한 정보를 application.yml
에 추가
spring:
profiles:
group:
"local": "local, common"
"development": "development,common"
active: local
---
# 공통
spring:
config:
activate:
on-profile: "common"
servlet:
multipart:
max-file-size: 1GB
max-request-size: 1GB
# s3에 필요한 정보
cloud:
aws:
region:
static: ap-northeast-2
s3:
bucket: 1-source
stack:
auto: false // EC2에서 Spring Cloud 프로젝트를 실행시키면 기본으로 CloudFormation 구성을 시작함.
// 설정한 CloudFormation이 없으면 프로젝트 시작이 안되기 때문에 해당 내용을 사용하지 않도록 false를 등록합니다.
logging:
level:
com:
amazonaws:
util:
EC2MetadataUtils: error
---
# 로컬 환경
spring:
environment: "local"
config:
activate:
on-profile: "local"
file-dir: /src/main/resources/static/files/
---
# 배포 환경
spring:
environment: "development"
config:
activate:
on-profile: "development"
file-dir: /home/ec2-user/files/
➕ aws.yml
AWS User의 access-key와, secret-key는 탈취되는 문제를 예방하기 위해 추가.
그리고 .gitignore에 aws.yml 코드 추가하기 !
cloud:
aws:
credentials:
access-key: 발급받은 access-key
secret-key: 발급받은 secret-key
➕ S3uploaderApplication.java
에 아래 코드 추가 !
public static final String APPLICATION_LOCATIONS = "spring.config.location="
+ "classpath:application.yml,"
+ "classpath:aws.yml";
➕ 프로파일 별로 파일이 저장될 폴더를 만들기 위해 스프링 부트가 시작할 때 폴더를 만드는 코드 추가
/**
* @description 이미지, 영상 업로드할 폴더를 프로파일 별로 다른 경로에 생성한다.
*/
@PostConstruct
private void init() {
if (environment.equals("local")) {
String staticFolder = System.getProperty("user.dir") + "/src/main/resources/static";
mkdirResource(staticFolder);
String files = System.getProperty("user.dir") + fileDir;
mkdirResource(files);
} else if (environment.equals("development")) {
String filesFolder = "/var/www/html/files";
mkdirResource(filesFolder);
}
}
/**
* @param fileDir 생성을 위한 폴더명
* @description 주어진 경로에 폴더를 생성함
*/
private static void mkdirResource(String fileDir) {
File Folder = new File(fileDir);
// 해당 디렉토리가 없을경우 디렉토리를 생성합니다.
if (!Folder.exists()) {
try {
Folder.mkdir(); //폴더 생성합니다.
} catch (Exception e) {
e.getStackTrace();
}
}
}
➕ 마지막으로 VM options에 아래 코드 추가 !
Dcom.amazonaws.sdk.disableEc2Metadata=true
( EC2에서 실행해주기 위해 )