AWS에서 대표적으로 사용되는 스토리지 서비스로 완전 관리형 서비스이다.
원하는 양의 데이터를 저장할 수 있고 웹기반으로 어디서든 접근할 수 있는 스토리지.
매우 안전하고 안정적이며 확장 가능한 객체 스토리지. (eleven-nine)

콘텐츠 저장 및 배포, 백업 및 아카이빙, 빅 데이터 분석, 재해 복구, 정적 웹 사이트 호스팅에서 사용될 수 있다.

  • 리전 기반이어서 정적 호스팅에선 EC2보다 더 안정적으로 지원 가능하다.

EC2는 AZ 기반이지만 S3는 리전 기반이어서 AZ가 문제가 생겨도 더 안전하게 지원할 수 있다.
또한 CRR(교차 리전 복제)으로 모든 S3 객체를 다른 AWS 리전에 위치한 대산 버킷으로 자동 복제하여 안전성을 보장한다.

S3는 객체 스토리지 구조를 갖는다.

전통적인 파일시스템:
dir > dir > dir > files 방식의 search.
파일이 많아지고 길어질수록 검색 속도가 늦어짐.

객체 스토리지:
dir 구조를 갖지 않고 파일을 찾아감.
파일이 많아져도 균일한 속도를 유지함.

storage option

AWS에서는 용도에 따라 S3 외에도 다양한 storage 서비스를 제공한다. (storage class 참고)

Glacier:
데이터를 저장하는데 저렴하며 내구성이 우수한 아카이브 스토리지. 저장하는 비용이 저렴하다는 장점이 있고,
데이터를 가져오는데 비용이 많이 들고 데이터를 받아오는데 시간이 오래걸린다는 단점이 있다.
주로 중요하지만 잘 사용하지 않는 데이터를 저장한다.

EFS: 전통적인 파일 스토리지. 공유 개념을 지원한다.

EBS: 블록 기반의 스토리지. EC2 인스턴스에 외장하드를 네트워크로 붙이는 식으로 사용.

Storage Gateway: S3, Glacier, EBS 등의 스토리지 인프라 사이에 원활하고 안전한 통합이 이루어지도록 지원한다.

  • ex) S3 주 데이터를 저장하고 Glacier에 보관하도록 사용.

구성요소

S3는 버킷과 객체로 이루어져 있다.

버킷:
버킷은 말 그대로 객체를 담는 바구니다.
전세계적으로 고유한 이름을 가져야 한다.

  • 3~63자의 사이즈와 a-z, 0-9, ‘-‘만을 사용한다.

객체:
버킷에 저장되는 파일로 어떤 종류의 파일도 객체가 될 수 있다.
객체는 고유한 키와 메타데이터를 갖는다. 키를 통해 객체를 업로드/검색한다.
개층구조(폴더의 개념)가 존재하지 않는데, 키에 prefix(/)를 통해 폴더 개념을 지원할 수 있다.

  • prog/java/collections.jtml을 통해 prog/java의 폴더 개념을 갖도록 객체를 구분.
  • 실제로는 계층구조가 없지만 사용자가 있는 것처럼 활용.
    메타데이터는 시스템 메타데이터와 유저 메타데이터가 있으며 시스템 메타데이터는 생성 날짜, 크기 등의 정보를 포함한다.
    객체의 key, metadata 참고.

versioning

S3는 동일한 이름의 파일을 넣으면 덮어쓰게 된다.
이런 문제를 해결하기 위해 versioning을 지원한다.

  • 각 버킷 > property > versioning 을 하면 version에 따른 동일한 이름의 파일을 저장하도록할 수 있음.

version id는 객체의 metadata에 존재한다.
기본적으로 S3는 versioning을 비활성화되어 있는데 versioning을 한 번 켜면 끌 수 없으므로 데이터 관리 측면에서 코드상에서 충분히 고려가 되야한다.

  • 버전 별 데이터가 계속해서 쌓일 수 있음.

URL

