S3란?
S3는 Simple Storage Service로 간단한 저장소 서비스를 제공한다.
저장소는 블록 스토리지와 오브젝트 스토리지로 나뉠 수 있는데, S3는 오브젝트 기반 스토리지이다.
블록 스토리지는 일반 하드디스크 처럼 읽고 쓰기가 잦은 시스템에 적합하고, 오브젝트 스토리지는 적게 쓰고 많이 읽는 시스템에 적합하다.
예를들면 웹서비스의 앞단(front-end)은 S3와 같은 오브젝트 스토리지가 적합하고, 뒷단(back-end)의 시스템이 돌아가는 서버의 저장소는 블록 스토리지(ebs)가 적합하다.
기본지식 및 특징
기본적인 스펙
1. S3는 오브젝트 스토리지(업로드/다운로드 형태)
2. 5테라까지 지원
3. 무제한 용량
4. 버킷(Bucket)에 저장됨
5. 버킷 이름은 유일해야함
6. 주소 구성 s3.[리전].amazonaws.com/[버킷명] >> https://s3.ap-northeast-2.amazonaws.com/ryustory
7. 업로드 성공시 200을 반환
일관성
시험 단골 문제라고 한다.
S3의 일관성 모델에 대한 이야기인데, 이해에 도움이 될만한 글을 봐도 도움이 될 것 같다.
혹은 AWS 공식 문서에 나와있는 일관성 모델을 보는 것이 더 좋을 것 같다. 하지만 늘상 그렇듯 aws 문서는 친절하지만 어렵기도 하다.
게다가 문제는 한글 번역은 "읽기 후 쓰기" 영어 원문은 "read-after-write"이다. 오해하기 딱 좋다.
아무튼 정리하면 아마존 S3에서 제대로된 응답을 얻기 위해서는 쓰고나서 한번 읽어줘야한다.
말 그대로 어떤 파일을 PUT 한뒤 GET으로 받아줘야 한다는 이야기이다.
윗글에 소개한 것처럼 해당 내용을 읽어보면 PUT/GET 순서가 아니라 GET/PUT/GET 순서라던가 PUT/PUT/GET 의 순서로 테스트하면 잘못된(이전의) 결과가 반환될 수 있다.
이는 업로드 이후 고가용성을 위해 데이터를 전파하기 때문에 발생할 수 있다.
공식 AWS 문서에 이에 대한 부분을 이미지로 잘 설명해놨다. 동시에 두 클라이언트가 쓰기 읽기를 할 경우 어떤 응답이 발생할 수 있는지 표현해놨다. Eventual Consistent Read의 경우도 중요하다.
Eventual Consistency는 데이터의 가용성 보장을 높이기 위해, 완벽히 전파 되기 전에는 이전 데이터를 보낼 수 있다는 것인데, 이렇게 처리해서 Consistency는 좀 약하게 보장하지만 이전의 결과 까지도 응답으로 처리 할 수 있기 때문에 Availability의 기준을 낮추게 되므로 더 보장 할 수 있다.
Key-Value Store
S3는 아래와 같은 오브젝트로 구성되어 있다.
Key - 오브젝트 이름, 파일명.
Value - 실제 데이터
Version ID - 파일 업데이트 시의 버전관리. 히스토리 관리
Metadata - 메타 데이터
Sub resources, Access Control List - 파일의 통제 가능
Sub resources, Torrent - 토렌트 (시험범위 아님)
가용성 및 관리 기능
99.99% - S3 플랫폼의 가용성
99.9% - 아마존 보장
99.999999999% - S3 내구성 (9가 11개임. 중요함.) > 100,000,000,000개의 파일을 업로드하면 1개는 실패할 수 있다는 정도를 의미
Tiered-Storage - 스토리지 내 다른 스토리지 클래스 제공
Life Cycle - 라이프 사이클 관리(30일 지난 파일ㅇ르 이동 가능)
Encryption - 암호화 지원
ACL, Bucket Policy - 파일 접근 제어
티어와 클래스
파일을 업로드할때 스토리지 클래스를 선택할 수 있는데, 해당 내용은 aws 공식 페이지에 표로 잘 비교해놨다.
가용 영역이 3개 이상인 클래스는 두 곳의 가용영역에 문제가 생겨도 서비스에 이상이 없으며, Glacier의 경우 cold storage로 처음 요청시 꽤 많은 시간이 걸리게 된다.
S3 파일 업로드시 aws에서는 위 서비스 들을 아래와 같이 특징 지었다.
S3 Standard : 자주 액세스 하는 데이터
S3 - IA : 수명이 길고 자주 액세스 하지 않는 데이터
S3 One Zone - IA : 수명이 길고 자주 액세스 하지 않으며 중요하지 않은 데이터
Glacier : 데이터 아카이빙, 액세스에 3~5시간 걸려도 괜찮은 경우
요금
스토리지
요청
스토리지 관리 비용 (태그/메타데이터)
데이터 전송 비용
Transfer Accelation 요금
Transfer Accelation
좀 더 요약하면 전세계에서 S3로 데이터 업로드 하는 구성일 경우에 CloudFront 엣지 로케이션을 통해 데이터를 전달받고 이를 aws내 인프라를 통해서 S3로 전송되게 된다.
즉, S3는 특정 리전에 생성되고 전세계에서 해당 버킷에 큰 데이터를 자주 전송하게 될 경우 고객은 고객 위치와 가까운 아마존 엣지 로케이션을 통해서 전송되므로 훨씬 속도가 향상 될 수 있다.
속도 차이가 어느 정도인지는 아마존에서 직접 만들어놓은 비교 툴이 있다. 실제 업로드 속도보다 아마 latency를 비교하는 것이 아닌가 싶다.