☁️클라우드

버킷

Bucket

클라우드 객체 저장소의 컨테이너. AWS S3, Google Cloud Storage, Azure Blob Storage에서 파일을 저장하는 논리적 단위로, 데이터 레이크와 백업 시스템의 핵심 구성요소입니다.

📖 상세 설명

버킷(Bucket)은 클라우드 객체 저장소(Object Storage)에서 데이터를 담는 최상위 컨테이너입니다. 파일 시스템의 루트 폴더와 유사하지만, 계층 구조 없이 플랫한 네임스페이스로 객체(파일)를 관리합니다. AWS S3, Google Cloud Storage, Azure Blob Storage, MinIO 등 모든 객체 저장소에서 버킷 개념을 사용합니다.

버킷은 2006년 Amazon S3 출시와 함께 대중화되었습니다. 전통적인 파일 시스템과 달리 HTTP/HTTPS를 통해 접근하며, 버킷 이름은 글로벌하게 고유해야 합니다. 이 설계 덕분에 무제한에 가까운 확장성과 99.999999999%(11 nines)의 내구성을 제공합니다.

버킷 내 객체는 키(Key)로 식별됩니다. "logs/2024/01/app.log"처럼 슬래시로 경로를 표현하지만, 실제 폴더 구조는 없습니다. 이를 접두어(Prefix)라 부르며, 콘솔에서는 폴더처럼 보이지만 내부적으로는 플랫합니다. 버킷에는 버저닝, 수명주기 정책, 암호화, 복제 규칙 등을 설정할 수 있습니다.

실무에서 버킷은 데이터 레이크의 기반, 정적 웹사이트 호스팅, 로그 아카이빙, 머신러닝 데이터셋 저장, 백업/복구 시스템에 활용됩니다. AI/ML 워크로드에서 학습 데이터와 모델 아티팩트를 버킷에 저장하고, SageMaker나 Vertex AI에서 직접 읽어 사용합니다.

📊 성능 & 비용

주요 클라우드 객체 저장소 비용 비교 (2025년 1월 기준, 서울 리전)

서비스 표준 저장 아카이브 데이터 전송(외부) 무료 티어
AWS S3 $0.025/GB $0.004/GB (Glacier) $0.126/GB 5GB, 12개월
GCS $0.023/GB $0.004/GB (Archive) $0.12/GB 5GB, 항상 무료
Azure Blob $0.0184/GB $0.002/GB (Archive) $0.138/GB 5GB, 12개월
Cloudflare R2 $0.015/GB - 무료 10GB, 항상 무료

비용 최적화 팁: 90일 이상 미접근 데이터는 자동으로 아카이브 티어로 이동하는 수명주기 정책을 설정하세요. S3 Intelligent-Tiering은 접근 패턴을 자동 분석하여 최적 티어로 이동시킵니다.

💻 코드 예제

Python boto3를 사용한 AWS S3 버킷 작업 예제입니다.

# pip install boto3

import boto3
from botocore.exceptions import ClientError

# S3 클라이언트 생성
s3 = boto3.client('s3', region_name='ap-northeast-2')

# 버킷 생성
bucket_name = 'my-ml-datasets-2024'
try:
    s3.create_bucket(
        Bucket=bucket_name,
        CreateBucketConfiguration={'LocationConstraint': 'ap-northeast-2'}
    )
    print(f"버킷 '{bucket_name}' 생성 완료")
except ClientError as e:
    if e.response['Error']['Code'] == 'BucketAlreadyOwnedByYou':
        print("이미 소유한 버킷입니다")
    else:
        raise

# 버킷에 버저닝 활성화 (중요 데이터 보호)
s3.put_bucket_versioning(
    Bucket=bucket_name,
    VersioningConfiguration={'Status': 'Enabled'}
)

# 파일 업로드 (학습 데이터)
s3.upload_file(
    Filename='train_data.csv',
    Bucket=bucket_name,
    Key='datasets/train/train_data.csv',
    ExtraArgs={'ServerSideEncryption': 'AES256'}  # 서버측 암호화
)

# 대용량 파일 멀티파트 업로드
from boto3.s3.transfer import TransferConfig

config = TransferConfig(
    multipart_threshold=8 * 1024 * 1024,  # 8MB 이상이면 멀티파트
    max_concurrency=10,
    multipart_chunksize=8 * 1024 * 1024
)

s3.upload_file(
    'large_model.tar.gz',
    bucket_name,
    'models/v1/large_model.tar.gz',
    Config=config
)

# 객체 목록 조회 (특정 접두어)
response = s3.list_objects_v2(
    Bucket=bucket_name,
    Prefix='datasets/'
)

for obj in response.get('Contents', []):
    print(f"  {obj['Key']} - {obj['Size']:,} bytes")

