What is AWS S3?
공식문서에는 AWS S3를 이렇게 소개하고 있다.
Amazon Simple Storage Service (Amazon S3) is an object storage service that offers industry-leading scalability, data availability, security, and performance.
Scalability 확장성, Data Availabilty 데이터 가용성, Security 보안, Performance 성능을
제공하는 객체 스토리지 서비스.
S3 공식문서
https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html
위에서 말하는 S3가 가지고 있는 장점의 정확한 의미는, S3를 왜 사용하게 됐는지에 대해 설명하면서 알아가보도록 하자.
Why S3?
로컬 스토리지에 저장하지 않고, S3와 같은 클라우드 스토리지에 저장하는 이유로는,
로컬 스토리지 용량의 한계 및 관리의 어려움이 있을 것이다.
예를 들어, 이미지 파일을 주기적으로 저장해야 할 일이 많은 사이트가 있다고 하자.
요즘은 핸드폰 내장 카메라의 성능이 좋아지면서 높은 화소의 이미지를 제공한다.
그러다 보니, 자연스럽게 이미지 파일의 용량도 수 mb 정도가 나오게 된다.
만약 그러한 이미지 파일, 또는 동영상 파일이 계속 축적되다 보면
로컬 스토리지에 더 이상 저장하기 힘들어질 것이다.
하드웨어를 구매하거나 업그레이드해야 할 것이다.
그리고 설사 하드웨어를 확장했다 하더라도, 정확한 사용 용량을 추정하지 못한다면
하드웨어 사용에 대한 효율성도 떨어지게 될 것이다.
그리고 파일을 관리하게 되면, 그 외에도
백업 및 복원 문제, 데이터 손실 위험, 보안 등등 생각해야 할 문제들이 많아지게 된다.
S3는 바로 그러한 모든 서비스들을 대체해준다.
S3 용어
버킷 Bucket
버킷은 객체들의 컨테이너. 모든 객체는 버킷에 포함된다.
예를 들어 photos/puppy.jpg 라는 이름의 객체가 DOC-EXAMPLE-BUCKET라는 버킷에 저장된 경우,
DOC-EXAMPLE-BUCKET 버킷에 대한 권한이 있는 사용자는,
https://s3-bucket-endpoint/DOC-EXAMPLE-BUCKET/photos/puppy.jpg
라는 URL을 사용하여 객체에 액세스할 수 있다.
버킷은 기본적으로 계정에 최대 100개를 생성할 수 있다. (추가 가능)
객체 Object
객체는 간단히 말해서, 내가 업로드 하려고 하는 파일이라고 할 수 있다.
파일 및 해당 파일을 설명하는 모든 메타데이터를 말한다.
버킷에 저장할 수 있는 객체 수에는 제한이 없지만, 각 개체는 5TB 크기까지 가능하다.
객체란,
"버킷 + 키 + 버전" 과 객체 자체의 Map이라고 할 수 있다.
객체의 구성
1. 키
객체에 할당한 이름.
객체 키를 사용하여 객체를 검색한다.
2. 버전 ID
버킷 내에서 키와 버전 ID를 사용하여 각 객체를 고유하게 식별한다.
버전 ID는 버킷에 객체를 추가할 때 Amazon S3가 생성하는 문자열.
3. 값
실제 저장하는 콘텐츠.
바이트 시퀀스로 이루어져 있다.
4. Metadata
객체 관련 정보를 저장하기 위한 Key-Value 페어의 세트.
사용자 정의 메타데이터도 지정할 수 있다.
객체를 업로드한 후에는 객체 메타데이터를 변경할 수 없다.
메타 데이터는 시스템 정의 메타데이터와 사용자 정의 메타데이터로 나뉜다.
시스템 정의 메타데이터는 다시 시스템이 제어하는 파트와 사용자가 제어하는 파트로 나뉘며,
*시스템이 제어하는 파트*는 S3에서만 데이터를 제어할 수 있으며
*사용자가 제어하는 파트*는 사용자가 값을 제어할 수 있는 메타데이터를 뜻한다.
아래는 시스템 정의 메타데이터의 목록이다. 이 외에도 더 많으며, 자세한 내용은 공식문서를 참조하자.
이름 | 설명 | 사용자의 값 수정 여부 |
Date | 현재 날짜 및 시간. | 아니요 |
Cache-Control | 캐싱 정책을 지정하는 데 사용되는 일반 헤더 필드입니다. | 예 |
Content-Disposition | 객체 표현 정보입니다. | 예 |
Content-Length | 객체 크기(바이트). | 아니요 |
Content-Type | 객체 유형입니다. | 예 |
Last-Modified | 객체 생성일 또는 최종 수정일 중 최근 날짜. | 아니요 |
ETag | 객체의 특정 버전을 나타내는 엔터티 태그(ETag). 멀티파트 업로드로 업로드되지 않고 암호화되지 않거나 Amazon S3 관리형 키(SSE-S3)를 사용하는 서버 측 암호화를 통해 암호화된 객체의 경우 ETag는 데이터의 MD5 다이제스트입니다. | 아니요 |
x-amz-server-side-encryption | 객체에 대한 서버 측 암호화 사용 여부 및 해당 암호화 유형이 AWS Key Management Service(AWS KMS) 키(SSE-KMS)와 Amazon S3 관리형 암호화 키(SSE-S3)중 무엇인지를 나타내는 헤더. 자세한 내용은 서버 측 암호화를 사용하여 데이터 보호 섹션을 참조하세요. | 예 |
사용자 정의 메타데이터는
사용자가 직접 정의할 수 있는 메타데이터를 의미하며,
메타데이터를 업로드하기 위해서는, PUT, POST 요청을 할 때,
키-밸류 형태를 갖춰서 x-amz-meta- 로 시작하는 HTTP HEADER로 요청하면 된다.
예시)
PUT /Key HTTP/1.1
Host: DOC-EXAMPLE-BUCKET1.s3.amazonaws.com
x-amz-meta-nonascii: ÄMÄZÕÑ S3
https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/UsingMetadata.html
5, 하위 리소스
Amazon S3는 하위 리소스 메커니즘을 사용하여 객체 관련 추가 정보를 저장한다.
하위 리소스는 객체에 종속되므로 항상 객체, 버킷 등의 다른 항목과 연결된다.
하위 리소스는 acl을 의미한다.
acl은 객체에 대한 모든 제어 권한을 보유한 객체 소유자를 식별한다.
또한 객체 acl을 검색하거나 업데이트된 권한 부여 목록으로 교체할 수 있다.
6. 액세스 제어 정보
Amazon S3에 저장하는 객체에 대한 액세스를 제어할 수 있다.
Amazon S3는 ACL(액세스 제어 목록), 버킷 정책 등의 리소스 기반 액세스 제어와 사용자 기반 액세스 제어를 모두 지원한다.
Amazon S3 리소스는 기본적으로 비공개이기 때문에,
명시적으로 권한을 부여해야 다른 사용자가 이러한 리소스에 액세스할 수 있다.
리전
Amazon S3가 생성한 버킷을 저장하는 지리적 AWS 리전.
간단히 말해서, 내 버킷을 세계의 어떤 데이터 센터에 저장할 것이냐를 선택하는 것이다.
AWS 리전에 저장된 객체는 다른 리전으로 명시적으로 전송하거나 복제하지 않는 한 리전을 떠나지 않는다.
Amazon S3 데이터 일관성 모델
특징
1. 단일 키에 대한 업데이트는 원자적
예를 들어 한 스레드에서 기존 키에 대해 PUT 요청을 수행하고,
동시에 두 번째 스레드에서 동일한 키에 대해 GET 요청을 수행하는 경우,
이전 데이터 또는 새 데이터를 가져오지만 부분적이거나 손상된 데이터는 가져오지 않는다.
2. 고가용성
Amazon S3는 AWS 데이터 센터 내의 여러 서버에 데이터를 복제한다.
PUT 요청이 성공한 이후,
시작되는 모든 읽기(GET 또는 LIST 요청)는 PUT 요청에 의해 작성된 데이터를 반환한다.
*주의 할 점
1. Amazon S3는 동시 작성자에 대한 객체 잠금을 지원하지 않는다.
동일한 키에 대해 두 개의 PUT 요청이 동시에 수행되는 경우, 최신 타임스탬프가 포함된 요청이 우선한다.
트랜젝션을 걸고 싶은 경우, 자체적으로 객체 잠금 메커니즘을 구축해야 한다.
2. 업데이트는 키 기반으로 이루어진다.
특정 키를 업데이트했다고 해서, 다른 키의 업데이트를 같이 수행할 수 없다.
이 작업을 수행하고 싶다면, 직접 메커니즘을 구축해야 한다.
3. 최종 일관성 모델
버킷을 삭제하고, 즉시 모든 버킷을 나열하면, 삭제된 버킷이 여전히 목록에 나타날 수 있다.
버킷에서 처음으로 버전 관리를 활성화하면 변경 사항이 완전히 전파되는 데 약간의 시간이 걸릴 수 있기 때문에,
버킷의 객체에 PUT 또는 DELETE 요청을 실행하기 전에 버전 관리를 활성화한 후 15분 동안 기다리는 것이 권장된다.
S3 버전 관리
S3 버전 관리가 이루어지는 원리는 꽤나 흥미로웠다.
PUT
만약 버전 관리를 사용하는 버킷에 객체를 PUT할 때,
덮어씌워지는 것처럼 보이지만, 실제로는 덮어씌워지지 않는다.
버킷이 동일한 이름의 객체가 있는 것을 확인하면,
원래 객체를 버킷에 남겨둔 채로,
새 버전을 생성하고, 버킷에 추가한다.
DELETE
객체를 DELETE할 때,
객체를 영구적으로 삭제하지 않고, 버킷에 모든 버전이 유지되며,
단, 삭제 마커가 객체에 삽입된다.
그리고 삭제 마커가 붙은 객체가 객체의 최신 버전이 되며,
GET 요청을 해서 객체를 찾으려고 하면,
404 Not Found 오류를 반환한다.
버전 ID를 지정해서 GET
버전 ID를 지정해서 GET 요청을 하면, 최신 버전이 아닌 객체도 찾을 수 있다.
버전 ID를 지정해서 DELETE
버전 ID를 지정해서 DELETE 요청을 하면,
해당 객체 버전은 삭제 마커가 붙는 게 아니라, 영구적으로 삭제된다.
S3 요금
가장 일반적인 S3 Standard의 경우, 요금은 아래와 같다.
자세한 요금 관련 내용은 아래를 참조하자.
https://aws.amazon.com/ko/s3/pricing/
이 외에도
배치
- 단일 작업으로 수십억 개의 객체에서 지정된 작업을 수행할 수 있다.
Amazon S3 모니터링
- Cloud Trail, Cloud Watch, 이벤트 알림과 같은 다양한 모니터링 도구를 제공.
S3 Storage Lens
- 스토리지 사용에 대한 분석 기능을 제공하는 것.
정적 웹 사이트 호스팅
- 정적 컨텐츠를 포함하는 웹 사이트를 AWS S3에서 호스팅할 수 있는 기능.
- 버킷을 정적 웹 사이트처럼 사용할 수 있다.
Amazon S3 on Outposts
- 완전관리형 서비스로서, 온프레미스 시설에서 S3에 접근해서 객체를 저장, 검색하는 기능.
처럼 S3와 결합, 연동해서 사용할 수 있는 다양한 서비스가 존재한다.
'Skills > AWS' 카테고리의 다른 글
[AWS EC2로 배포하기] 3. 나의 프로젝트 EC2 배포하기 (0) | 2023.03.15 |
---|---|
[AWS EC2로 배포하기] 2. AWS 관련 용어 정리 (0) | 2023.03.15 |
[AWS EC2로 배포하기] 1. EC2, RDS (0) | 2023.03.15 |