-
[Spring boot] AWS S3 를 이용한 파일 업로드스프링 2023. 2. 16. 17:27
개인 프로젝트를 하며 이미지 서버로 사용하기 위해 AWS S3 버킷을 만들고 Spring 을 연동하는 방법을 정리해보았다.
[1] AWS S3 개요
AWS S3 란?
S3는 Simple Storage Service 의 약자로 주로 파일 서버로 사용된다.
왜 S3를 사용할까?
확장성(Scalability)
파일 서버는 트래픽이 증가함에 따라 서버 인프라 및 용량 계획을 변경해야 되는데, S3가 확장 및 성능 부분을 대신 처리해준다.
내구성(Durability)
여러 영역에 여러 데이터 복사본을 저장하므로 한 영역이 다운되더라도 데이터를 사용할 수 있고, 복구가 가능하다.
S3 무료 사용하기
Amazon S3는 계정 가입일을 기준을 12개월 동안 사용이 가능하며, 제한 범위는 다음과 같다.
S3 관련 용어 정리
객체(object)
파일과 파일정보로 구성된 저장단위로 그냥 파일이라 생각하면 된다.
버킷(Bucket)
다수의 객체를 관리하는 컨테이너로 파일시스템이라 보면된다.
[2] AWS S3 생성하기
1) 버킷 생성
1. AWS Console > S3 > 버킷 > 버킷 만들기 클릭
2. 버킷 이름을 입력하고 엑세스 차단 설정을 해제한다.
(애플리케이션은 파일 조작 권한을 갖게하고, 권한 변경 필요 시에는 애플리케이션에 요청을 보내는 클라이언트의 파일 조작 권한은 스프링 시큐리티 권한 설정으로 하면 될 거 같다.)
2) 사용자 생성
1. AWS console > IAM > 엑세스 관리 > 사용자 > 사용자 추가 클릭
S3에 접근하기 위해서는 IAM 사용자에게 S3 접근 권한을 주고, 엑세스 키를 만들어 액세스 키, 비밀 엑세스 키를 접근해야 한다.
2. 사용자 이름을 입력하고 다음을 클릭한다.
3. 직접 정책 연결을 클릭하고, AmozonS3FullAccess 를 선택하고 다음을 클릭한다.
4. 사용자 생성을 클릭하면 사용자가 생성된다.
3) 엑세스 키 생성
외부에서 접속할 수 있도록 사용자의 엑세스 키를 만들어 주어야 한다.
1. AWS Console > IAM > 엑세스 관리자 > 사용자 > 생성한 사용자 이름 클릭 > 보안 자격 증명 > 엑세스 키 만들기 클릭
2. 아무거나 클릭하고 다음을 클릭한다.
(클릭 하면 엑세스 키 사용사례와 대안을 하단에 띄워주는 기능만 하기때문에 뭘 골라도 상관없다.)
3. 태그를 입력하고 엑세스 키 만들기를 클릭한다.
4. 엑세스 키 생성 완료 화면에서 생성된 공개키와 비밀키를 확인할 수 있다.
(생성 완료 화면이 아니면 비밀 엑세스 키를 볼 수 없기 때문에 .csv 파일로 받아두는 것이 좋다)
[2] 스프링 연동하기
1) build.gradle에 의존성 추가
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
2) application.yml 에 설정 정보 추가
cloud: aws: s3: bucket: <버킷이름> stack.auto: false region.static: ap-northeast-2 credentials: accessKey: <발급받은 accessKey> secretKey: <발급받은 secretKey>
accessKey 와 같은 보안 설정 정보는 깃허브에 노출되면 해킹되어 과금 위험이 있으므로 별도의 설정 파일로 분리하고 깃허브에 올리면 안된다. 설정 파일에 있는 정보는 스프링이 지원하는 @Value 어노테이션을 사용하여 불러올 수 있다.
cloud.aws.stack.auto=false
EC2에서 Spring Cloud 프로젝트를 실행시키면 기본으로 CloudFormation 구성을 시작하기 때문에 설정한 CloudFormation이 없으면 프로젝트 실행이 되지 않는다. 해당 기능을 사용하지 않도록 false로 설정.
cloud.aws.region.static:ap-northeast-2
지역을 한국으로 고정한다.
3) 스프링 설정 추가
S3Config.java
@Configuration public class S3Config { @Value("${cloud.aws.credentials.access-key}") private String accessKey; @Value("${cloud.aws.credentials.secret-key}") private String secretKey; @Value("${cloud.aws.region.static}") private String region; @Bean public AmazonS3Client amazonS3Client() { BasicAWSCredentialsawsCredentials= new BasicAWSCredentials(accessKey, secretKey); return (AmazonS3Client)AmazonS3ClientBuilder.standard() .withRegion(region) .withCredentials(new AWSStaticCredentialsProvider(awsCredentials)) .build(); } }
4) upload Controller 생성
@RestController @RequestMapping("/upload") @RequiredArgsConstructor public class FileUploadController { private final AmazonS3Client amazonS3Client; @Value("${cloud.aws.s3.bucket}") private String bucket; @PostMapping public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFilefile) { try { StringfileName=file.getOriginalFilename(); StringfileUrl= "https://" + bucket + "/test" +fileName; ObjectMetadatametadata= new ObjectMetadata(); metadata.setContentType(file.getContentType()); metadata.setContentLength(file.getSize()); amazonS3Client.putObject(bucket,fileName,file.getInputStream(),metadata); return ResponseEntity.ok(fileUrl); } catch (IOExceptione) { e.printStackTrace(); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } }
[3] Postman API Test
multipart 데이터를 전송해야 하므로 Body 유형을 form-data으로 선택하고, KEY의 속성을 File을 선택해준다.
정상적으로 보내졌다면 200 OK 응답이 올 것이고 AWS S3 콘솔에서 파일이 들어온 것을 확인할 수 있다.
'스프링' 카테고리의 다른 글
Spring JPA Auditing 사용방법과 주의사항 (0) 2023.01.28