S3 (Simple Storage Service)
- 안전하고 가변적인 Object(운영체제는 사용X) 저장공간을 제공 (ex: Google Cloud)
AWS에서 모든 파일에 안전장치를 걸어 외부에서 접근을 막아 안심하고 쓸 수 있음.
알아서 저장공간을 조절함
- 편리한 UI 인터페이스를 통해 어디서나 쉽게 데이터를 저장하고 불러올 수 있음
- 파일 크기는 0KB부터 5TB까지 지원
- 저장공간 무제한(가변적이니 직접 파티션/디스크 용량 설정X)
- Bucket이라는 이름을 사용함 (디렉토리와 유사함)
- Bucket은 보편적인 namespace를 사용함 (버켓이름은 고유해야한다. IAM처럼 S3도 지역이 글로벌임 -> 리전과 상관없이 고유해야함)
S3 Object 구성요소
- Key : file 명
- Value : file에 대한 data
- Version ID : S3의 고유특징. 같은 파일이라도 다른 버전으로 올릴 수 있도록. (이전으로 복원 가능)
- Metadata : data의 data로 data에대한 정보가 들어있음(누가 올리고 언제올리고 ...)
- CORS (Cross Origin Resource Sharing) : 한 버킷의 파일을 다른 버킷에서 접근 할 수 있도록 함(지역 상관 X)
S3 Data Consistency Model
- Read after Write Consistency (PUT)
- S3 버켓에 데이터 넣을 때 PUT을 사용함. API처럼. 파일이 S3버켓에 올라가면 그 파일을 즉시 사용할 수 있다는 것. 딜레이가 없음
- Eventual Consistency (UPDATE, DELETE)
- 버켓에 올라간 데이터를 처리할 시 그 결과가 바로 나타나지 않음. 외부에선 바로 나타나는 것 같지만 S3 내부에선 그렇지 않음!
S3는 단순 HDD가 아니라 다양한 스토리지 시스템이 있음
S3 스토리지
- 일반 S3
- S3 - IA (Infrequent Access)
- S3 - One Zone IA
- Glacier
- Intelligent Tiering
- 일반 S3
- 가장 보편적으로 사용되는 스토리지 타입
- 높은 내구성, 가용성 (Durability, Availability)
- 내구성 : 손상없이 잘 복원되는지
- S3 - IA (Infrequent Access)
- 자주 접근되지는 않으나 접근시 빠른 접근이 요구되는 파일이
많을시 유용 (자주쓰는거엔 적합하지 X)
- 일반 S3에 비해 비용은 저렴하나 접근시 추가 비용 발생
- 멀티 AZ를 통한 데이터 저장
- S3 - One Zone IA
- 단일 AZ를 통한 데이터 저장 (서버다운되면 접근 X)
- 단일 AZ에 의한 데이터 접근 제한 (조금 낮은 가용성)
- 데이터 접근시 S3 - IA보다 20% 비용 저렴 (비용과 접근성을 잘 생각해봐야함)
- Glacier
- 거의 접근하지 않을 데이터 저장 시 유용 (몇년에 1-2번 접근할까말까)
- 매우 저렴한 비용
- 데이터 접근시 대략 4-5시간 소요(빙하에 저장한거잖오 녹여야해ㅋㅋ)
- Intelligent Tiering
- 데이터 접근 주기가 불규칙할때 매우 유용
- 2가지 티어 존재(분석해서 부여함)
- Frequent Tier
- Infrequent Tier(한달이내에 접근 없으면 IT로 바꿈)
- 데이터 접근주기에 따라 두가지 티어중 하나로 선택됨
- Frequent Tier가 비용이 약간 더 비쌈
- 최고의 비용 절감 효율을 누릴 수 있음 (1,000개에 0.25$)
S3 요금
➢ GB당 (GB당 0.023$ 정도?)
➢ PUT, GET, COPY 요청 횟수당 (다른 버킷으로 얼마나 보내는지, 얼마나 자주 데이터를 쓰는지)
➢ 데이터 다운로드시 / 다른 리소스로 전송시
➢ Metadata (object tag)
S3 - 버켓 생성시 알아야 할 것들
생성 후 보안을 위해 막아두고 있는게 있음
S3 사용 용례
- 파일 저장소 (로그, 다양한 파일들(이미지, 비디오, 압축파일 등))
어떤 파일이 S3에 들어오면 다른 서비스와 연동시키는 작업도 가능함
- 웹사이트 호스팅
thml, css, js 파일을 올려서 web을 돌리기 위한 파일을 업로드 한 후, S3를 실제 도메인 DNS로 사용할 수 있음 (Route 53을 이용해서 S3를 도메인으로 할 수 있음)
- CORS(Cross Origin Resource Sharing)
웹사이트 호스팅과 비슷함 S3도 특정 리전이 있음. 버켓A(웹사이트 호스팅),B(데이터 업로드)가 다른 리전에 있음 -> 버켓 A에서 B에 있는 데이터 접근을 하려면 리전이 달라서 접근 불가 -> 이걸 해결하는게 CORS
최초 S3 버켓 생성시 -> 비공개(PRIVATE)
- 버켓 정책 변경 (Bucket Policy)
JSON으로 되어있음
- 접근 제어 리스트 변경 (Access Control List)
파일 하나하나에 다른 접근 권한 줌
S3 암호화(Encryption)
- 파일 업로드/다운로드시 (AWS에서 관리)
- SSL(Secure Socket Layer) / TLS(Transport Layer Security)
- SSL : 주소 앞에 https가 붙어 주소가 안전하다고 알려줌
- TLS : SSL에서 파생됐으나 업데이트된 보안 시스템
- 가만히 있을시
1) SEE-S3
: S3버킷에 올라간 파일들은 고유의 키가 있음. SEE-S3는 마스터키가 있어서 일정시간마다 키값을 변경시킴. 마스터키의 키값은 AES-256bit로 구성됨
2) SSE(Server-Side Encryption)-KMS
: SEE-S3처럼 AWS에서 일괄 관리. 언제 누가, 어떻게 암호를 풀었는지에대한 기록이 있어 체계적인 관리 가능(SEE-S3는 이기능 없음)
3) SSE-C
: 직접 암호키값을 다룰 수 있음 -> 계속 변경시켜줘야함.
S3 암호화 과정
# 파일이름, 버켓이름, 등 metadata 생성
PUT /simon-image.jpg HTTP/1.1 # 파일이름
Host: SimonBucket.s3.<Region>.amazonaws.com # 버켓이름
Date: Thu, 12 Feb 2020 14:26:00 GMT #언제 요청이 생성됐는지
Authorization: authorization string
Content-Type: text/plain
Content-Length: 82253
x-amz-meta-author: Simon
Expect: 100-continue
[82253 bytes of object data]
x-amz-server-side-encryption-paramerer
가 딸려나오는게 중요함
만약 S3에 업로드될때 헤더에 해당 파라미터가 있으면, 암호화를 요청한 것으로 간주해서 암호화 함
Host: SimonBucket.s3.<Region>.amazonaws.com
Date: Thu, 12 Feb 2020 14:26:00 GMT
Authorization: authorization string
Content-Type: text/plain
Content-Length: 82253
x-amz-meta-author: Simon
Expect: 100-continue
x-amz-server-side-encryption-parameter: AES-256 ## 이 부분
[82253 bytes of object data]
암호화 알고리즘으로 AES-256걸로 설정했다고 알 수 있음
Q. 암호화가 되지 않은 파일은 올리지 않는 기능은 없나용?
- 있음! 버켓정책설정에서 조절 가능. 암호화 없으면 Reject 하는거.
실습!
-
S3는 글로벌 서비스라 모든 지역 사용함. -> 리전 선택할 필요 없음
-
버켓이름 : 지역에 상관없이 유일한 이름!
-
기타 설정 : 객체 잠금
WORM(Write-Once-Read-Many) 모델을 사용하여 객체를 저장하면 고정된 시간 동안 또는 무기한으로 객체가 삭제되거나 덮어쓰이지 않도록 할 수 있습니다 (= 원본 파일 그대로 저장하고 싶을 때)
-
메타데이터 : 나중에 sort할 때 유용하게 쓸 수 있음
이미지 열기
-
URL로도 가능한데, 우선은 거부당함. -> 퍼플릭 접근을 차단했기 때문
-
파일을 퍼블릭으로 해도 거부당함 -> 버켓 정책에서 변경, 파일의 ACL(액세스 제어 목록)도 변경해주면 URL로도 읽기가 가능해집니당(다른 파일은 읽기X)
-
버켓의 정책을 변경하기 위해서 정책 편집에 들어가고 JSON형식에 벙찌지 말구 편하게 정책 생성기를 눌러줍니다
Principal엔 IAM 값을 넣어주고, 밑에 ARN은 바로 위 사진에 있는 버켓 ARN을 넣어주면 JSON값이 만들어지고 이를 정책에 넣어주면 됩니다!
그리고 이런저런 정책을 추가해주면 되겠죠~?
보안 설정
- 신규 버켓을 만들 때 서버측 암호화 활성화를 시키면 아까 봤던 SSE-S3, SSE-KMS 등을 선택할 수 있습니다:)
- 그리고 파일을 올릴때도 암호화 설정을 활성화 시켜주면 파일에 서버암호화가 걸린 것을 확인할 수 있습니다:)!