S3
- 무한대로 확장 가능한 스토리지
- 다양한 서비스에서 사용 가능
- DB, 캐시 백업에도 사용
- 장애 회복에도 사용
- 정적 웹사이트 호스팅
- 미디어 처리
- 데이터 분석
- 소프트웨어 배포에도 사용
버킷
- 디렉토리 형태로 object(파일) 관리
- 모든 리전과 어카운트 내에서 유일한 이름을 가져야 함
- 리전 단위로 생성 가능
- 네이밍 컨벤션 존재
- 대문자, _ 사용 불가
- [3,63]자 이내로 생성
- IP 형식 안됨
- 숫자 또는 영어 소문자로 시작해야 함
- xn--으로 시작하면 안됨
- -s3alias로 끝나면 안됨 (별칭 생성 시 자동으로 생성되는 값임)
객체 (Object)
- 각 오브젝트는 키를 갖고 있다.
- 키는 접근할 수 있는 path
- 키 = prefix / 오브젝트 이름 (ex. kangwlgns/image.png)
- 그러나 디렉토리는 아님. 사람이 보기 편하게 만든 것
- 디렉토리 단위로 권한 처리나 사용자 할당 등이 불가능함.
- 개별 객체의 최대 크기는 5TB
- 5GB 이상 업로드하는 경우, multi-part 업로드를 사용해야 함
- 메타데이터는 키-값 형식으로 사용자 혹은 시스템 메타데이터를 저장
- 태그는 키-값 형식으로 라이프 사이클 관리 혹은 보안용도로 사용
- 버저닝 사용 가능 (파일 변경 시마다 자동으로 버전 id 부여)
내구성과 가용성
- 내구성
- 손실되는 정도
- 멀티 AZ간 오브젝트 내구성 매우 높음 (99.99999999999%)
- 천만개의 오브젝트를 저장한다고 가정하면, 1만년에 1개정도 손실됨
- 모든 스토리지 클래스가 동일한 내구성을 가짐
- 가용성
- 서비스가 얼마나 쉽게 가용 가능한지
- 스토리지 클래스마다 다름
- Standard의 경우 99.99%의 가용성
- 1년 중에 53분 정도는 접근이 안 될 수도 있겠다.
버저닝
- s3 오브젝트에 대해 버전 처리 가능
- 버킷 단위로 기능을 끄고 킬 수 있다.
- 실수로 삭제하는 경우 방지
- 롤백이 쉬움
- 버저닝을 처음 적용하면 이전 오브젝트의 버전은 null
복제
- 버저닝이 켜졌을 때만 사용 가능
- CRR(Cross Region Replication), SRR(Same Region Replication) 모두 지원
- CRR은 컴플라이언스, 리전 확장으로 낮은 지연율을 지향, 리전이 다른 계정간 복사를 위해 사용함
- SRR은 로그 통합, 테스트 환경에서도 상용 리소스를 사용을 위해 사용함.
- aws 계정 간 복사 가능
- 비동기 식으로 복사 발생
- 복제를 위한 적절한 iam 권한이 필요
- 신규 오브젝트부터 복제됨
- 기존의 오브젝트와 복제에 실패한 오브젝트들은 S3 batch replication을 사용해서 복사해야 함.
- 삭제 마커를 남겨서 복제 가능하지만, 버전 id로 삭제하면 복사되지 않음
- 버킷간 복제 체인 불가 A->B, B->C가 활성화 돼있다고 해서 A를 갱신하면 C가 바뀌진 않음
스토리지 클래스
- Standard
- 99.99% 가용성
- 자주 접근하는 데이터에 용이
- 낮은 지연시간, 많은 요청
- 2개의 동시성 장애 방지 장비 유지
- 빅데이터, 일반 앱, 컨텐츠 분할, 로그 수집 등에 사용
- Standard IA(Infrequent Access)
- 자주 접근하진 않지만, 필요한 경우 빠르게 접근
- 비용이 저렴
- 99.9% 가용성
- 백업, 장애 복구 용도로 사용
- One Zone IA
- 특정 AZ 한정으로 높은 내구성 (99.99999999999%)
- AZ에 문제가 생기면 손실됨
- 99.5% 가용성
- One zone만 사용하므로 가용성이 상대적으로 떨어짐
- Glacier
- 아카이빙 또는 백업 용도로 사용
- 가격정책: 저장비용(싸다) + 오브젝트 조회 비용(비싸다)
- Instant Retrieval
- 가져오는 데 밀리초 단위
- 분기에 한번 접근하는 경우에 유용
- 최소 90일의 보관 기간
- Flexible Retriever
- 조회 시간에 따라 Expedited(1-5분), Standard(3-5시간), Bulk(5-12시간)로 구분
- 최소 90일의 보관기간
- Bulk의 경우 조회 비용이 무료
- Deep Archive
- 조회 시간에 따라 Standard(12시간), Bulk(48시간)로 구분
- 최소 180일의 보관기간
- 장기 보관 용도
- Intelligent Tiering
- 월간 모니터링 비용과 자동 티어링 비용이 다소 있음
- 사용량에 따라 자동 티어링
- 데이터 조회비용은 따로 없음
- 자동 티어링 비용이 존재하지만, 운영 초기에 라이프 사이클 룰이 지정되지 않았다면 사용하는 것을 권장
- Frequent - 기본
- Infrequent - 30일간 조회되지 않은 경우
- Archive Instant - 90일간 조회되지 않은 경우
- Archive Access - 사용자가 [90,700]일 사이로 지정, 지정하지 않으면 넘어가지 않음
- Deep Archive - 사용자가 [180,700]일 사이로 지정, 지정하지 않으면 넘어가지 않음
스토리지 클래스 변경
- 오브젝트를 스토리지 클래스 변경이 가능
- 자주 쓰면 Standard, 자주 쓰지 않으면 IA 등.. 용도에 맞게 적절히 변경 가능
- Life Cycle Rule을 사용하면 자동화해서 관리 가능
Life Cycle Rule
- 전송 액션
- 오브젝트를 다른 스토리지 클래스로 전송하도록 지정
- ex. 생성 이후 60일이 지나면 IA로 이동
- 만료 액션
- 특정 시점이 지나면 오브젝트를 삭제
- 버저닝 사용 시, 오래된 버전을 삭제
- 완료되지 않은 multi-part(큰 용량의 파일을 여러번 걸쳐서 보내는 경우) 업로드 파일 삭제
- ex. log 파일 1년 뒤 삭제
- 스토리지 클래스 분석
- 언제 적절한 클래스로 오브젝트를 이전할지 도와줌
- 스탠다드, 스탠다드IA 중 적절하게 추천
- 일간 단위로 리포트 업데이트
- 결과 확인은 1~2일 정도 걸림
- Lifecycle을 초기에 적용할 때 괜찮음.
- 거버넌스를 잡을 때 좋음
비용
- 버킷 관리자가 비용 지불
- 요청자 지불 버킷을 사용하면 요청자가 데이터 다운로드 비용 지불 (타 계정과 협업 시 유용)
- 요청자도 AWS를 통한 인증이 되어야 함.
이벤트 알림
- 오브젝트에 액션이 발생하면 이벤트 발행 가능
- S3:ObjectCreated, ObjectRemoved, ObjectRestore, Replication 등의 액션에 적용 가능
- 오브젝트 이름 필터로 개별 관리 가능
- 이미지 후처리작업이 필요한 경우 등에 사용 가능 (이 경우는 시스템에 이벤트를 발행하는 것)
- 이벤트 숫자에는 제한이 없음. (그냥 Pub/Sub 구조)
- 람다, SQS, SNS 등의 서비스로 이벤트 핸들링 가능
- 대부분 1초 이내에 이벤트가 전달, 가끔은 좀 걸림
이벤트 브릿지
- 이벤트 브릿지 서비스를 통해 연결 가능
- JSON 정책을 기반으로 더 심화된 필터 적용 가능
- 다양한 목적지로 이벤트 전달 가능
- 비동기적 이벤트 전달
- 이벤트 아카이빙, 재시도, 전달 확인 등의 기능 지원
성능
- S3는 부하가 많아지면 자동으로 스케일링(지연율을 100ms~200ms로 유지)
- prefix 초당 처리량 기준 PUT,COPY,POST,DELETE는 3500개 이상의 요청
- GET,HEAD는 5500개 이상의 요청
- prefix 수의 제한 없음
- prefix 별로 분산해서 요청하면 병렬로 처리 가능 (ex. 서로 다른 두 prefix 호출 시 GET 요청 날리면 11000개를 불러올 수 있음)
Multi-Part upload - Upload
- 100MB 이상 파일에 추천
- 5GB 이상이면 필수
- 병렬 처리로 전송 속도 상승
S3 Transfer Acceleration - Upload
- 장거리 파일 전송을 가속화
- AWS Edge location으로 파일을 전송하고, Edge location이 대상 리전의 S3로 전송하는 방식
- ex. 미국에서 edge location으로 파일 전송, AWS 내부망(빠름)을 통해 edge location to S3
- 멀티 파트 업로드와 호환 가능
S3 Byte-Range Fetches - Get
- 병렬로 GET 요청
- 바이트 단위를 지정해서 해당 단위로 분산해서 데이터 요청
- 다운로드 실패에 견고함. (fali에 대해 부분별로 재시도가 가능)
- 다운로드 속도 증가
- 특정 부분만 가져올 수 있다. (첫 1500바이트만 가져와서 확인한다든가..)
S3 Select & Glacier Select - Get
- 서버 사이드 필터링을 사용해서 SQL을 기반으로 적은 양의 데이터 가져옴
- 기존 서비스가 S3에서 냅다 가져와서 다른 서비스에서 조작하는 거였으면, 얘는 S3에서 미리 필터링해서 적은 양을 보내는 것
- 정형 데이터 파일을 가져올 때 SQL 구문으로 가져올 수 있다.
- 빠르고 저렴하다.
- 단순한 SQL 구문으로 열과 행을 필터링 가능
- 네트워크 전송량을 줄이고, 클라이언트의 CPU 비용 감소
S3 Inventory - Get
- S3 Inventory는 List 요청 X
- S3 API로 불러오는 GET 요청은 초당 5500건 정도, 배치 처리에는 부족할 수 있음
- 그래서 GET, LIST 등 API 요청이 아닌 별도의 탐색 서비스
- 그러므로 배치 작업이 터져도 상용 작업(API)는 멀쩡함.
S3 Batch Operation - Update
- 올려놓은 S3 오브젝트에 대한 일괄 처리를 한번의 요청으로 처리
- 암복호화
- 메타데이터나 속성 일괄 변경
- ACL 혹은 태그 수정
- Glacier에 있는 오브젝트 일괄 복구
- 개별 오브젝트에 대한 람다 함수 호출해서 조작(이미지 리사이즈해서 다시 저장한다거나)
- 등등
- 오브젝트 리스트, 수행작업, 추가적인 매개변수를 전달해서 사용
- 재시도, 작업 수행 트래킹, 완료 알림 전송, 결과 레포트 생성 등의 작업을 진행
- S3 select, S3 Inventory와 연동 가능
- 클라이언트가 Batch작업 요청하면, S3 Inventory가 S3 Select에 목록 전달, Select가 필터링해서 다시 Batch로 전달, Batch Operation이 오브젝트에 대한 변경 작업 수행
보안
- 사용자 기반
- IAM 정책을 사용하여 특정 IAM 사용자를 허용
- 명시적인 DENY는 없어야 한다. (당연)
- 리소스 기반
- 버킷 정책: s3 콘솔에서 설정한 버킷 단위의 룰
- Object ACL: 객체 단위 ACL 구성
- Bucket ACL: 버킷 단위 ACL 구성
버킷 정책
- JSON 형태
- Resource: 대상 버킷 혹은 오브젝트
- Effect: allow or deny
- Action: 수행할 수 있는 작업 (get, pu 등등)
- Principal: 계정 혹은 사용자 지정
- 버킷을 외부 공개용으로 구성할 때 사용
- 업로드 시점에 암호화 강제 가능
- 다른 aws 계정에서 올리도록 할 수 있음
ACL
암호화
- SSE-S3
- 기본 설정
- S3 오브젝트 암호화에 사용하는 키를 AWS가 소유, 관리, 핸들링
- 완전 관리
- AES-256 암호화
- 헤더에 "x-amz-server-side-encryption" : "AES256" 추가해야 함.
- SSE-KMS
- AWS Key Management System(AWS KMS)을 사용해서 키 관리
- KMS를 사용해서 사용자가 키를 컨트롤 가능
- 키에 대한 변경, 사용은 CloudTrail에서 추적 가능
- KMS 제한에 영향을 받을 수 있다.
- 업로드 및 다운로드 시점에 KMS API를 쓰기 때문에 KMS 초당 요청 제한에 걸릴 수 있음.
- 헤더에 "x-amz-server-side-encryption" : "aws:kms" 추가해야 함.
- 더 많은 요청이 필요하다면 Service Quotas Console을 통해 요청할 것.
- SSE-C
- 사용자가 제공한 키를 이용한 암호화
- 완전 자유
- S3가 키를 저장하지 않음
- HTTPS 통신 강제 (키 탈취 방지)
- 암호화 키가 반드시 헤더에 포함되어야 하고, 모든 API 요청에 대해 포함해야 함.
- Client Side Encryption (CSE)
- 클라이언트 라이브러리 사용 (ex. Amazon S3 Client-Side Encryption Library)
- 클라이언트는 반드시 S3 업로드 전에 데이터 암호화
- 마찬가지로 반드시 데이터를 가져온 뒤 복호화해야 함.
- 사용자가 모든 암호화 과정을 관리 (매우 특수한 상황)
- SSL/TLS
- 전송간 암호화
- S3는 HTTP / HTTPS 엔드포인트 제공하지만, SSL/TLS는 HTTPS만 지원
- SSE-C는 반드시 HTTPS, 그 외에는 HTTPS 권장
- Bucket Policy를 통해 HTTPS 강제 가능 ("aws:SecureTransport": true)
Bucket Policy
- 실제 S3로 요청이 가기 전에 만나는 장벽
- Bucket Policy를 통해 SSE-KMS, SSE-C와 같은 암호화를 사용할 수 있다. (필수 헤더 없으면 deny)
CORS
- 서로 다른 두 Origin에서 resource를 공유하는 것
- Origin: scheme + 호스트(도메인) + 포트로 구분
- 웹 브라우저 기반 기술
- 다른 오리진으로 향하는 요청을 허용할지 말지 결정
- 타 사이트에서 내 정보를 빼가지 못하도록 함.
- Access-Control-Allow-Origin으로 허용할 origin을 지정 (ex. https://www.example.com)
- Access-Control-Allow-Method로 허용할 method를 지정 (ex. POST, GET)
- MaxAgeSeconds로 브라우저가 인증을 캐시할 수 있는 시간을 지정할 수 있음.
- preflight request(OPTIONS)를 통해서 헤더를 전달한 후에, 헤더를 확인하고 허락된 origin과 method인지 확인하는 절차(CORS)를 거친다.
MFA
- 사용자가 S3에서 중요한 동작을 할 때 별도의 애플리케이션 또는 디바이스를 통해 한번 더 인증 하도록 함.
- 오브젝트의 버전 삭제, 버킷 버저닝 중지 등 사용 상의 지장을 주는 행동들에 MFA를 적용할 수 있음.
- 버저닝을 동작시키는 등의 동작은 지장을 주지 않으므로 인증 불필요
- 버저닝이 적용됐을 때만 사용할 수 있다.
- 버킷 소유자만 MFA 설정을 건드릴 수 있다.
Access Logs
- S3 버킷에 대한 활동을 로깅
- 모든 AWS 계정, 인증되거나 인증되지 않은 모든 요청들이 다른 로깅용 버킷에 저장됨
- 로깅용 버킷도 동일 리전에 있어야 함.
- 절대절대절대 로그를 같은 버킷에 넣으면 안된다.
- 왜냐면 로그를 쌓는 작업에 대한 로그를 쌓는 무한 루프가 발생하기 때문에 비용이 엄청나게 됨.
Pre Signed URL
- 특정 시간이 지나면 만료되는 url 생성 가능
- pre-signed url은 S3 콘솔, CLI, SDK에서 사용 가능
- 콘솔에서 만들면 [1,720]분 동안 유효
- CLI를 통해 생성하면 168시간까지 설정 가능
- 생성할 때 만들어진 GET / PUT에 대한 권한을 최종 사용자가 가질 수 있음.
- 로그인한 사용자에게만 다운로드 URL 제공할 때, 일시적으로 권한을 부여하는 경우 등등 사용 가능
- 항상 public으로 여는 경우는 없기 때문에 유용하게 쓸 수 있다. (웹페이지 assets 제외)
Glacier Vault Lock
- Vault Lock Policy를 생성해서 적용 가능
- 한번 작성되면 삭제 및 변경 불가
- 컴플라이언스, 데이터 불변성 보장되어야 할 때 사용
- Write Once Read Many(WORM) 모델
Object Lock
- 오브젝트 버저닝이 활성화 되어 있어야 함.
- 오브젝트의 버전 삭제를 특정 기간동안 방지
- 마찬가지로 WORM 모델
- 설정한 Retention 기간 동안 오브젝트를 lock할 수 있다. (연장 가능)
- legal hold 기능을 사용하면 retention과 별도로 오브젝트를 무기한 보호
- Retention Mode - 컴플라이언스
- 모든 계정에 대해 오브젝트 버전 덮어쓰기 및 삭제 불가
- 모드 변경 불가, 기간 조정 불가
- Retention Mode - 거버넌스
- 권한이 있는 일부 사용자만 설정을 변경하거나 오브젝트 삭제 가능
Access Point
- S3 버킷에 대한 보안 관리
- DNS에 맞게 접근하는 사람을 제한하는 기능
- 개별 DNS 이름을 갖는다
- 버킷 정책과 비슷한 access point policy를 갖는다.
- 하나의 버킷에 여러개 생성 가능
- VPC origin
- VPC 내부에서만 Access Point에 접근 가능
- VPC Endpoint를 반드시 생성해야 함
- Endpoint 정책에 대상 버킷의 Access Point에 접근 가능하도록 해야 한다.
- Internet origin
- 인터넷에서도 Access Point에 접근 가능한 듯.
- AWS 리소스에서 이쪽으로 접근하면 보안, 성능, 비용 측면에서 손해일 듯.
Object lambda Access Point
- point에 접근하면 애플리케이션이 오브젝트를 읽어오기 전에 lambda가 먼저 오브젝트를 변경
- 하나의 버킷에 여러개 생성할 수 있음.
- 원본은 수정하기 싫은데 전처리가 필요한 경우 사용하면 된다.
안정성과 비용, 속도를 위해 S3에 대한 이해를 바탕으로 각 서비스를 다룰 수 있도록 한다.
'자격증 > SAA' 카테고리의 다른 글
[SAA] Global Accelerator (0) | 2024.12.06 |
---|---|
[SAA] CloudFront (0) | 2024.12.06 |
[SAA] Route53 (0) | 2024.11.20 |
[SAA] Elasticache (0) | 2024.11.20 |
[SAA] RDS (0) | 2024.11.15 |