S3를 사용하는 이유
로컬에 파일을 저장해도 기능은 문제없는데, 왜 S3를 써야 할까?
S3는 AWS 클라우드 서비스 중 저장소 역할을 하는 온라인 스토리지 서비스이다.
로컬에 파일을 저장하는 건 언젠가 용량에 한계가 올 것이고, 그때마다 추가적인 용량 확장 작업과 설정을 해줘야 하는 번거로움이 예정되어 있다.
클라우드 서비스인 S3를 활용하면 무제한에 가까운 저장을 할 수 있기 때문에 이런 문제에서 벗어날 수 있다.
그러면 EC2와 같은 클라우드 서버에도 저장이 가능하다고 생각할 수 있다.
생각한 것처럼 EC2와 같은 서버에도 파일을 저장할 수 있지만, 요금 측면이나 활용도 측면에서 S3를 활용하는 것이 훨씬 좋은 선택이다.
S3 버킷 만들기
먼저 AWS S3를 활용하기 위해서는 AWS 계정이 필요하다.
계정 로그인 후, AWS의 S3 서비스가 제공하는 버킷이라는 저장소를 만들어 해당 버킷에 파일을 저장할 수 있다.
가장 먼저 AWS의 S3 서비스에 버킷 페이지에 접속하고, 버킷 만들기를 눌러보자.
생성할 버킷 이름을 적어주고, 지역을 확인한다.
우리는 해당 버킷에 대해서 IAM 계정을 만들고, 해당 계정에 S3에 대한 권한을 부여하여 버킷을 관리할 예정이다.
따라서, 객체 소유권에서 ACL을 활성화시켜준다.
ACL을 활성화해주지 않으면, 차후에 IAM 계정으로 접근 시 400 에러가 발생한다.
퍼블릭 액세스 차단 설정 부분에서는 모든 퍼블릭 액세스 차단을 해제한다.
퍼블릭 액세스를 차단한 상태에서 파일을 업로드하게 되면 403에러가 발생하게 되기 때문에 차단을 해제해야 한다.
퍼블릭 액세스 차단을 해제하고, 버킷 정책을 설정하는 방향으로 기본적으로 버킷 접근은 허용하지만, 정책을 통해 권한을 막겠다는 취지이다.
S3 버킷 권한 설정
생성한 버킷의 권한 설정 부분으로 들어간다.
버킷 정책 편집을 누른다.
버킷 정책 편집 페이지에서 정책 생성기를 눌러준다.
이때, 미리 버킷 ARN을 복사해두자.
다음 화면에서 정책을 생성해주자.
Select Type of Policy: S3 Bucket Policy를 선택
Effect: Allow를 선택
Principal: 접근할 사람을 명시. 외부에 퍼블릭으로 공개할 예정이니 *을 입력
AWS Service: Amazon S3를 선택
Actions: 객체를 조회 및 저장할 예정이기 때문에 'GetObject', 'PutObject'를 선택
ARN: 앞서 복사한 ARN 뒤에 /*를 추가하여 기입. ex) arn:aws:s3:::<bucket_name>/*
이후 Add Statement 후, Generate Policy를 클릭하면 JSON형태로 정책이 생성된다.
생성된 JSON을 복사하여 버킷 정책 편집기에 붙여 넣고 저장한다.
(아래 사진의 빨간색 상자 부분에 붙여 넣기 해준다.)
IAM 사용자 추가
S3에 접근하기 위해서는 IAM 사용자에게 S3 접근 권한을 주고, 그 사용자의 액세스 키, 비밀 엑세스 키를 사용해야 한다.
AWS IAM 서비스로 들어가 사용자 추가를 해준다. (IAM에 대한 자세한 내용이 궁금하다면 여기를 참고하자)
사용자 이름을 기입하고, AWS 자격 증명 유형을 엑세스 키로 선택해준다.
정책 중에서 AmazonS3FullAccess를 선택해준다.
IAM 사용자를 만들면 다음과 같은 페이지가 뜬다.
해당 페이지는 한 번 밖에 볼 수 없기 때문에, 액세스 키 ID와 비밀 액세스 키를 복붙 해두자.
.csv 파일을 다운로드하는 것도 좋은 방법이다.
여기까지 AWS S3 저장소를 만들고, 해당 S3에 접근할 수 있는 IAM 사용자를 만들었다.
다음 포스팅에서는 이렇게 만든 저장소와 IAM 사용자 정보를 바탕으로 S3에 파일을 업로드하는 과정을 적어보려고 한다.
참고
'👨💻 개발' 카테고리의 다른 글
SpringBoot에 CloudFront 적용 (0) | 2021.12.07 |
---|---|
AWS CloudFront 배포하기 (0) | 2021.12.07 |
SpringBoot로 AWS S3에 파일 업로드 하기 (0) | 2021.12.05 |
SpringBoot 파일 업로드 구현 (0) | 2021.12.03 |
QueryDSL을 활용한 동적 쿼리 구현 (0) | 2021.12.02 |