일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
Tags
- 우테코
- 세션
- 우아한세미나
- Level2
- JPA
- CircuitBreaker
- 코드리뷰
- 프로그래머스
- 프리코스
- 미션
- 의존성
- 레벨2
- mock
- Spring Batch
- 우아한테크코스
- MSA
- 백준
- Paging
- AWS
- 트랜잭션
- 자바
- HTTP
- AOP
- REDIS
- yml
- 스프링부트
- 스프링 부트
- Docker
- 서블릿
- JUnit5
Archives
- Today
- Total
늘
[AWS] springboot+gradle + S3를 이용해 이미지 올리기 본문
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