AWS S3

이가현·2022년 11월 24일
0

S3 = simple storage service 의 줄임말.

기능
1) 파일 관리 자동화
2) 버전 관리

S3를 이용해서 내 파일 안전하게 보관하기!

구성 요소
1) 버킷
예) 하나의 프로젝트

2) 폴더

3) 오브젝트 (파일)

1. 버킷 생성

2. AWS IAM 생성

3. 로컬 환경에서 이미지, 동영상 업로드하기

build.gradle
< 주요 사용 라이브러리 >

spring-cloud-starter-aws
spring-boot-starter-web
lombok
Thymleaf

S3UploaderService.java

  • S3에 정적 파일을 올리는 기능

[AWS] Springboot에 AWS S3 연동 (이미지, 동영상 업로드)에서 자세한 코드 참고 !

  • MultipartFile 전달받음.
  • S3에 전달할 수 있도록 MultiPartFile을 File로 전환 및 저장. (S3에 Multipartfile 타입은 전송이 안되기 때문)
  • 전환된 File을 S3에 public 읽기 권한으로 업로드. (외부에서 정적 파일을 읽을 수 있도록 하기 위해)
  • 로컬에 생성된 File 삭제. (Multipartfile -> File로 전환됨)
  • 업로드된 파일의 S3 URL 주소를 반환

여기서 특이한 부분은 별다른 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

  • 4가지 기능
    1) image-upload 웹 페이지 반환
    2) video-upload 웹 페이지 반환
    3) data로 넘어오는 이미지 MultipartFile을 S3UploaderService로 전달
    4) data로 넘어오는 동영상 MultipartFile을 S3UploaderService로 전달

➕ 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에서 실행해주기 위해 )

0개의 댓글