S3(Simple Storage Service)는?
S3는 높은 내구성과 가용성을 저렴한 가격으로 제공하는 객체 스토리지 서비스 입니다. 기존의 물리 장비는 시간이 지나면서 데이터가 손상될 확률이 생길 수 있지만 내부 복제를 전제로 하는 객체 스토리지 방식으로 하나의 객체가 업로드 시 자동으로 내부의 여러 위치에 복제본을 생성합니다. S3는 동일 Region에 여러 AZ에 걸쳐 복제본을 생성함으로써 내구성이 상승됩니다. 하지만 복제에 소요되는 시간 등의 단점도 있습니다. 또한, SSL을 통한 IAM 사용과 데이터 전송과 데이터 업로드 후 자동 암호화를 지원, 객체 업로드시 이벤트 알림 전송(작업 자동화), CloudFront(전세계 엣지 로케이션에 파일전송하여 가까운 거리에서 서비스), 재해 복구 등 다양한 지원기능이 있습니다.
S3요금은 저장되는 데이터량(Storage), S3를 대상으로 수행되는 요청(Request), 다른 객체간 전송되는 데이터 크기(Data Transfer)에 따라 비용이 발생합니다. 각 리전에 따라 시점별로 단가가 바뀌기 때문에 비용을 체크해주어야 합니다. 또한 오래된 데이터를 보관만 하는 경우에 저렴히 이용할 수 있는 파일 타입을 제공합니다.
객체 스토리지와 S3의 특징
- 객체의 생성과 삭제만 지원합니다. 수정작업은 내부적으로 동일 경로에 재생성 되도록 작업됩니다.
- 객체 데이터와 관련된 Metadata(사용자정보, 날짜 등)는 Key/Value 형태로 자유롭게 추가 가능하며 외부에 저장하여 관리합니다.
- 각 객체의 주소값은 글로벌하게 고유합니다. 버킷명 + 키값 + (버전ID) 로 객체를 구분합니다.
- HTTP(S)프로토콜을 사용하여 업로드/다운로드를 수행할 수 있습니다.
Bucket과 Object
S3에는 Bucket(다수의 객체를 통합하여 저장/관리/제어하는 단위)과 Object(파일 및 파일정보로 구성된 저장 단위)라는 단위가 있습니다. Bucket을 생성한 AWS계정은 소유자가 되고 소유자는 각종 기능을 활성화/비활성화, 버킷 내 객체에 접근제어 정책 관리 등을 할 수 있습니다.
S3의 성능을 높이기 위해 Bucket내에서 파티션별로 최대한 분산되도록 객체의 주소값을 순차구조가 아닌 방식으로 설계해야합니다. 또한 CloudFront같은 Cache Layer를 구성하여 캐싱을 통해 S3로 직접 들어오는 요청 부하를 줄이는 방법도 있습니다.
S3 접근제어 정책
S3의 작업을 제어하는 권한계층에는 Bucket ACL, Object ACL, Bucket Policy 그리고 IAM이 있습니다. S3에서는 제한이 없고 모든 정책이 가능한 Bucket Policy를 통해 제어하는 것을 권장합니다.
항목 | Bucket ACL | Objec tACL | Bucket Policy |
---|---|---|---|
작업제어 | Bucket | Object | Bucket, Object |
접근정책 | 허용정책만 | 허용정책만 | 허용/거부 모두 |
형식 | XML | XML | JSON |
정의하는 권한 | 일부 | 일부 | 전체 |
접근제어 정책은 거부정책 > 허용정책 > 미설정 순으로 우선합니다.
S3 생성하기
Static 콘텐츠들을 저장하기 위한 S3 Bucket을 하나 만들고 해당 Bucket에 Static Website Hosting 활성화, 접근제어 정책 설정을 해보겠습니다.
1. S3 Bucket 생성
-
AWS Mangaement Console 에서 S3를 선택한 뒤 Create Bucket 버튼을 클릭합니다.
-
중복되지 않는 Bucket Name을 입력하고 서비스 하고자 하는 곳과 가까운 Region을 선택하고 Create 버튼을 클릭합니다.
-
생성된 Bucket의 이름을 클릭하여 속성 설정 페이지로 이동합니다.
-
Properties > Static Web Site Hosting을 클릭하여 정적 웹호스팅 설정을 합니다. 사용할 Index페이지와 Error페이지 설정 후 Save버튼을 클릭합니다.
이제 버킷의 객체에 접근할 때 ~~~amazonaws.com의 주소값을 사용할 수 있습니다. 이후, DNS에서 CNAME처리를 통해 다른 주소로 대체할 수 있고 이때 Bucket이름과 CNAME 처리할 서비스 도메인 이름이 동일해야합니다.
-
Properties > Server access logging을 클릭하여 Access Log를 추가합니다.
-
Permissions > Bucket Policy에서 정책을 등록해 줍니다.
모든 사용자와 AWS 리소스가 로그를 제외한 S3 Bucket에 접근을 허용해 줍니다. (Log Delivery의 ACL이 기본적으로 설정)
-
새로운 객체를 업로드 한 뒤 API EndPoint 주소와 WebSite EndPoint 주소로 해당 객체에 접근할 수 있습니다.(버킷 > Upload)
EndPoint REST API EndPoint Website EndPoint URL 예시 s3.(region).zmazonzws.com/~~ (bucket-name).s3.website.(region).~~ 가능 작업 모든 Bucket/Object 범위 작업 Object의 GET/HEAD 요청만 접근제어 Public/Private 객체 대상 Public 객체 대상 Redirection 미지원 지원 SSL 지원 지원 미지원
2.S3 추가기능
-
Static Web Hosting
웹 사이트의 정적 콘텐츠를 제공하는 역할로 사용하기 위해 전용 도메인 주소를 제공합니다. Index페이지, Error페이지, Redirection 규칙 등을 적용할 수 있습니다.
-
Versioning
객체를 구분할 때 VersionID항목을 사용하여 객체 데이터에 변경이 발생하더라도 기존 객체 데이터를 보존해 줍니다.
-
LifeCycle
S3에 저장되는 객체의 보관주기를 설정하여 기간 만료 후 삭제하거나 이동하도록 도와주는 기능입니다. Versioning이 활성화 된 버킷의 경우 Current Version과 Previous Version 단위로 정책을 설정할 수 있습니다.