☁️클라우드

버킷

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일 이상 미접근 데이터를 자동으로 저렴한 스토리지로 이동시키는 기능은?

🔗 관련 용어

📚 더 배우기