home > devops > aws > [aws] s3를 통해 파일 및 이미지 업로드 해보기 (feat. spring boot)

[aws] s3를 통해 파일 및 이미지 업로드 해보기 (feat. spring boot)
devops aws s3

intro : s3를 통해 파일 및 이미지 업로드 하는 방법에 대해서 알아보자.

S3란?

요약하자면 AWS에서 제공하는 파일 저장 서비스이다.

S3를 왜 사용하는걸까 ?

우린 사진이나 동영상과 같은 파일들을 내 휴대폰에 저장하기도 하지만 구글 드라이브나 iCloud에 저장하기도 한다. 내 휴대폰에 저장하기에는 용량이 너무 커서 다른 공간에 따로 저장하고 싶기도하고, 조금만 내 휴대폰에 이미지나 파일들이 쌓이기 시작하면 지저분해 진다. 우리가 이렇게 실생활에서 겪는 고충과 같이 백엔드 서버에 이미지를 저장할 수도 있지만, 이미지가 너무 많이 쌓이다보면 용량을 너무 많이 차지하게 된다. 그래서 S3를 이용하여 별도의 공간을 통해 이미지와 파일을 관리한다.

S3 생성하기

버킷이란?

AWS S3에서의 버킷이라는 단어는 레포지토리 즉 저장소를 뜻한다. 통상적으로 하나의 저장소를 버킷이라고 부른다.

객체란?

ASW S3에서 업로드한 파일을 보고 S3에서는 파일이라고 하지 않고, 객체라고 부른다. 즉 객체는 S3에 업로드 된 파일을 말한다.

Step1. S3 버킷 생성하기

버킷을 만들기 위해서 검색창에 S3라고 검색하고 다음과 같은 페이지로 이동하고 버킷 만들기 버튼을 클릭한다.

image1

(버킷 만들기 버튼 클릭)

버킷 생성 페이지에서 가장 먼저 일반 구성 영역의 버킷 이름을 api-static-files-test로 지정해주었다. 정적인 파일을 올린다는 이름이다. S3 버킷 이름은 AWS 내 전역적으로 고유하기에 유니크한 이름을 설정할 수 있도록 해야한다.

image2

(식별할수만 있으면 되기에 원하는 이름을 작성하여도 된다.)

다음으로 이 버킷의 퍼블릭 액세스 차단 설정 영역으로 이동한다. 모든 퍼블릭 액세스 차단이 기본적으로 체크가 되어 있는데 아래 이미지처럼 언체크로 변경하고, 현재 설정으로 인해 이 버킷과 그 안에 포함된 객체가 퍼블릭 상태가 될 수 있음을 알고 있습니다.에 체크한다.

image3

(퍼블릭으로 열어야지 외부에서 접근하여 다운로드 받을 수 있다.)

다음으로 다른 영역은 기본값에서 변경없이 아래로 쭉 내려서 버킷 만들기 버튼을 클릭한다.

image4

(버킷 만들기 버튼 클릭.)

정상적으로 버킷을 만들었다면 다음과 같이 범용 버킷에 내가 생성한 버킷이 조회된다.

image5

(버킷 생성 완료.)

이후 버킷의 아이디를 클릭하여 권한 Chapter로 이동한다.

image6

(버킷의 권한 Chapter로 이동)

화면을 쭉 내리면 버킷 정책 영역으로 이동할 수 있는데 편집 버튼을 클릭한다.

image7

(버킷 정책 영역으로 이동 후 편집 버튼 클릭)

새 문 추가 버튼을 클릭하여 정책을 추가해주자.

image8

(새 문 추가 클릭)

서비스 선택에서 S3를 검색하고 작업 필터링 부분에 GetObject를 검색하고 체크박스를 선택한다.

image9

(GetObject 체크박스 선택)

아래로 좀 내리면 리소스 추가버튼이 있는데 추가 버튼을 클릭한다.

image10

(리소스 추가 버튼 클릭)

리소스 유형에는 object를 선택하고, 리소스 ARN값에 기본값으로 arn:aws:s3:::{BucketName}/{ObjectName} 나열되어 있을텐데 BucketName에 내가 기존에 생성한 버킷의 이름을 입력하고, {ObjectName}에는 * 값을 입력한다. 그 후 리소스 추가버튼을 클릭한다.

image11

(모든 S3에 업로드된 파일에 접근을 허용할수 있도록 한다.)

그 뒤에 json 형태의 데이터 항목중 Key 값이 Principal 항목의 value 값을 "*" 로 설정한다. 누구에게 이 정책을 허용할 것인지 설정하는 부분인데, 모든 사람에게 허용하기 위해 해당 값으로 입력한다.

image12

(Principal 값을 꼭 설정해주어야 한다.)

그 뒤에 변경 사항 저장을 눌러서 버킷 정책 편집을 완료하자.

image13

(변경 사항 저장 버튼 클릭)

Step2. IAM에서 액세스키 발급 받기

기본적으로 AWS의 리소스에 아무나 접근을 할 수 없다. 그렇기 때문에 S3 접근해서 파일을 업로드 할 수 없다. 하지만 백엔드 서버는 S3에 접근하여 파일을 업로드 할 수 있어야 한다. S3에 접근할 수 있는 권한을 받기 위해서 IAM을 통해 권한을 부여 받아야 한다.

