AWS - S3

김재근·2025년 4월 17일

AWS

목록 보기
5/6
post-thumbnail

AWS S3(Simple Storage Service)란?

Amazon S3(Simple Storage Service)는 AWS에서 제공하는 객체 스토리지 서비스로, 인터넷 상에서 언제 어디서나 원하는 양의 데이터를 저장하고 검색할 수 있다. 높은 내구성, 가용성, 확장성, 그리고 다양한 기능을 제공한다.

  • 무제한 스토리지: 개별 객체는 최대 5TB까지 가능하며, 저장 용량에 제한이 없음
  • 높은 내구성과 가용성: 99.999999999%(11 9's)의 내구성과 99.99%의 가용성
  • 보안 및 규정 준수: 강력한 액세스 제어와 암호화 옵션
  • 확장성: 자동 확장되는 인프라로 부하 증가에 대응
  • 성능 최적화: 다양한 성능 최적화 옵션 제공
  • 데이터 관리: 수명 주기 관리, 버전 관리, 복제 기능

S3의 주요 구성 요소

1. 버킷(Bucket)

S3 버킷은 객체를 저장하는 컨테이너다. 모든 객체는 버킷에 저장되며, 각 버킷은 글로벌하게 고유한 이름을 가져야 한다.

  • 버킷 이름은 글로벌 네임스페이스에서 고유해야 함
  • 특정 AWS 리전에 생성됨
  • 버킷 정책, 액세스 제어 목록(ACL), CORS 설정 등 다양한 설정 가능
aws s3api create-bucket \
    --bucket my-unique-bucket-name \
    --region ap-northeast-2 \
    --create-bucket-configuration LocationConstraint=ap-northeast-2

2. 객체(Object)

객체는 S3에 저장되는 기본 엔티티로, 데이터와 메타데이터로 구성된다.

  • 크기는 0바이트부터 최대 5TB까지 가능
  • 키(Key): 버킷 내에서 객체를 고유하게 식별하는 이름
  • 값(Value): 저장되는 실제 데이터
  • 메타데이터: 객체에 대한 정보를 담은 이름-값 쌍
  • 객체 태그: 분류 및 관리를 위한 키-값 쌍
aws s3 cp myfile.txt s3://my-unique-bucket-name/folder/myfile.txt

3. 키(Key)

키는 버킷 내에서 객체를 고유하게 식별하는 이름이다. 버킷과 키의 조합으로 각 객체를 고유하게 식별할 수 있다.

s3://my-bucket/documents/2023/financial-report.pdf

여기서 키는 documents/2023/financial-report.pdf이다.


S3 스토리지 클래스

S3는 다양한 사용 사례에 맞는 스토리지 클래스를 제공한다.

S3 Standard

가장 일반적인 스토리지 클래스로, 자주 액세스하는 데이터에 적하다.

  • 특징: 높은 내구성, 가용성, 성능
  • 사용 사례: 웹사이트, 콘텐츠 배포, 모바일 앱 데이터
  • 비용: 상대적으로 높은 스토리지 비용, 낮은 액세스 비용

S3 Intelligent-Tiering

액세스 패턴이 예측되지 않는 데이터에 적합하다. 자동 계층화를 통해 비용을 최적화할 수 있다.

  • 특징: 액세스 패턴에 따라 자동으로 스토리지 계층 이동
  • 사용 사례: 액세스 패턴을 예측할 수 없는 데이터
  • 비용: 월별 자동 계층화 비용 + 스토리지 비용

S3 Standard-IA (Infrequent Access)

자주 액세스하지 않지만 즉시 접근 가능한 데이터를 위한 클래스이다. 스토리지 비용은 저렴하지만 검색 비용이 상대적으로 높다.

  • 특징: 표준보다 낮은 스토리지 비용, 더 높은 검색 비용
  • 사용 사례: 백업, 재해 복구 데이터
  • 비용: 낮은 스토리지 비용, 높은 검색 비용

S3 One Zone-IA

Standard-IA와 유사하지만 단일 가용 영역에 저장되며, 비용이 더 낮은 옵션이다.

  • 특징: 단일 가용 영역, 낮은 비용
  • 사용 사례: 쉽게 재생성 가능한 데이터, 보조 백업
  • 비용: Standard-IA보다 20% 저렴한 스토리지 비용

S3 Glacier

장기 보관을 위한 스토리지 클래스로, 매우 낮은 스토리지 비용을 제공한다. 복원에는 시간이 소요되며, 다양한 복원 옵션이 존재한다.

  • 특징: 매우 낮은 스토리지 비용, 검색에 시간 소요
  • 검색 옵션: 신속(1-5분), 표준(3-5시간), 대량(5-12시간)
  • 사용 사례: 장기 백업, 아카이브 데이터
  • 비용: 매우 낮은 스토리지 비용, 상대적으로 높은 검색 비용

S3 Glacier Deep Archive

가장 저렴한 스토리지 옵션으로, 거의 액세스하지 않는 데이터에 적합하다. 복원에 12시간 이상 소요될 수 있다.

  • 특징: 최저 스토리지 비용, 검색에 12시간 이상 소요
  • 사용 사례: 규제 준수를 위한 장기 보관, 디지털 보존
  • 비용: 최저 스토리지 비용, 높은 검색 비용

S3 주요 기능

1. 버전 관리(Versioning)

  • 동일한 키에 여러 버전의 객체를 저장할 수 있다.

  • 실수로 인한 삭제나 덮어쓰기를 방지하고 복구할 수 있다.

2. 수명 주기 관리(Lifecycle Management)

  • 객체의 저장 기간에 따라 스토리지 클래스를 자동 전환하거나 삭제할 수 있다.

  • 비용 최적화와 데이터 수명 정책 관리를 자동화할 수 있다.

3. 복제(Replication)

  • 다른 버킷으로 객체를 자동 복제할 수 있다.

  • 동일 리전 또는 교차 리전 복제를 통해 재해 복구나 데이터 이중화를 구현할 수 있다.

4. 이벤트 알림(Event Notifications)

  • 객체 생성, 삭제, 복원 등의 이벤트 발생 시 알림을 전송할 수 있다.

  • Amazon SNS, SQS, Lambda와 연동하여 자동화된 워크플로우를 구성할 수 있다.

5. 정적 웹사이트 호스팅

  • HTML 기반 정적 웹사이트를 S3 버킷에서 직접 호스팅할 수 있다.

  • CloudFront와 연계하면 글로벌 콘텐츠 전송이 가능하다. 리액트도 가능.


S3 보안

1. 액세스 제어

  • 버킷 정책: JSON 형식으로 액세스를 제어할 수 있다.

  • ACL: 객체 및 버킷 수준의 세부적인 권한 설정이 가능하다.

  • IAM 정책: 사용자, 그룹, 역할 단위로 S3 리소스 접근을 제어할 수 있다.

2. 암호화

  • 서버 측 암호화(SSE): S3가 직접 암호화를 수행한다.

  • SSE-S3, SSE-KMS, SSE-C 옵션을 제공한다.

3. 클라이언트 측 암호화

  • 클라이언트가 직접 데이터를 암호화 후 업로드한다.

4. 데이터 무결성 확인

  • 업로드 및 다운로드 시 체크섬을 활용해 데이터 무결성을 검증할 수 있다.

5. 퍼블릭 액세스 차단

  • 모든 퍼블릭 접근을 차단하는 설정으로, 실수로 공개되지 않도록 보호할 수 있다.

S3 성능 최적화

1. S3 Transfer Acceleration

  • Amazon CloudFront의 글로벌 엣지 로케이션을 활용해 데이터 업로드 속도를 향상시킬 수 있다.
aws s3api put-bucket-accelerate-configuration \
    --bucket my-bucket \
    --accelerate-configuration Status=Enabled

2. 멀티파트 업로드

  • 대용량 객체를 여러 부분으로 나누어 병렬 업로드할 수 있다. 업로드 실패 시에도 재시도 및 재개가 가능하다.
# 멀티파트 업로드 시작
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
    }
  ]
}'

