S3
Simple Storage Service
AWS의 객체 저장소. 무제한 확장, 99.999999999% 내구성. 정적 웹 호스팅 가능.
Simple Storage Service
AWS의 객체 저장소. 무제한 확장, 99.999999999% 내구성. 정적 웹 호스팅 가능.
Amazon S3(Simple Storage Service)는 AWS가 2006년 출시한 객체 스토리지 서비스로, 클라우드 스토리지의 사실상 표준입니다. 99.999999999%(11 9s) 내구성을 보장하며, 단일 객체 최대 5TB, 버킷당 객체 수 무제한의 확장성을 제공합니다.
S3의 구조는 버킷(Bucket)과 객체(Object)로 구성됩니다. 버킷은 전 세계에서 고유한 이름을 가지며, 객체는 Key(경로)로 식별됩니다. 실제로는 플랫한 구조이지만 Key에 슬래시(/)를 사용해 폴더처럼 보이게 할 수 있습니다.
스토리지 클래스로는 S3 Standard(자주 접근), S3 Intelligent-Tiering(자동 계층화), S3 Standard-IA(비정기 접근), S3 One Zone-IA(단일 AZ), S3 Glacier Instant/Flexible/Deep Archive(아카이브)가 있습니다. 적절한 클래스 선택으로 비용을 최대 95% 절감할 수 있습니다.
실무에서 S3는 정적 웹 호스팅, CDN 오리진, 데이터 레이크, 로그 저장, 백업, ML 학습 데이터 등 거의 모든 비정형 데이터 저장에 사용됩니다. CloudFront와 연동하면 글로벌 콘텐츠 배포가, Athena와 연동하면 데이터 분석이 가능합니다.
import boto3
from botocore.config import Config
# S3 클라이언트 생성 (리전별 설정)
s3 = boto3.client('s3',
region_name='ap-northeast-2',
config=Config(
retries={'max_attempts': 3},
signature_version='s3v4'
)
)
# 버킷 생성 (서울 리전)
s3.create_bucket(
Bucket='my-app-files-2024',
CreateBucketConfiguration={'LocationConstraint': 'ap-northeast-2'}
)
# 파일 업로드 (메타데이터, 암호화 포함)
s3.upload_file(
Filename='./report.pdf',
Bucket='my-app-files-2024',
Key='documents/2024/01/report.pdf',
ExtraArgs={
'ContentType': 'application/pdf',
'ServerSideEncryption': 'AES256',
'Metadata': {'author': 'kaitrust'}
}
)
# Presigned URL 생성 (다운로드용, 1시간 유효)
url = s3.generate_presigned_url(
'get_object',
Params={
'Bucket': 'my-app-files-2024',
'Key': 'documents/2024/01/report.pdf'
},
ExpiresIn=3600
)
# Presigned POST (업로드용, 클라이언트 직접 업로드)
presigned_post = s3.generate_presigned_post(
Bucket='my-app-files-2024',
Key='uploads/${filename}',
Conditions=[
['content-length-range', 0, 10485760], # 최대 10MB
['starts-with', '$Content-Type', 'image/']
],
ExpiresIn=3600
)
# 멀티파트 업로드 (대용량 파일)
from boto3.s3.transfer import TransferConfig
config = TransferConfig(
multipart_threshold=100 * 1024 * 1024, # 100MB 이상시 멀티파트
max_concurrency=10
)
s3.upload_file('large_file.zip', 'bucket', 'key', Config=config)
"사용자 프로필 이미지는 S3에 저장하고 CloudFront로 서빙합니다. 업로드는 Presigned POST URL로 클라이언트에서 직접 S3로 보내서 서버 부하를 줄이고, Lambda 트리거로 썸네일을 자동 생성하면 됩니다."
"로그 데이터가 월 5TB인데 대부분 조회 안 하잖아요. S3 Intelligent-Tiering 적용하면 30일 이상 미접근 데이터는 자동으로 IA로 옮겨서 40% 절감됩니다. 분석용 데이터는 Glacier로 내리면 90% 이상 아낄 수 있어요."
"S3 버킷은 Block Public Access 전체 활성화되어 있고, SSE-KMS로 암호화됩니다. IAM 정책으로 최소 권한 원칙 적용하고, S3 Access Logs와 CloudTrail로 접근 기록을 남깁니다. 버전 관리도 켜서 실수로 삭제해도 복구 가능합니다."
버킷을 실수로 퍼블릭으로 열면 전 세계에 데이터가 노출됩니다. Block Public Access를 계정 레벨에서 활성화하고, AWS Config로 퍼블릭 버킷을 자동 탐지하세요. 2023년부터 신규 버킷은 기본 비공개입니다.
S3 비용은 저장 용량 + 요청 수 + 데이터 전송입니다. 작은 파일이 많으면 요청 비용이 급증합니다. 리스팅 비용도 발생하므로 불필요한 ListObjects 호출을 피하고, CloudFront 캐싱으로 오리진 요청을 줄이세요.
암호화(SSE-S3 또는 SSE-KMS), 버전 관리, Lifecycle Policy, 접근 로깅을 기본 설정하세요. 정적 웹 호스팅 시 Origin Access Control(OAC)로 CloudFront만 접근 가능하게 하고, 직접 S3 URL 노출은 피하세요.