가장 먼저 IAM을 검색하여 해당 페이지로 이동한 뒤, 사용자 생성 버튼을 클릭하자.

image14

(사용자 생성 버튼 클릭)

사용자 세부 정보에 사용자 이름으로 api-server를 입력해주자. 다른 이름을 입력해도 된다. 다음 버튼도 눌러주자.

image15

(사용자 이름 입력)

권한 옵션에 직접 정책 연결선택, 권한정책은 AmazonS3FullAccess을 검색하여 체크 후 다음 버튼 클릭

image16

(AmazonS3FullAccess를 반드시 선택한다.)

사용자 생성 버튼 클릭

image17

(IAM 사용자 생성을 완료하자.)

그 뒤에 우리는 액세스 키를 발급받아야 하기 때문에 위 단계에서 생성한 사용자의 보안 자격 증명 Chapter로 이동한다.

image18

(보안 자격 증명으로 이동하자.)

화면을 좀 내리면 액세스 키 영역이 존재하고 액세스 키 만들기 버튼이 보인다. 해당 버튼을 클릭하자.

image19

(액세스 키 만들기 버튼 클릭)

액세스 키 만들기 페이지에서 사용 사례에 AWS 외부에서 실행되는 애플리케이션 로 선택하고 화면 아래의 다음 버튼을 클릭한다. (차후 과정에서 로컬에 스프링부트를 실행하여 접근할것이기에 해당 옵션을 선택하는 것이다.)

image20

(AWS 외부에서 실행되는 애플리케이션 꼭 선택)

설명 태그 설정 부분은 선택사항이기에 빈칸으로 두고 다음단계로 진행해도 된다. 바로 액세스 키 만들기 버튼을 눌러주자.

image21

(액세스 키 만들기 버튼 클릭 )

이 단계에서 제공되는 액세스 키 값은 현재 페이지 에서만 확인이 가능하다. 유출되지 않도록 어딘가에 잘 저장해서 보관해야 차후 스프링 부트에서 해당 키값을 통해 AWS의 S3 버킷에 접근하여 업로드가 가능하다. 키값을 확인 완료하였으면 완료 버튼을 클릭한다.

image22

(키값을 잘 저장해두자.)

S3와 스프링 부트 연결하여 이미지 업로드 하기

이 단계 에서는 스프링 부트 서버가 필요한데 다음과 같은 sample 프로젝트를 clone하여 액세스 키값만 변경하고 S3와 연동해보자. 가장 먼저 해당 본인 PC에 프로젝트를 clone 하자.

하기 단계는 프로젝트를 PC에 설치 완료하였다는 가정하에 진행됩니다.

Step1. yml 파일에 버킷 이름과 키값 입력하기

application.yml.yml 파일의 버킷이름과 키 값을 확인 후에 입력한다.

image23

(자신의 버킷 이름과 액세스 시크릿 키값을 입력합니다.)

Step2. 프로젝트 실행하기

yml 파일 제외하고 다른 부분들은 변경하지 않고 프로젝트를 실행한 뒤, 8080 포트로 서버가 잘 실행되었는지 로그를 통해 확인합니다.

image24

(8080 포트로 정상적으로 실행중인지 확인필요.)

Step3. Postman을 통해 /upload API 호출

/upload API를 post 메소드로 호출. 이때 postman의 body는 form-data로 key 값을 File 타입으로 변경한 뒤에 키 값입력을 file, value 부분에는 업로드 하고자 하는 파일을 선택해 준 뒤에, Send 버튼을 클릭하자.

image25

(Postman을 통해 API 호출해보자)

정상적으로 이미지가 업로드 된 경우, 리턴값으로 aws에 업로드한 이미지 url 주소값이 리턴된다. 해당 값을 클릭해보면 내가 업로드한 이미지를 확인 할 수 있다.

image26

(리턴값으로 aws s3에 업로드된 이미지 주소가 return 된다.)

또한 업로드한 이미지를 S3 대시보드에서 확인할 수 있는데 다음과 같이 조회된다.

image27

(S3 버킷에 정상적으로 업로드 된 것을 확인 완료.)

S3 종료하기

버킷은 삭제하기전에 객체를 반드시 전부 삭제 해야한다. 먼저 객체부터 삭제한다.

image28

(전부 선택 및 삭제버튼 클릭)

S3 버킷에 객체 전부 선택하고 객체 삭제 버튼 클릭

image29

(객체 삭제 버튼 클릭)

삭제할 버킷 선택 후 삭제 버튼 클릭

image30

(삭제 버튼 클릭)

버킷도 삭제 완료하자.

image31

(버킷 삭제)

다음으로

이렇게 해서 S3를 이용한 파일 및 이미지 업로드 기능을 스프링 부트에 적용하는 작업을 마무리했다. 이제 다음 단계로, S3의 또 다른 기능인 정적 웹사이트 호스팅을 학습하고, 이를 CloudFront와 함께 적용하는 방법에 대해 알아볼 예정이다.

다음글 : [aws] s3와 cloudfront를 활용한 웹 페이지 배포