# Presigned URL 생성 (임시 다운로드 링크)
url = s3.generate_presigned_url(
    'get_object',
    Params={'Bucket': bucket_name, 'Key': 'datasets/train/train_data.csv'},
    ExpiresIn=3600  # 1시간
)
print(f"다운로드 URL: {url}")

Google Cloud Storage (GCS) 예제입니다.

# pip install google-cloud-storage

from google.cloud import storage

# 클라이언트 생성 (환경변수 GOOGLE_APPLICATION_CREDENTIALS 설정 필요)
client = storage.Client()

# 버킷 생성
bucket_name = 'my-ml-datasets-2024'
bucket = client.create_bucket(bucket_name, location='asia-northeast3')
print(f"버킷 '{bucket.name}' 생성 완료 (위치: {bucket.location})")

# 수명주기 정책 설정 (90일 후 아카이브)
bucket.add_lifecycle_delete_rule(age=365)  # 365일 후 삭제
bucket.add_lifecycle_set_storage_class_rule(
    'ARCHIVE',
    age=90  # 90일 후 아카이브 티어로 이동
)
bucket.patch()

# 파일 업로드
blob = bucket.blob('datasets/train/train_data.csv')
blob.upload_from_filename('train_data.csv')

# 객체 목록 조회
blobs = client.list_blobs(bucket_name, prefix='datasets/')
for blob in blobs:
    print(f"  {blob.name} - {blob.size:,} bytes")

🗣️ 실무 대화 예시

💬 회의에서

"학습 데이터가 500GB인데, S3 Standard에 두면 월 $12.50 정도예요. 90일 지나면 Glacier로 자동 이동하는 수명주기 정책 걸면 아카이브 비용이 $2로 줄어듭니다."

💬 면접에서

"데이터 레이크를 S3 버킷 기반으로 구축했습니다. 버킷 정책으로 특정 VPC에서만 접근 가능하게 제한하고, 서버측 암호화(SSE-S3)를 기본 활성화했습니다. CloudTrail로 모든 API 호출을 감사 로그로 남기고 있습니다."

💬 기술 토론에서

"R2가 이그레스 비용이 없어서 CDN 원본으로 좋은데, S3와 100% 호환은 아니에요. 복잡한 버킷 정책이나 이벤트 알림이 필요하면 아직 S3가 나아요."

⚠️ 주의사항

퍼블릭 액세스 방치

버킷을 퍼블릭으로 열어두면 데이터 유출 사고가 발생합니다. S3 Block Public Access를 계정 레벨에서 활성화하세요.

버저닝 미적용

버저닝 없이 덮어쓰기하면 이전 데이터가 영구 삭제됩니다. 중요 데이터 버킷은 반드시 버저닝을 활성화하세요.

이그레스 비용 무시

데이터 전송(외부) 비용이 저장 비용보다 클 수 있습니다. 대용량 다운로드가 잦으면 CloudFront나 R2를 고려하세요.

올바른 방법

수명주기 정책으로 비용을 최적화하고, 버킷 정책으로 최소 권한 원칙을 적용하세요. CloudTrail/Cloud Audit Logs로 접근 기록을 남기고, 교차 리전 복제로 재해복구를 준비하세요.

🔥 실제 장애 사례

Capital One 2019

S3 버킷 권한 오설정으로 1억 명 개인정보 유출

원인: WAF 설정 오류로 SSRF 공격에 노출, EC2 메타데이터를 통해 IAM 자격 증명 탈취 후 S3 버킷 접근

영향: 1억 600만 명의 개인정보(SSN, 은행계좌) 유출, $80M 벌금

해결: IMDSv2 강제 적용, 버킷 정책 강화, VPC 엔드포인트 사용

교훈: 버킷 권한은 최소 권한 원칙을 철저히 지키고, EC2 인스턴스 메타데이터 서비스 버전 2를 사용해야 합니다.

📎 상세 보기
Twitch 2021

내부 Git 서버 설정 오류로 125GB 소스코드 유출

원인: 서버 설정 변경 중 실수로 내부 저장소가 외부에 노출

영향: 전체 소스코드, 내부 도구, 크리에이터 수익 정보 유출

해결: 모든 자격 증명 교체, 접근 제어 강화

교훈: 민감한 데이터가 있는 저장소는 VPC 내부에서만 접근 가능하도록 네트워크 격리가 필수입니다.

📎 상세 보기

📝 이해도 퀴즈

Q1. S3 버킷에서 "logs/2024/01/app.log" 경로의 객체가 있을 때, "logs/2024/"는 무엇인가요?

Q2. S3 버킷의 데이터 내구성은 얼마인가요?

Q3. 버킷 비용 최적화를 위해 90일 이상 미접근 데이터를 자동으로 저렴한 스토리지로 이동시키는 기능은?

🔗 관련 용어

📚 더 배우기