📌 S3(Simple Storage Service)란?
- 안전하고 가변적인 Object 저장공간을 제공
(object란 이미지, 동영상, 파일을 의미하며 즉, 운영체제 업로드해서 사용하는 것은 안됨)
- 편리한 UI 인터페이스를 통해 어디서나 쉽게 데이터를 저장하고 불러올 수 있음
- 파일 크기는 0KB부터 5TB까지 지원
- 저장공간 무제한
(파티션 크기를 변경하거나 디스크 크기를 변경하지 않아도 파일을 마구 올려도 된다.)
- Bucket이라는 이름을 사용함
(디렉토리와 유사함)
- Bucket은 보편적인 namespace를 사용함
(IAM과 마찬가지로 S3는 글로벌로 되어 있다. 따라서, 리전과 상관없이 Bucket 이름은 고유해야 한다)
S3 Object 구성요소
- Key : 파일명
- Value : 파일에 대한 데이터
- Version ID : 버전 id를 통해 이전 버전으로 쉽게 복원할 수 있음
- Metadata : 데이터의 데이터라는 뜻이며 언제 파일이 업로드 되었는지, owner, 수정 등
- CORS (Cross Origin Resource Sharing) : 지역 무시하고 한 버켓의 파일을 다른 버켓에서 접근 할 수 있도록 함
S3 Data Consistency Model
- Read after Write Consistency (PUT)
파일이 S3버켓에 올라간다면 즉시 쓸 수 있다, delay없음
- Eventual Consistency (UPDATE, DELETE)
버켓에 올라간 파일 내용을 변경 시키거나 삭제 그 결과가 S3에서는 바로 나타나지 않음
다양한 S3 스토리지 타입
내구성이란? 얼마나 데이터 손실 없이 잘 복원 되는지
가용성이란? 얼마나 데이터 접근이 용이한지
- 일반 S3
가장 보편적으로 사용되는 스토리지 타입
높은 내구성, 가용성 (Durability, Availability)
- S3 - IA (Infrequent Access)
자주 접근되지는 않으나 접근시 빠른 접근이 요구되는 파일이 많을시 유용
일반 S3에 비해 비용은 저렴하나 접근시 추가 비용 발생
멀티 AZ를 통한 데이터 저장 -> 높은 가용성
- S3 - One Zone IA
단일 AZ를 통한 데이터 저장
단일 AZ에 의한 데이터 접근 제한 (조금 낮은 가용성) -> 서버 다운과 같은 문제들로 데이터 접근에 여러 제한
데이터 접근시 S3 - IA보다 20% 비용 저렴
- Glacier
거의 접근하지 않을 데이터 저장 시 유용
매우 저렴한 비용
데이터 접근시 대략 4-5시간 소요
- Intelligent Tiering
데이터 접근 주기가 불규칙할때 매우 유용
2가지 티어 존재 - 서로 옮긴다
Frequent Tier
Infrequent Tier : 데이터 접근이 한달이상 없을 경
데이터 접근주기에 따라 두가지 티어중 하나로 선택됨
Frequent Tier가 비용이 약간 더 비쌈
최고의 비용 절감 효율을 누릴 수 있음
S3 요금
- GB당 지불
- PUT, GET, COPY 요청 횟수당
- 데이터 다운로드시 / 다른 리소스로 전송시에 따라 비용 달라짐
- Metadata (object tag) : 어떤 오브젝트가 특정 태그가 걸려있다고 하면 어떤 부서에서 사용되는지일 경우 추가적인 비용이 들어간다
S3 사용 용례
S3 버켓 만들고 나서 aws는 보안적인 측면을 생각하여 막아두는 게 있다.
- 파일 저장소 (로그, 다양한 파일들(이미지, 비디오, 압축파일 등)
S3에 특정 파일이 업로드될 시, 어떤 이벤트를 트리거 시켜 다른 서비스를 실행 시키는 것도 S3 사용
- 웹사이트 호스팅
html, css, javascript와 같은 파일들을 올려 실제 웹사이트를 돌리기 위한 파일 업로드, S3를 도메인 dns로 사용할 수도 있다.
참고로 Route 53를 사용하여 도메인을 S3 버켓에 사용할 수도 있다.
- CORS
S3버켓도 특정 리전이 존재한다, 리전이 다른 버켓 두개 중 하나의 버켓이 다른 버켓으로 접근한다면 리전이 달라서 에러가 뜨는데, 이런 오류를 해결해주는 게 CORS이다.
최초 S3 버켓 생성시 -> 비공개(PRIVATE)
최초 버켓을 생성시 버켓을 만든 사람만이 그 버켓에 접근 할 수 있음
다른 사람들이 접근권한을 주기 위해서는
1. 버켓 정책(.json) 변경 (Bucket Policy)
버켓 안에 있는 모든 파일들에게 적용
2. 접근 제어 리스트 변경 (Access Control List)
파일 하나하나에 다른 접근 권한을 부여할 수 있음 //즉 사람마다 다르게 파일 접근 권한 줄 수 있음
S3 암호화
- 파일 업로드/다운로드시
- SSL / TLS : S3에서 파일 업로드 다운로드시 일어나는 보안
- 가만히 있을시
① SEE-S3 : S3버켓에 저장되어 있는 모든 object들은 고유한 키를 가지고 있는데, SEE-S3는 마스터키(AES-256)를 일정 시간마다 변경
② SSE-KMS : S3에서 일괄적으로 관리, SSE-KMS를 통해 언제, 누가, 어떻게 암호를 풀었는지에 대한 기록이 복원되어 있음
③ SSE-C : 암호키를 직접 다룰 수 있으며 따라서 키 값을 변경 시켜줘야한다
위는 S3에 파일 업로드 시 PUT 요청이 생성, 헤더는 파일 이름, Host버켓이름, Date언제 업로드 되어있는지 등등의 내용이 들어가 있다.
만약 , 파일이 업로드 될시 암호화된다면 헤더에 x-amz-server-side-encryption-paramerer가 함께 나간다. 즉, S3에 파일을 업로드될 시 PUT 요청의 헤더에 x-amz-server-side-encryption-paramerer가 있다면 우리가 암호화 요청을 건 것으로 간주하고 암호화를 걸어준다.
S3의 중요 포인트
S3에서는 리전 선택 x , 글로벌
버켓 이름 지역과 상관없이 고유한 이름, 다른 지역이라고 같은 버켓 이름 줄 수 없다
이미 올려놓은 파일은 퍼블릭 액세스로는 불가, 버켓 정책 가능
Q. 암호화가 걸리지 않은 파일을 버켓에 못올리게 하는 기능은 없을까요?
버켓 정책 설정 이용하면 된다