
[storage] Amazon S3
그냥 파일을 담는 곳이 아닙니다. 버전 관리, 복제, 암호화, 접근 제어까지 — 객체 스토리지의 진짜 실력을 봅니다.
스토리지 클래스(비용/접근 계층)는 s3-storage-classes.md에서 별도로 다룬다. 이 노트는 S3의 핵심 기능 — 버저닝·복제·암호화·접근 제어·이벤트·Object Lock 에 집중한다.
One-Line Summary
Amazon S3는 사실상 무한히 확장되는 객체 스토리지로, 파일(객체)을 버킷에 키-값으로 저장하고 HTTP API로 접근한다. 11 9s(99.999999999%) 내구성과 리전 다중 AZ 저장이 기본이며, 정적 자산·데이터 레이크·백업·아카이브의 표준이다. 시험에서는 버저닝 / 복제(CRR·SRR) / 암호화(SSE-S3·KMS·C) / 접근 제어(버킷 정책·Block Public Access·presigned) / 이벤트 알림 / Object Lock(WORM) 이 핵심이다.
뭔지 (What / Why) — 파일 시스템이 아니다
S3는 EBS·EFS 같은 파일/블록 스토리지가 아니라 객체 스토리지다. 마운트해서 랜덤 쓰기를 하는 게 아니라, 객체 단위로 통째로 PUT/GET한다(HTTP API).
버킷(전역 유일 이름)
└─ 객체 = 키(예: photos/2026/cat.jpg) + 값(데이터) + 메타데이터 + 버전ID
* 폴더처럼 보이는 건 키의 접두사(prefix)일 뿐, 실제 계층 구조는 없다(flat)
| 성질 | 내용 |
|---|---|
| 확장성 | 객체 수·용량 사실상 무제한 (객체 하나 최대 5TB) |
| 내구성 | 11 9s — 여러 AZ에 자동 중복 저장 |
| 범위 | 버킷은 리전에 생성, 단 버킷 이름은 전역 유일 |
| 일관성 | 강력한 read-after-write 일관성(쓰고 바로 읽으면 최신값) — 별도 설정 불필요 |
| 접근 | REST API / SDK / CLI (파일시스템 마운트 아님) |
"무한 확장 객체 저장 / 정적 자산 / 데이터 레이크 / 백업·아카이브" = S3. "마운트해서 여러 서버가 파일 공유" 는 EFS/FSx(S3 아님).
버저닝 (Versioning) — 실수/삭제 보호 (빈출)
버킷에 버저닝을 켜면 같은 키에 덮어써도 이전 버전이 보존되고, 삭제해도 실제로 지워지지 않고 **삭제 마커(delete marker)**가 얹힌다.
cat.jpg 업로드 → v1
cat.jpg 다시 업로드 → v2 (v1도 그대로 보존)
cat.jpg 삭제 → delete marker (v1·v2는 남아있음, 복구 가능)
- 실수로 덮어쓰기/삭제한 데이터를 되돌릴 수 있다.
- 한 번 켜면 끄기(disable)는 불가, 일시 중단(suspend)만 된다.
- 복제(Replication)의 전제 조건이기도 하다.
시험 트리거: "protect against accidental delete/overwrite" → Versioning(+ 강화하려면 MFA Delete).
복제 (Replication) — CRR vs SRR (빈출)
객체를 다른 버킷으로 자동 복제한다. 양쪽 버킷 모두 버저닝 필수, 복제는 비동기.
| CRR (Cross-Region) | SRR (Same-Region) | |
|---|---|---|
| 대상 | 다른 리전 버킷 | 같은 리전 다른 버킷 |
| 대표 용도 | 재해 복구(DR), 지역 간 지연 감소, 규정상 지역 분산 | 로그 집계, 운영/테스트 계정 간 복제, 데이터 주권 |
핵심 포인트:
- 소급 복제 안 됨 — 켠 이후 객체만. 기존 객체는 S3 Batch Replication 필요.
- 다른 계정으로도 복제 가능(교차 계정 백업).
- 삭제 마커 복제 여부 등은 옵션.
시험 트리거: "replicate to another region for DR/latency/compliance" → CRR. "same region, log aggregation / cross-account" → SRR. "왜 복제가 안 되지" → 버저닝 미설정 또는 기존 객체(소급 안 됨).
암호화 (Encryption) — 4가지 (빈출)
S3는 저장 데이터 암호화를 여러 방식으로 제공한다. (2023년부터 모든 새 객체는 기본 SSE-S3로 암호화된다.)
| 방식 | 키 관리 | 언제 |
|---|---|---|
| SSE-S3 | S3가 키 관리(AES-256) | 기본값. 별 요구 없으면 이걸로 충분 |
| SSE-KMS | KMS 키 사용 | 키 접근 감사(CloudTrail)·권한 통제·회전이 필요할 때 |
| SSE-C | 고객이 키 제공 | 키를 AWS에 안 맡기고 직접 들고 올 때 |
| Client-Side | 고객이 업로드 전에 암호화 | S3 도달 전부터 암호화해야 할 때 |
- SSE-KMS 주의: 객체가 많으면 KMS 호출 비용·스로틀 → S3 Bucket Key로 호출 절감(KMS 노트 참고).
- 전송 중 암호화: HTTPS(TLS). 버킷 정책으로
aws:SecureTransport를 강제해 HTTP 차단 가능.
시험 트리거: "encrypt at rest, audit key usage / control key access" → SSE-KMS. "manage encryption keys yourself, keys never stored in AWS" → SSE-C. 자세한 키/봉투암호화는 security/kms.md.
접근 제어 & 보안 (빈출)
S3 접근은 여러 계층으로 통제된다. 기본은 전부 비공개(private) 다.
| 메커니즘 | 역할 |
|---|---|
| Block Public Access | 계정·버킷 수준에서 퍼블릭 노출을 원천 차단(기본 ON). 실수 방지 최우선 방어선 |
| 버킷 정책(Bucket Policy) | 버킷에 붙는 리소스 기반 정책(JSON) — 교차 계정 허용·조건(IP·HTTPS 강제) |
| IAM 정책 | 사용자/역할(주체) 기반 권한 |
| ACL | 객체/버킷 단위 레거시 방식(신규 설계는 지양, 정책 사용) |
| Presigned URL | 생성자의 권한으로 시간 제한 임시 URL 발급 — 비공개 객체를 잠깐만 공유 |
- 정적 웹사이트를 공개하려면 Block Public Access 해제 + 버킷 정책 허용. 하지만 비공개 오리진 + CloudFront + OAC가 더 안전(→ cloudfront.md).
- VPC에서 사설로 접근은 S3 Gateway Endpoint(무료, NAT 불필요 → vpc-endpoint-privatelink.md).
시험 트리거: "grant temporary download access to a private object" → Presigned URL. "prevent any public exposure" → Block Public Access. "cross-account access to a bucket" → 버킷 정책.
이벤트 알림 (Event Notifications)
객체 생성/삭제 등 이벤트가 나면 다른 서비스를 트리거한다.
S3 이벤트(예: s3:ObjectCreated:*)
→ SNS / SQS / Lambda 로 직접 통지
→ 또는 EventBridge 로 보내 더 풍부한 라우팅/필터
- 대표 패턴: 업로드 → Lambda로 썸네일 생성 / 바이러스 스캔 / 메타데이터 색인.
- 더 정교한 필터·다수 대상·재시도가 필요하면 EventBridge 경유.
시험 트리거: "process an object right after upload" → S3 event → Lambda(또는 SQS/SNS/EventBridge).
Object Lock — WORM (규정 준수, 빈출)
Write-Once-Read-Many — 지정 기간 동안 객체를 삭제·수정 못 하게 잠근다. 규정(금융·의료 감사 로그)에 쓴다. 버저닝 필수.
| 모드 | 의미 |
|---|---|
| Governance | 특별 권한(s3:BypassGovernanceRetention)이 있으면 해제·삭제 가능 |
| Compliance | 누구도(루트조차) 보존 기간 전엔 삭제 불가 — 가장 엄격 |
| Legal Hold | 기간 없이, 명시적으로 풀 때까지 무기한 보존 |
시험 트리거: "records must be immutable / WORM / cannot be deleted for N years (compliance)" → Object Lock (Compliance 모드). "관리자가 필요 시 예외 삭제" → Governance.
대용량·성능·기타 (SAA 레벨에서 알아둘 것)
| 주제 | 요점 |
|---|---|
| Multipart Upload | 큰 객체를 나눠 병렬 업로드. 100MB↑ 권장, 5GB↑ 필수(객체 최대 5TB) |
| Transfer Acceleration | 먼 지역 업로드를 CloudFront 엣지로 가속(→ data-transfer.md) |
| Byte-Range Fetch | 객체 일부만 병렬로 가져와 다운로드 가속 |
| S3 Select | 객체 하나에서 SQL로 필요한 부분만 조회(전체 스캔·다운로드 회피). 여러 객체 분석은 Athena |
| S3 Batch Operations | 수십억 객체에 대량 작업(복사·태깅·복원 등) 일괄 실행 |
| Access Points | 공유 버킷에 용도별 이름 있는 접근 지점 + 개별 정책 |
| Requester Pays | 다운로드 비용을 요청자가 부담(대용량 데이터 공유 시) |
| MFA Delete | 버전 삭제·버저닝 중단에 MFA 요구(추가 보호) |
Common Wrong Directions
| 오답 방향 | 왜 부족한가 |
|---|---|
| S3를 파일 시스템처럼 마운트해 공유 | 객체 스토리지(HTTP API) → 공유 파일은 EFS/FSx |
| 삭제/덮어쓰기 보호에 백업만 | 버저닝(+MFA Delete)이 1차 방어 |
| 복제가 되는데 기존 객체가 안 옴 | 복제는 소급 안 됨 → Batch Replication |
| 복제하려는데 안 켜짐 | 양쪽 버저닝 필수 |
| 키 감사·권한 통제 필요한데 SSE-S3 | 감사·통제는 SSE-KMS |
| 비공개 객체 임시 공유에 버킷을 퍼블릭 | Presigned URL |
| 규정상 삭제 금지를 버킷 정책으로만 | Object Lock(Compliance) = WORM |
| 정적 사이트 HTTPS를 S3 웹호스팅만으로 | S3 웹호스팅은 HTTP → CloudFront 필요 |
| S3 하나 객체 부분조회에 Athena | 단일 객체 부분은 S3 Select, 다수는 Athena |
Exam Triggers
| 문제에서 이런 표현이 나오면 | 떠올릴 것 |
|---|---|
| "durable object storage, scales infinitely" | S3 |
| "protect against accidental delete/overwrite" | Versioning (+MFA Delete) |
| "replicate to another region (DR/latency/compliance)" | CRR |
| "same-region replication / log aggregation" | SRR |
| "encrypt at rest and audit key access" | SSE-KMS |
| "customer-provided encryption keys" | SSE-C |
| "temporary access to a private object" | Presigned URL |
| "block all public access" | Block Public Access |
| "trigger processing after upload" | S3 event → Lambda/SQS/SNS/EventBridge |
| "immutable / WORM / cannot delete for years" | Object Lock (Compliance) |
| "upload large files reliably / faster from far region" | Multipart Upload / Transfer Acceleration |
| "query a subset of one object with SQL" | S3 Select |
| "access S3 privately from VPC without NAT" | Gateway Endpoint |
Memory Sentence
S3는 11 9s 내구성의 무한 객체 스토리지(강력한 read-after-write 일관성). 실수 보호는 버저닝(+MFA Delete), 지역 분산/DR은 CRR·같은 리전은 SRR(양쪽 버저닝 필수·소급 안 됨). 암호화는 기본 SSE-S3·감사면 SSE-KMS·직접 키면 SSE-C. 접근은 기본 비공개(Block Public Access)·정책·임시는 Presigned. 업로드 후 처리는 이벤트→Lambda, 규정 불변 보관은 Object Lock(WORM). 클래스·비용은 s3-storage-classes 노트.
References
댓글
아직 댓글이 없습니다.