최대 객체 크기: 5TB
단일 PUT 최대: 5GB (초과 시 멀티파트 필수)
멀티파트 최소: 100MB 권장, 5GB 이상 필수
파트 최소 크기: 5MB (마지막 파트 제외)
파트 최대 개수: 10,000개
접두사당 처리량: PUT 3,500/s, GET 5,500/s
내구성: 11 nines (모든 클래스 동일)
Standard 가용성: 99.99%
One Zone-IA 가용성: 99.5%
상태: Unversioned → Enabled → Suspended (비활성화 불가)
삭제 = 삭제 마커 추가 (진짜 삭제 아님)
진짜 삭제 = DELETE + 버전 ID 명시
MFA Delete: 루트 계정만 설정/해제 가능
비용 함정: 이전 버전도 전부 저장 비용 발생
해결: NoncurrentVersionExpiration 수명 주기 규칙
SSE-S3: AWS 완전 관리, 기본값, 무료, 감사 로그 없음
SSE-KMS: KMS 키 정책, CloudTrail 감사, KMS API 한도 주의
→ S3 Bucket Key로 최대 99% KMS 비용 절감
DSSE-KMS: 이중 암호화, FIPS 140-3 Level 3, 정부/국방
SSE-C: 고객이 키 제공, HTTPS 필수, AWS에 키 미저장
CSE: 클라이언트가 직접 암호화, 최고 보안
CRR: 다른 리전 → 재해 복구, 지연 시간 최적화
SRR: 같은 리전 → 개발/스테이징 분리, 로그 집계
요건: 양쪽 모두 버전 관리 활성화 필수
기존 객체: Batch Replication 별도 사용
삭제 마커: 기본 미복제 (선택 활성화)
RTC: 99.99%를 15분 내 복제 보장 (유료 SLA)
Week 5의 마지막 날이다. S3 이벤트 알림, Presigned URL, 정적 웹사이트 호스팅이라는 세 가지 고급 기능을 마저 살펴보고, 그 다음 지난 4일간 배운 S3 전체를 시험 관점에서 정리한다. S3는 DVA-C02에서 가장 많은 문제가 나오는 서비스 중 하나다. 단순 암기가 아니라 "왜 그렇게 동작하는가"를 이해하면 변형 문제에서도 흔들리지 않는다.
S3 이벤트 알림은 "버킷에서 특정 일이 발생했을 때 누군가에게 알려라"는 패턴이다. 이 패턴은 서버리스 아키텍처의 핵심이다 — S3에 파일이 올라오면 Lambda가 자동으로 실행되고, 이미지 리사이징, 문서 변환, 데이터 검증이 일어난다.
지원하는 이벤트 유형:
s3:ObjectCreated:* — PUT, POST, COPY, 멀티파트 완료 모두 포함
s3:ObjectCreated:Put — PUT만
s3:ObjectRemoved:* — 삭제 및 삭제 마커 생성
s3:ObjectRestore:* — Glacier 복원 시작/완료
s3:Replication:* — 복제 실패, 미완료 등
직접 연결 대상 3종: Lambda 함수, SQS 큐, SNS 주제.
Amazon EventBridge를 경유하는 방법이 2021년 추가됐고, 이 방식이 현재 권장된다. 이벤트 아카이빙과 재생(replay)이 가능하고, 대상이 18개 이상(Step Functions, Kinesis, API Gateway, CodePipeline 등)이며, 세밀한 이벤트 패턴 필터링(접두사, 접미사, 크기 조건 등)을 지원하기 때문이다.
직접 연결(Lambda/SQS/SNS)은 대상이 이미 명확하고 간단한 경우, EventBridge는 유연성이 필요한 경우를 선택 기준으로 삼으면 된다.
S3 이벤트 알림은 이벤트 기반 아키텍처(EDA, Event-Driven Architecture)의 전형적인 구현이다. 2003년 Amazon의 내부 SOA(Service-Oriented Architecture) 전환 이후, AWS 서비스들은 이벤트로 소통하는 것을 기본 설계 원칙으로 삼는다. S3 이벤트는 최소 한 번 전달(at-least-once)을 보장하지만 중복 전달이 가능하다 — Lambda나 SQS 컨슈머에서 멱등성(Idempotency)을 보장해야 하는 이유다.
⚠️ 함정: S3 이벤트 알림은 "최소 한 번(at-least-once)" 전달이지 "정확히 한 번(exactly-once)"이 아니다. 같은 PUT에 대해 Lambda가 두 번 호출될 수 있다. Lambda 내에서 멱등 처리(이미 처리된 파일인지 확인하는 DynamoDB 항목 등)를 구현해야 한다.
Presigned URL은 생성자의 IAM 자격증명을 사용해 서명된 임시 URL이다. URL을 받은 사람은 해당 URL이 유효한 동안 생성자의 권한으로 S3 작업을 수행할 수 있다.
import boto3from datetime import datetime, timedeltas3 = boto3.client('s3')# 1. 비공개 파일 임시 공유 (GET)download_url = s3.generate_presigned_url( 'get_object', Params={ 'Bucket': 'my-private-bucket', 'Key': 'confidential/report-2026.pdf' }, ExpiresIn=3600 # 1시간 유효)# 2. 클라이언트가 서버를 통하지 않고 직접 S3에 업로드 (PUT)upload_url = s3.generate_presigned_url( 'put_object', Params={ 'Bucket': 'my-upload-bucket', 'Key': f'user-uploads/{user_id}/avatar.jpg', 'ContentType': 'image/jpeg' }, ExpiresIn=300 # 5분 유효)# 3. POST 형식 Presigned URL (HTML form 업로드)response = s3.generate_presigned_post( Bucket='my-bucket', Key='uploads/${filename}', # 변수 사용 가능 Fields={'Content-Type': 'image/jpeg'}, Conditions=[ ['content-length-range', 1, 10 * 1024 * 1024] # 최대 10MB ], ExpiresIn=600)
Presigned URL의 핵심 특성들:
만료 시간: IAM 사용자 장기 자격증명(SigV4)이면 최대 7일이다. 콘솔에서 만들면 1분~12시간 사이로 정한다. 임시 자격증명(IAM 역할, STS)으로 만들면 그 자격증명이 만료될 때 URL도 함께 만료된다. 더 긴 만료 시간을 지정해도 마찬가지다. AssumeRole 세션은 기본 1시간, EC2 인스턴스 프로파일 자격증명은 보통 최대 6시간 정도라, Lambda나 EC2에서 만든 URL이 지정한 시간보다 일찍 끊기는 원인이 된다.
생성자 권한: URL을 생성한 시점에 생성자가 해당 작업 권한을 가지고 있어야 한다. 생성 시점에 권한이 있었더라도, 이후 IAM 정책 변경으로 권한이 제거되면 URL도 작동을 멈춘다.
PUT Presigned URL 패턴: 서버가 URL을 생성해서 클라이언트에게 전달하고, 클라이언트가 직접 S3에 파일을 업로드한다. 서버는 파일 데이터를 처리하지 않아 대역폭 부하가 없다. 파일 업로드가 완료되면 클라이언트가 서버에 완료 알림을 보내고, 서버는 S3 이벤트나 DynamoDB 메타데이터를 확인한다.
Presigned URL의 서명은 AWS SigV4(Signature Version 4) 알고리즘으로 생성된다. SigV4는 HMAC-SHA256을 사용하며 요청의 HTTP 메서드, 버킷/키, 만료 시간, 허용된 헤더 등이 서명에 포함된다. URL을 변조하면 서명 검증에서 실패한다. SDK의 generate_presigned_url이 이 복잡한 과정을 추상화해준다.
S3 정적 웹사이트는 비용 효율적이지만 중요한 제약이 있다: HTTP만 지원한다. S3 자체에 TLS 인증서를 설치할 수 없다. HTTPS를 제공하려면 CloudFront + ACM(AWS Certificate Manager) 조합이 필수다.
왜 HTTP만인가? S3는 웹 서버가 아니라 오브젝트 스토리지다. TLS handshake, 인증서 관리, SNI(Server Name Indication) 같은 HTTPS의 복잡한 요소들은 CloudFront나 ALB 같은 Layer 7 서비스의 역할이다. AWS는 이를 서비스별 역할 분리 원칙으로 유지한다.
CloudFront + OAC 방식(권장)에서는 버킷을 퍼블릭으로 열지 않아도 된다. CloudFront만 버킷에 접근하고 사용자에게 HTTPS로 서빙한다.
⚠️ 함정: S3 정적 웹사이트 호스팅과 일반 S3 버킷의 퍼블릭 URL은 다르다. 웹사이트 호스팅을 활성화한 버킷의 웹사이트 엔드포인트(s3-website)는 HTML 파일을 브라우저로 렌더링한다. 일반 S3 URL(s3.amazonaws.com)은 파일을 다운로드(Content-Disposition: attachment)로 처리할 수 있다. 정적 웹사이트 기능을 켜야 index.html을 기본 문서로 서빙하고 에러 페이지를 설정할 수 있다.