기본 경로

  • http://s3.[리전 엔드포인트].amazonaws.com/[버킷 이름]/[객체 파일 명]

가상 호스팅

  • http://[버킷 이름]s3.amazonaws.com/[객체 파일 명]

aws의 주소가 들어가서 실 사용자에게 aws 서비스로 오해받을 수도 있을 것이고 이를 해결하기 위한 가상 호스팅도 존재한다. (AWS Virtual Hosting 참고)

객체 작업

Put:
단일 업로드 <= 5GB, 멀티 파트 업로드 <= 5TB 지원.
인터넷은 비교적 신뢰성이 떨어지기 때문에 100 MB를 넘는 경우 멀티 파트 업로드를 권장한다.
멀티 파트 업로드는 각 파트가 개별적으로 업로드 되고 업로드에 실패하면 실패한 파트만 재전송할 수 있다.

Get:
완전한 객체 가져오는 것과 필요하다면 바이트 범위를 지정하여 객체의 일부를 가져올 수 있다.

Select:
S3에서 파일에 대한 format(csv, json)을 지정하여 원하는 값만을 가져올 수 있다.
큰 파일의 일부만 필요한 경우 파일 전체를 받는 낭비를 줄일 수 있다. 성능과 비용에서 효과를 볼 수 있다. (AWS select 참고)

delete:
단일 객체나 여러 객체를 삭제하는데 사용한다.
versioning이 활성화 된 경우는 versionId도 같이 명시하여 삭제한다.
versioning이 활성화 된 경우에 key만 지정하면 현재 버전의 객체에 delete marker가 추가되고, 삭제 마커가 있는 객체를 검색하려고 하면 404 error가 발생한다.

미리 서명된 URL

기본적으로 객체와 버킷은 모두 private. AWS 보안 자격 증명이나 권한 없이 객체를 업로드 하기를 원하는 경우 미리 서명된 URL을 사용할 수 있다.
다른 작업 수행을 위한 권한을 열지 않고 PUT/GET 에 대한 액세스를 제공.
생성할 때 자격 증명 등의 데이터를 받고, URL을 생성하는 사용자의 권한을 사용하여 액세스함.
지정된 기간 동안만 유효함. (최대 1주)

암호화

전송 데이터 암호화를 할 수 있다.
서버에 저장하는 데이터를 암호화 할 수 있다.

  1. S3가 관리하는 키.
  2. KMS(key 관리 서비스)가 관리하는 키.
  3. 사용자가 설정한 키.

ACL(Access Control List)

S3 ACL에서 객체나 버킷 수준에서 접근 가능한 권한 부여할 수 있다.
버킷의 ACL을 바꾸거나 설정하더라도 그 내부의 객체는 이와 별개이다.

CORS (Cross Origin Resource Sharing)

제한된 리소스를 최초 자원이 서비스된 도메인 밖의 다른 도메인으로부터 요청할 수 있게 허용하는 구조이다.
S3에서는 CORS를 지원하며 활성화하여 사용할 수 있다. (AWS CORS 시나리오 및 구성 방법 참고)

성능 개선 방향

애플리케이션 설계에서 가능한 경우 버킷과 키 이름을 캐시.
가장 가까운 버킷 리전을 선택.
S3에 저자된 데이터를 압축하여 전송되는 데이터와 사용되는 스토리지 크기를 줄이는 방향.
AWS CloudFront와 같은 CDN(콘텐츠 전송 네트워크)를 통해 효율적으로 콘텐츠 배포.

무결성 체크

GET/PUT으로 검색한 객체의 MD5 체크섬을 확인하여 전송 중 데이터 손상을 확인한다.

  • AWS SDK는 PUT 작업시 MD5 체크섬을 자동으로 지정. S3는 MD5 체크섬을 다시 계산하고 이를 지정된 값과 비교.

오류 코드

S3 응답에 대해 오류 코드가 나온 경우 처리를 해주어야 한다.
400 error - 해당 작업을 수행할 수 없음.
500 error - 해당 작업을 재시도할 수 있음.


Table of contents