3. S3 Select

  • 객체 전체가 아닌 필요한 데이터만 검색할 수 있어 처리 비용과 시간을 줄일 수 있다.
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

S3 실제 활용 사례

1. 대용량 데이터 저장소

  • 데이터 레이크: 구조화되지 않은 데이터를 저장하고 분석
  • 빅데이터 분석: Amazon EMR, Athena 등과 통합
  • 미디어 저장소: 비디오, 오디오, 이미지 등의 미디어 에셋 저장

2. 정적 웹사이트 호스팅

  • HTML/CSS/JS 기반의 웹사이트를 손쉽게 호스팅할 수 있다.

    1. S3 버킷 생성 및 퍼블릭 액세스 설정 구성
    2. 정적 웹사이트 호스팅 활성화
    3. HTML, CSS, JavaScript 파일 업로드
    4. CloudFront 배포를 통한 콘텐츠 전송 최적화 (선택 사항)

3. 콘텐츠 배포 네트워크(CDN)

  • S3와 CloudFront를 연동하여 정적 콘텐츠를 효율적으로 전 세계에 배포할 수 있다.
aws cloudfront create-distribution \
    --origin-domain-name my-bucket.s3.amazonaws.com \
    --default-root-object index.html

4. 데이터 공유 및 협업

  • 버킷 정책, PreSigned URL 등을 통해 안전하게 데이터를 공유할 수 있다.
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}")
profile
FullStack + DevOps 개발자입니다.

0개의 댓글