아마존 S3
더 많은 작업
- Amazon Simple Storage Service; Amazon S3; 아마존 S3
- 데이터를 버킷(bucket) 안에 객체(object) 단위로 저장하고 HTTP API로 읽고 쓰는 AWS의 객체 스토리지 서비스
아마존 Simple Storage Service(아마존 S3)는 용량을 미리 정하지 않고 거의 무제한으로 데이터를 쌓을 수 있는 관리형 객체 스토리지이다. 정적 웹 콘텐츠, 백업과 아카이브, 로그, 데이터 레이크의 원본 저장소, 애플리케이션이 올리는 파일 등 AWS 아키텍처에서 "파일을 어딘가에 두어야 한다"는 요구가 나오면 가장 먼저 검토하는 서비스이다. 서버나 디스크를 관리할 필요가 없고, 저장한 양과 요청 수, 데이터 전송량만큼 요금을 낸다.
S3는 파일 시스템처럼 마운트해서 쓰는 저장소가 아니다. 객체를 통째로 올리고 통째로 받는 방식이므로, 블록 단위로 자주 고쳐 쓰는 데이터베이스 디스크는 아마존 EBS, 여러 서버가 공유하는 POSIX 파일 시스템은 아마존 EFS나 아마존 FSx가 맞다.
| 항목 | 설명 |
|---|---|
| 버킷 | 객체를 담는 최상위 컨테이너. 버킷은 특정 리전에 만들며, 일반 버킷 이름은 전역에서 고유해야 한다. |
| 객체·키 | 객체는 데이터와 메타데이터로 이루어지고, 버킷 안에서 키(key)로 식별한다. logs/2026/10/app.log처럼 슬래시가 들어간 키는 폴더처럼 보이지만 실제 계층 구조는 없다.
|
| 객체 크기 | 단일 PUT으로 최대 5GB까지 올릴 수 있고, 멀티파트 업로드를 쓰면 객체 하나가 최대 50TB까지 가능하다. |
| 내구성 | S3 Standard는 1년 기준 99.999999999%(11 nine) 내구성과 99.99% 가용성을 목표로 설계되었다. Standard 등 대부분의 클래스는 리전 안 최소 3개 가용 영역에 중복 저장한다. |
| 일관성 | 모든 리전에서 PUT·DELETE에 대해 강력한 쓰기 후 읽기 일관성(strong read-after-write consistency)을 제공한다. 덮어쓰기와 삭제 직후 읽어도 최신 결과가 나온다. |
| 스토리지 클래스 | 접근 빈도와 비용에 따라 Standard, Intelligent-Tiering, Standard-IA, Glacier 계열 등을 고른다. 자세한 비교는 아마존 S3 스토리지 클래스에 있다. |
버전 관리(Versioning)를 켜면 같은 키로 덮어쓰거나 삭제해도 이전 버전이 남는다. 삭제 요청은 실제 삭제 대신 삭제 마커(delete marker)를 올리므로 실수로 지운 객체를 되살릴 수 있다. 버전 관리는 한 번 켜면 끌 수 없고 일시 중지만 가능하다. 이전 버전도 저장 요금이 나오므로 수명 주기 규칙으로 오래된 버전을 정리하는 것이 보통이다.
| 구분 | 교차 리전 복제(CRR) | 같은 리전 복제(SRR) |
|---|---|---|
| 대상 | 다른 리전의 버킷 | 같은 리전의 다른 버킷 |
| 주 용도 | 규정상 먼 거리 보관, 다른 리전 사용자에게 지연 시간 단축, 리전 장애 대비 | 여러 버킷의 로그 집계, 운영·테스트 계정 간 실시간 복제, 데이터 주권상 같은 리전 사본 유지 |
- 원본과 대상 버킷 모두 버전 관리가 켜져 있어야 한다.
- 복제 규칙은 설정 이후 새로 쓰인 객체에 적용된다. 이미 있던 객체는 S3 배치 복제(Batch Replication)로 옮긴다.
- S3 복제 시간 제어(S3 RTC)를 쓰면 새 객체의 99.99%를 15분 안에 복제하며 SLA가 붙는다.
S3 Object Lock은 객체 버전을 정해진 기간 또는 법적 보존(legal hold)을 풀 때까지 삭제·덮어쓰기할 수 없게 하는 WORM(write-once-read-many) 기능이다. 버전 관리가 켜진 버킷에서만 동작한다.
- 규정 준수 모드(compliance): 루트 사용자를 포함해 누구도 보존 기간 안에 지우거나 기간을 줄일 수 없다.
- 거버넌스 모드(governance): 특별 권한(
s3:BypassGovernanceRetention)을 가진 사용자는 보존 설정을 바꾸거나 지울 수 있다. - 법적 보존: 만료일 없이 명시적으로 해제할 때까지 보호한다.
2023년 1월 5일부터 모든 새 객체는 기본으로 SSE-S3로 암호화된다. 추가 비용은 없다.
| 방식 | 키 관리 | 특징 |
|---|---|---|
| SSE-S3 | S3가 관리하는 키 | 기본값. 별도 설정이 필요 없다. |
| SSE-KMS | AWS KMS 키 | 키 정책으로 접근 통제, 키 사용이 CloudTrail에 기록된다. S3 버킷 키로 KMS 요청 비용을 줄일 수 있다. |
| DSSE-KMS | AWS KMS 키 | KMS 키로 서버 측 암호화를 두 겹 적용한다. 이중 암호화를 요구하는 규정 대응용. |
| SSE-C | 고객이 요청마다 키를 제공 | S3는 키를 저장하지 않는다. 2026년 4월부터 새 범용 버킷에서는 기본으로 차단되어, 쓰려면 버킷 암호화 설정에서 명시적으로 허용해야 한다. |
클라이언트 측 암호화(데이터를 올리기 전에 애플리케이션이 암호화)는 S3 바깥에서 하는 방식이다. 전송 구간은 HTTPS로 보호하며, 버킷 정책에서 aws:SecureTransport 조건으로 HTTP 요청을 거부할 수 있다.
- 버킷 정책: 버킷에 붙이는 리소스 기반 JSON 정책이다. 다른 계정에 접근을 허용하거나, 특정 VPC 엔드포인트·IP에서만 접근하도록 제한할 때 쓴다.
- IAM 정책: 사용자·역할 쪽에 붙이는 자격 증명 기반 정책이다. 같은 계정 안의 권한은 대개 IAM 정책으로 준다.
- 퍼블릭 액세스 차단(Block Public Access): 새 버킷은 기본으로 퍼블릭 접근이 막혀 있다. 계정·버킷 단위로 켜 두면 정책이나 ACL로 실수로 공개하는 것을 막는다.
- ACL 비활성화: 새 버킷은 객체 소유권 설정이 '버킷 소유자 적용'(Bucket owner enforced)이 기본이라 ACL이 꺼져 있다. AWS는 객체별 개별 통제가 꼭 필요한 경우가 아니면 ACL을 끈 채 정책으로 관리하도록 권장한다.
- 미리 서명된 URL(presigned URL): 객체에 대한 임시 접근 URL이다. 버킷을 공개하지 않고 특정 객체의 다운로드·업로드를 일정 시간만 허용한다. SDK·CLI에서 서명 버전 4로 만들면 최대 7일까지 유효하며, 임시 자격 증명으로 만들면 그 자격 증명이 만료될 때 함께 만료된다.
다음은 HTTPS가 아닌 요청을 거부하는 버킷 정책 예이다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyInsecureTransport",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::example-bucket",
"arn:aws:s3:::example-bucket/*"
],
"Condition": { "Bool": { "aws:SecureTransport": "false" } }
}
]
}
- 멀티파트 업로드: 큰 객체를 여러 부분(최대 10,000개)으로 나눠 병렬로 올리고, 실패한 부분만 다시 보낸다. AWS는 100MB 이상 객체에 권장한다. 완료되지 않은 업로드 조각도 요금이 나오므로 수명 주기 규칙의
AbortIncompleteMultipartUpload로 정리한다. - Transfer Acceleration: 멀리 떨어진 클라이언트가 CloudFront 엣지 로케이션으로 데이터를 보내고, 엣지에서 AWS 최적화 네트워크로 버킷까지 전달한다. 전 세계에서 하나의 버킷으로 큰 파일을 올리는 경우에 쓴다. 버킷 이름에 마침표가 있으면 쓸 수 없다.
- 이벤트 알림: 객체 생성·삭제 같은 이벤트를 아마존 SNS, 아마존 SQS, AWS Lambda, 아마존 EventBridge로 보낸다. SQS FIFO 큐는 직접 대상이 될 수 없고 EventBridge를 거쳐야 한다. 업로드된 이미지로 썸네일을 만드는 식의 이벤트 기반 아키텍처에 자주 나온다.
- 수명 주기 규칙(Lifecycle): 일정 기간이 지난 객체를 더 싼 스토리지 클래스로 전환(transition)하거나 만료(expiration)시켜 지운다. 접두사나 태그로 대상을 좁힐 수 있다. 전환 순서와 제약은 아마존 S3 스토리지 클래스에 정리했다.
- 요청자 지불(Requester Pays): 요청과 다운로드 비용을 버킷 소유자가 아니라 요청자가 낸다. 저장 비용은 여전히 소유자가 낸다. 대용량 공개 데이터셋을 다른 기관과 나눌 때 쓰며, 익명 접근은 허용되지 않는다.
버킷을 정적 웹사이트로 설정하면 HTML, 이미지, JavaScript 같은 정적 파일을 웹 서버 없이 제공할 수 있다. 다만 S3 웹사이트 엔드포인트는 HTTPS를 지원하지 않는다. HTTPS와 사용자 지정 도메인, 전 세계 캐싱이 필요하면 아마존 CloudFront를 앞에 두고 원본 액세스 제어(OAC)로 버킷을 비공개로 유지하는 구성이 정석이다. SSE-KMS로 암호화한 버킷은 익명 접근을 지원하지 않으므로 이 경우에도 CloudFront와 OAC가 필요하다.
- 파일을 저장하고 웹으로 내려받게 하되 서버 관리를 원하지 않으면 S3, 블록 디스크가 필요하면 EBS, 여러 리눅스 서버가 공유하는 파일 시스템이면 EFS를 고른다.
- 특정 사용자에게 비공개 객체를 잠깐 내려받게 하려면 미리 서명된 URL을 쓴다. 버킷을 공개하는 선택지는 오답이다.
- 실수 삭제 방지는 버전 관리(필요하면 MFA 삭제), 규제상 삭제 불가 보관은 Object Lock 규정 준수 모드를 고른다. 거버넌스 모드는 권한 있는 사용자가 풀 수 있다는 차이를 구분해야 한다.
- 다른 리전에 사본이 필요하면 CRR이다. 복제에는 양쪽 버킷의 버전 관리가 필요하고, 기존 객체는 배치 복제로 옮긴다.
- 먼 지역에서 큰 파일을 빠르게 올려야 하면 Transfer Acceleration과 멀티파트 업로드를 조합한다.
- 키 사용 감사나 키 정책 통제가 필요하면 SSE-KMS, 별도 요구가 없으면 기본 SSE-S3로 충분하다. 정적 사이트에 HTTPS가 필요하면 CloudFront와 OAC를 붙인다.
- Amazon S3란 무엇인가요? – AWS
- 기본 암호화 구성 – AWS
- Object Lock으로 객체 잠금 – AWS
- 리전 내 및 리전 간 객체 복제 – AWS
- 미리 서명된 URL을 통해 객체 다운로드 및 업로드 – AWS