[AWS] springboot+gradle + S3를 이용해 이미지 올리기 본문

AWS

[AWS] springboot+gradle + S3를 이용해 이미지 올리기

giron 2021. 8. 9. 15:22
728x90

스프링부트 gradle, java11, 을 사용했습니다.

 

우선 버킷 이름을 설정하고, 모든 퍼블릭 엑세스 차단을 해제해 주고 현재 설정을 확인했다고 체크해줍니다.

만든 버킷에 들어간 후, 권한으로 한번 더 들어갑니다. 그 후, 버킷 정책의 편집을 눌러줍니다.

버킷 ARN을 복사해주고  정책 생성기를 눌러줍니다.

 

  • Principal : *
  • Action : GetObject, PutObject를 추가
  • ARN: 복사했던 {ARN}/* 입력

그 후, Add Statement -> Generate Policy를 하면

정책 내용을 복사해줍니다. 그리고 나와서 정책에 복붙을 해줍니다. 그리고 변경 사항 저장

완 료

 

[IAM 사용자 권한 추가]

S3에 접근하기 위해서는 IAM 사용자에게 S3 접근 권한을 주고, 그 사용자의 액세스 키, 비밀 엑세스 키를 사용해야 합니다.

이후 다음을 눌러가면서 만들어 줍니다.

.csv 파일을 꼭 가지고 있어줍니다.(다운로드해주세요) 그 후,

스프링 부트에서 의존성을 추가해줍니다.

aws.yml, AmazonS3Config, S3Uploader 3개의 파일을 만들어 줍니다.

  • asw.yml

  • AmazonS3Config

S3Uploader (코드가 길어서 코드블럭으로 넣겠습니다. 길어도 다 간단한 기능이어서 금방 이해하실겁니다!)

package com.springshop.naverapi.aws;

import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.amazonaws.services.s3.model.PutObjectRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Optional;
import java.util.UUID;

@Slf4j
@Component
@RequiredArgsConstructor
public class S3Uploader {

    private final AmazonS3Client amazonS3Client;

    @Value("${cloud.aws.s3.bucket}")
    public String bucket;

    public String upload(MultipartFile multipartFile, String dirName) throws IOException{
        File uploadFile = convert(multipartFile).orElseThrow(() -> new IllegalArgumentException("파일 전환 실패"));

        return upload(uploadFile, dirName);
    }
    // S3로 파일 업로드하기
    private String upload(File uploadFile, String dirName) {
        String fileName = dirName + "/" + UUID.randomUUID() + uploadFile.getName();   // S3에 저장된 파일 이름
        String uploadImageUrl = putS3(uploadFile, fileName); // s3로 업로드
        removeNewFile(uploadFile);
        return uploadImageUrl;
    }

    // S3로 업로드
    private String putS3(File uploadFile, String fileName) {
        amazonS3Client.putObject(new PutObjectRequest(bucket, fileName, uploadFile).withCannedAcl(CannedAccessControlList.PublicRead));
        return amazonS3Client.getUrl(bucket, fileName).toString();
    }

    // 로컬에 저장된 이미지 지우기
    private void removeNewFile(File targetFile) {
        if (targetFile.delete()) {
            log.info("File delete success");
            return;
        }
        log.info("File delete fail");
    }

    private Optional<File> convert(MultipartFile multipartFile) throws IOException{
        File convertFile = new File(System.getProperty("user.dir") + "/" + multipartFile.getOriginalFilename());
        // 바로 위에서 지정한 경로에 File이 생성됨 (경로가 잘못되었다면 생성 불가능)
        if (convertFile.createNewFile()) {
            try (FileOutputStream fos = new FileOutputStream(convertFile)) { // FileOutputStream 데이터를 파일에 바이트 스트림으로 저장하기 위함
                fos.write(multipartFile.getBytes());
            }
            return Optional.of(convertFile);
        }

        return Optional.empty();

    }
}

 

가벼운 컨트롤러 만들어줍니다. 그리고 포스트맨에서 테스트 하면 성공

에러

위 처럼 용량 초과가 뜨면 application.yml 파일에서

위와 같이 최대 용량을 설정해준다.

제대로 되었는지 AWS S3에서 확인 해봅시다.

일단 원하는대로 static 파일이 만들어 졌고, 들어가 보면 잘 만들어져 있다. 

 

Reference

  • https://devlog-wjdrbs96.tistory.com/323?category=882690
728x90

'AWS' 카테고리의 다른 글

[AWS] springboot+ AutoScaling + CodeDeploy 배포 자동화 1  (0) 2021.08.15
[AWS]Docker & CodeDeploy & Jenkins 배포 자동화2  (0) 2021.08.13
AWS - EC2, S3, IAM 등 간단 요약  (0) 2021.05.16
AWS 스터디 - 3  (0) 2021.05.13
AWS 스터디 - 2  (0) 2021.05.10
Comments