데이터를 저장하는 방식은 크게 file
, block
, object
으로 나뉠 수 있는데, AWS S3
(이하 S3)는 이 중에서 object storage
에 해당한다. Object storage
는 파일 방식의 스토리지와 달리 계층적 구조를 갖지 않고, 모든 object
가 flat space
에 key
를 기반으로 고유하게 존재한다는 것이 특징이다.
사용자는 AWS S3
에 1바이트부터 5TB까지 다양한 크기의 객체를 저장할 수 있다. 기본적으로 저장되는 객체 갯수에는 제한이 없다.
사용자는 IAM 별로 개별 Bucket
에 대한 접근권한 및 정책을 설정하여 읽기/쓰기를 제한할 수 있다.
다양한 API 및 SDK를 지원하여 높은 사용자 편의성을 제공한다.
S3는 데이터를 AWS 데이터 센터 내에서 여러 서버로 데이터를 복제하여 높은 고가용성을 확보하였다.
또한, S3는 모든 PUT
, DELETE
요청에 대해 강력한 쓰기 후 읽기(read-after-write
) 정책을 기본으로 한다. 따라서, 모든 읽기(GET
, LIST
) 요청은 분산된 데이터에 대한 수정이 모두 이뤄진 이후에 이루어져 데이터의 일관성이 보장된다.
단, S3는 Lock
기능을 제공하지 않는다. 따라서, 여러 스레드에서 같은 객체에 동시에 읽기/쓰기 요청을 전송할 경우에는 의도치 않은 문제가 발생할 수 있다. 따라서, 어플리케이션 레벨에서 동시성에 대한 처리 로직을 구현하여야 한다.
추가적으로, S3는 객체에 대한 Transaction
처리를 지원하지 않는다. S3에서는 기본적으로 개별 객체에 대한 원자성만을 보장한다. 따라서, 사용자는 어플리케이션 레벨에서 관련 로직을 직접 구현하여야 한다.
S3는 하나의 객체에 대해 다양한 버전 관리를 지원한다. 사용자는 동일한 버킷에서 여러 개의 객체 버전 중 원하는 버전을 선택하여 사용할 수 있다.
사용자는 데이터의 성격에 따라 S3 객체의 저장 형태를 지정할 수 있다. 예를 들어, 데이터 유실에 민감하지 않은 데이터는 복제를 최소화하여 비용을 낮춰 저장할 수 있다. 유사한 서비스로 AWS Glacier
가 있다.
S3는 다른 AWS 서비스와 결합된 편의기능을 다수 제공한다. 예를 들어, AWS Lambda
에서 특정 버킷에 대한 변화를 Trigger
로 사용하거나, AWS Elastic Beanstalk
에서 어플리케이션 소스코드와 버전을 S3를 통해 관리할 수 있다. 이 밖에도, S3는 무수히 많은 AWS와 통합된 기능을 제공한다.
S3에서는 개별 데이터를 객체라고 부른다. 객체는 파일 시스템의 파일에 대응되는 개념이다. 객체가 하나의 파일이라고 할 때, Bucket
은 연관된 파일과 폴더를 모아둔 상위 폴더에 대응된다고 볼 수 있다. Bucket
에 저장된 모든 객체는 Bucket
에서 고유한 키를 할당 받아 이를 식별자로 사용한다.
AWS 리전 구분, 권한 제어, 사용량 집계 등의 작업은 기본적으로 Bucket
을 단위로 이루어진다.