Amazon S3(Simple Storage Service)는 AWS에서 제공하는 객체 스토리지 서비스로, 인터넷 상에서 언제 어디서나 원하는 양의 데이터를 저장하고 검색할 수 있다. 높은 내구성, 가용성, 확장성, 그리고 다양한 기능을 제공한다.
S3 버킷은 객체를 저장하는 컨테이너다. 모든 객체는 버킷에 저장되며, 각 버킷은 글로벌하게 고유한 이름을 가져야 한다.
aws s3api create-bucket \
--bucket my-unique-bucket-name \
--region ap-northeast-2 \
--create-bucket-configuration LocationConstraint=ap-northeast-2
객체는 S3에 저장되는 기본 엔티티로, 데이터와 메타데이터로 구성된다.
aws s3 cp myfile.txt s3://my-unique-bucket-name/folder/myfile.txt
키는 버킷 내에서 객체를 고유하게 식별하는 이름이다. 버킷과 키의 조합으로 각 객체를 고유하게 식별할 수 있다.
s3://my-bucket/documents/2023/financial-report.pdf
여기서 키는 documents/2023/financial-report.pdf이다.
S3는 다양한 사용 사례에 맞는 스토리지 클래스를 제공한다.
가장 일반적인 스토리지 클래스로, 자주 액세스하는 데이터에 적하다.
액세스 패턴이 예측되지 않는 데이터에 적합하다. 자동 계층화를 통해 비용을 최적화할 수 있다.
자주 액세스하지 않지만 즉시 접근 가능한 데이터를 위한 클래스이다. 스토리지 비용은 저렴하지만 검색 비용이 상대적으로 높다.
Standard-IA와 유사하지만 단일 가용 영역에 저장되며, 비용이 더 낮은 옵션이다.
장기 보관을 위한 스토리지 클래스로, 매우 낮은 스토리지 비용을 제공한다. 복원에는 시간이 소요되며, 다양한 복원 옵션이 존재한다.
가장 저렴한 스토리지 옵션으로, 거의 액세스하지 않는 데이터에 적합하다. 복원에 12시간 이상 소요될 수 있다.
동일한 키에 여러 버전의 객체를 저장할 수 있다.
실수로 인한 삭제나 덮어쓰기를 방지하고 복구할 수 있다.
객체의 저장 기간에 따라 스토리지 클래스를 자동 전환하거나 삭제할 수 있다.
비용 최적화와 데이터 수명 정책 관리를 자동화할 수 있다.
다른 버킷으로 객체를 자동 복제할 수 있다.
동일 리전 또는 교차 리전 복제를 통해 재해 복구나 데이터 이중화를 구현할 수 있다.
객체 생성, 삭제, 복원 등의 이벤트 발생 시 알림을 전송할 수 있다.
Amazon SNS, SQS, Lambda와 연동하여 자동화된 워크플로우를 구성할 수 있다.
HTML 기반 정적 웹사이트를 S3 버킷에서 직접 호스팅할 수 있다.
CloudFront와 연계하면 글로벌 콘텐츠 전송이 가능하다. 리액트도 가능.
버킷 정책: JSON 형식으로 액세스를 제어할 수 있다.
ACL: 객체 및 버킷 수준의 세부적인 권한 설정이 가능하다.
IAM 정책: 사용자, 그룹, 역할 단위로 S3 리소스 접근을 제어할 수 있다.
서버 측 암호화(SSE): S3가 직접 암호화를 수행한다.
SSE-S3, SSE-KMS, SSE-C 옵션을 제공한다.
aws s3api put-bucket-accelerate-configuration \
--bucket my-bucket \
--accelerate-configuration Status=Enabled
# 멀티파트 업로드 시작
aws s3api create-multipart-upload --bucket my-bucket --key large-file.mp4
# 각 파트 업로드
aws s3api upload-part --bucket my-bucket --key large-file.mp4 --part-number 1 --upload-id YOUR-UPLOAD-ID --body part1
# 업로드 완료
aws s3api complete-multipart-upload --bucket my-bucket --key large-file.mp4 --upload-id YOUR-UPLOAD-ID --multipart-upload '{
"Parts": [
{
"ETag": "etag1",
"PartNumber": 1
},
{
"ETag": "etag2",
"PartNumber": 2
}
]
}'
aws s3api select-object-content \
--bucket my-bucket \
--key large-data.csv \
--expression "SELECT * FROM s3object s WHERE s.\"Name\" = 'John'" \
--expression-type 'SQL' \
--input-serialization '{"CSV": {"FileHeaderInfo": "USE", "FieldDelimiter": ","}}' \
--output-serialization '{"CSV": {}}' \
output.csv
HTML/CSS/JS 기반의 웹사이트를 손쉽게 호스팅할 수 있다.
aws cloudfront create-distribution \
--origin-domain-name my-bucket.s3.amazonaws.com \
--default-root-object index.html
import boto3
from botocore.config import Config
s3_client = boto3.client(
's3',
config=Config(signature_version='s3v4')
)
presigned_url = s3_client.generate_presigned_url(
'get_object',
Params={
'Bucket': 'my-bucket',
'Key': 'sensitive-document.pdf'
},
ExpiresIn=3600 # URL 유효 시간 (초)
)
print(f"Download URL: {presigned_url}")