AWS에서 제공하는 스토리지 서비스 S3를 이용해보자❕
1. AWS S3(Simple Storage Service)
S3는 AWS에서 제공하는 클라우드 기반의 객체 스토리지 서비스이다. 이미지, 동영상 및 여러 형태의 파일을 저장하고 관리하는 파일 서버 역할을 한다.
S3를 이용하면 이미지나 html 파일 등 정적 리소스들을 URL만으로 호출해서 사용할 수 있다.
- S3는 뛰어난 확장성, 데이터 가용성, 보안, 성능을 제공하는 객체 스토리지 서비스이다.
- 원하는 만큼 데이터를 저장하고 보호할 수 있다.
- 저장된 파일에 접근 권한을 지정할 수 있어 무단 접근을 막을 수 있다.
- 많은 사용자가 접속해도 이를 감당하기 위해 시스템적인 작업을 하지 않아도 된다.
- 최대 5TB의 데이터를 저장할 수 있다.
- 버전관리 기능을 통해 사용자에 의한 실수도 복원이 가능하다.
- 비용이 저렴하다. (사용하는 만큼만 지불하면 되기 때문)
이런 클라우드 서비스를 이용하지 않는다면 유저들이 업로드한 파일들을 웹 서버 특정 디렉토리에 저장해 사용해야 하는데, 유저가 늘어나고 저장되는 파일이 많아질수록 웹 서버의 부하는 커질 것이다. 이 외에도 파일 접근 권한 기능, 버전 관리 기능 등 웹 서비스를 설계하는데 필요한 기능들을 제공하기 때문에 요즘 대부분의 서비스들은 클라우드 기반 스토리지 서비스를 사용하고 있다.
S3 사용 예
- 클라우드 저장소
- 서비스의 파일 저장소
- 서비스 로그 저장 및 분석
- 정적 웹서비스 (html 파일)
이 외에도 다양한 방법으로 S3가 사용될 수 있다.
실제로 많은 사이트에서 S3를 사용하고 있다. 아무 사이트에 들어가서 이미지 경로를 확인하다보면 다음과 같이 S3를 이용하고 있는 걸 확인할 수 있다.
S3 용어
- 객체 (Object)
- 저장되는 파일
- 파일과 메타데이터를 구성하고 있는 저장 단위
- 객체 하나의 크기는 최대 5TB까지 허용
- 저장되는 객체의 개수는 제한이 없다.
- 버킷 (Bucket)
- S3에서 생성되는 최상위 디렉토리
- 디렉토리와 객체를 저장하는 컨테이너이다.
- 버킷 안에 버킷을 생성할 수 없다.
- 한 계정 당 100개까지 생성 가능
- 키 (Key)
- 버킷 내 객체에 대한 고유 식별자
- 보통 '디렉토리 + 파일명'으로 명명된다.
- 키 값이 중복되는 객체는 덮어씌운다. (버전 관리 설정을 하면 동일한 키 생성 가능)
- 리전 (Region)
- 버킷의 저장 위치
- 버킷 위치를 어디에 지정하냐에 따라 지연 시간과 비용 등이 결정된다.
다음을 예시를 보고 S3 용어를 이해해보자.
S3 URI: `s3://chaego-bucket/uploads/imagefile.jpg`
객체 URL : `https://chaego-bucket.s3.ap-northeast-2.amazonaws.com/uploads/imagefile.jpg`
- 객체 : imagefile.jpg
- 버킷 : chaego-bucket
- 키 : uploads/imagefile.jpg
- 리전 : ap-northeast-2
리전을 아시아 태평양(서울)(ap-northeast-2)로 설정한 버킷(chaego-bucket)이 있고, (uploads)디렉토리에 객체(imagefile.jpg)를 저장한 것이다. 여기서 키는 (uploads/imagefile.jpg)가 된다.
2. S3 권한 설정 방법
S3에 권한을 설정하면, 허가된 접근만 액세스하도록 할 수 있다. S3에 권한을 설정하는 방법은 대표적으로 4가지가 있다.
- IAM (Identity & Access Management)
- 사용자를 생성하고 사용자의 버킷 권한 액세스를 관리
- 사용자 단위로 접근 제어를 설정해야 할 때 사용
- ACL (Access Control List)
- 권한 있는 사용자에게 개별 객체를 액세스 할 수 있게 하는 액세스 제어 목록
- 객체 단위로 접근 제어를 설정해야 할 때 사용
- 버킷 정책 (bucket policy)
- 단일 S3 버킷 내 모든 객체에 대한 권한을 세부적으로 관리
- 버킷 단위로 접근 제어를 설정하고 변경이 적을 때 사용
- 쿼리 문자열 인증 (pre-signed URL)
- 임시 URL을 사용해 다른 사용자에게 기간 제한(임시 권한) 액세스를 부여
3. S3 버킷 생성 및 설정
3-1. 버킷 만들기
- AWS S3 > 버킷 > 버킷 만들기
- 퍼블릭 액세스 차단은 외부에서 파일을 읽지 못하게 하는 것이다.
- 버킷을 비공개로 나만 보려고 한다면, 모든 옵션에 체크하면 된다.
- 버킷 생성 완료
3-2. 폴더 만들기
- ‘uploads’ 디렉터리 생성
- 이 디렉터리 안에 객체를 저장해 사용하면 된다.
3-3. 버킷에 파일 업로드
- 업로드 버튼을 눌러 파일 업로드
- ‘imagefile.jpg’ 객체 생성 완료
- 생성된 객체 URL을 클릭해 이미지 파일 확인
- AccessDenied 에러가 뜬다.
- 버킷 내의 객체가 퍼블릭으로 설정되지 않아서 요청이 제한된 것이다.
4. 버킷 권한 설정
4-1. 버킷 정책 설정 - 단일 버킷 내 모든 객체에 대한 권한을 세부적으로 제어할 수 있음
AWS Policy Generator
Click below to edit. To save the policy, copy the text below to a text editor. Changes made below will not be reflected in the policy generator tool.
awspolicygen.s3.amazonaws.com
- 정책 타입 선택 - S3 Bucket Policy
- Effect - Allow
- Principal - *
- Actions - GetObject, PutObject
- ARN - arn:aws:s3:::{버킷 이름}/*
- 모든 대상(Principal)이 chaego-bucket 버킷에 있는 모든 객체에 대해 조회(GetObject) 및 업로드(PutObject)를 허용
- 해당 json 값을 복사한다.
- 버킷 > 권한 > 버킷 정책 > 편집
- 복사한 json값을 붙여넣는다.
- 다시 객체 URL을 클릭해 접속해보면 업로드한 파일이 정상적으로 조회된다.
4-2. IAM 설정 - 사용자 별 버킷 권한 액세스를 관리할 수 있다.
- AWS IAM > 사용자 > 사용자 생성 버튼 클릭
- 직접 정책 연결 > AmazonS3FullAccess 선택
- S3에 대한 모든 권한을 소유하는 사용자 생성 완료
- 이제 키를 발급받아, 해당 권한을 가진 사용자의 접근을 허용해야 한다.
- 생성된 사용자 > 액세스 키 만들기 클릭
- 액세스키와 비밀키는 .csv 파일로 다운받아 저장한다.
- 이 액세스키와 비밀키를 가지고 있는 유저는 AWSS3FullAccess 권한을 가진다.
- 다른 사용자(IAM으로 생성된 유저)의 접근을 허용하기 위해, ACL을 활성화한다.
- 이제 액세스키와 비밀키를 가지고 있는 유저는 버킷에 접근이 가능해진다.
5. 결과
간단하게 구현해서 업로드 기능이 동작하는지 확인해보자!
- 간단하게 파일 업로드 기능을 구현한 뒤, 액세스키와 비밀키를 사용한 유저 권한을 이용해 파일 업로드를 진행했다.
- uploads안에 성공적으로 업로드되었다.
- 이번에는 IAM에서 AmazonS3ReadOnlyAccess(조회만 가능) 권한을 갖는 새로운 사용자 'user2'를 생성했다.
- 해당 유저는 조회만 허용되어, 업로드 기능이 허용되지 않는다.
- Access Denied 에러가 뜨는 것을 확인할 수 있다.
참고자료 😃
https://aws.amazon.com/ko/s3/features/
https://velog.io/@chrkb1569/AWS-S3-적용하기-IAM-프로젝트-설정
https://okhyeon.tistory.com/26
'AWS' 카테고리의 다른 글
[CI/CD] Github + Jenkins + AWS EC2를 활용한 CI/CD 구축 (2) | 2024.11.03 |
---|---|
[AWS] AWS S3 - Spring 파일 업로드 (0) | 2024.04.11 |