AWS S3 (Simple Storage Service)

혜진·2025년 3월 2일
post-thumbnail

AWS S3 (Simple Storage Service)

AWS S3(Simple Storage Service)

아마존에서 제공하는 객체 스토리지 서비스로, 인터넷을 통해 데이터를 저장하고 관리할 수 있다. S3는 무제한 확장이 가능하며, 파일 저장, 백업, 데이터 아카이빙, 정적 웹 호스팅 등의 용도로 활용할 수 있다.

1. Bucket

  • S3에서 데이터를 저장하는 최상위 컨테이너(폴더 같은 개념)
  • 버킷은 전 세계적으로 유일한 이름을 가져야 한다.
  • 각 버킷은 특정 AWS 리전에 저장됨

📑 버킷 생성 예제 (AWS CLI)

aws s3 mb s3://bucket-name

2. 객체 (Object)

  • S3에 저장되는 개별 파일
  • 객체는 파일 데이터와 메타데이터(이름, 크기, MIME 타입 등)로 구성됨
  • 버킷 안에 계층적인 폴더 구조처럼 저장 가능

📑 객체 업로드 예제 (AWS CLI)

aws s3 cp myfile.jpg s3://bucket-name/

3. Key

  • 객체를 식별하는 고유한 이름
  • 객체는 "버킷명 + 키" 조합으로 저장됨
    (ex: s3://bucket-name/images/file.jpg)

4. Storage Class

S3는 다양한 저장 방식을 제공하여 사용자의 필요에 따라 비용을 최적화할 수 있다.

  • S3 Standard: 빠르고 내구성이 높은 기본 스토리지
  • S3 Intelligent-Tiering: 액세스 패턴을 분석하여 자동으로 비용 최적화
  • S3 Standard-IA: 표준보다 저렴하지만, 액세스 비용이 있음
  • S3 One Zone-IA: 하나의 가용 영역(AZ)에서만 저장됨
  • S3 Glacier: 장기 보관용 (저렴하지만 복구에 시간 소요)
  • S3 Glacier Deep Archive: Glacier보다 더 저렴하지만, 복구 시간이 길음

📑 저장 방식 변경 예제 (AWS CLI)

aws s3 cp file.jpg s3://bucket-name/ --storage-class GLACIER

5. 버전 관리 (Versioning)

  • 객체의 이전 버전을 저장할 수 있는 기능
  • 실수로 덮어쓴 파일을 복구 가능

📑 버전 관리 활성화

aws s3api put-bucket-versioning --bucket bucket-name --versioning-configuration Status=Enabled

6. 액세스 제어 (Access Control)

  • S3 객체 및 버킷은 기본적으로 비공개(Private)

접근 권한을 제어하는 방법

  • S3 버킷 정책 (Bucket Policy): JSON 형식의 정책으로 특정 사용자/서비스에게 권한 부여
  • ACL (Access Control List): 버킷/객체에 대한 개별 권한 설정 가능
  • IAM 정책: AWS 계정의 사용자/역할(Role)에게 권한 부여
  • 프리사인 URL (Pre-signed URL): 일시적으로 객체에 접근할 수 있는 링크 생성

📑 S3 객체를 퍼블릭으로 설정하는 버킷 정책

{
  "Version": "2025-03-02",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::bucket-name/*"
    }
  ]
}

📑 프리사인 URL 생성 (AWS SDK, Node.js)

const AWS = require('aws-sdk');
const s3 = new AWS.S3({ region: 'ap-northeast-2' });

const params = {
  Bucket: 'bucket-name',
  Key: 'file.jpg',
  Expires: 60  // 60초 동안 유효
};

const url = s3.getSignedUrl('getObject', params);
console.log('Presigned URL:', url);

7. 라이프사이클 정책 (Lifecycle Policy)

  • 일정 기간이 지난 객체를 자동으로 삭제하거나 스토리지 클래스를 변경하는 기능

📑 Lifecycle Rule 예제 (30일 후 Glacier로 이동)

{
  "Rules": [
    {
      "ID": "MoveToGlacier",
      "Status": "Enabled",
      "Prefix": "",
      "Transitions": [
        {
          "Days": 30,
          "StorageClass": "GLACIER"
        }
      ]
    }
  ]
}

8. S3 이벤트 (S3 Events)

  • S3에서 특정 동작이 발생하면 Lambda, SNS, SQS로 알림을 보낼 수 있음

📑 S3 이벤트 설정 (Lambda 트리거)

{
  "LambdaFunctionConfigurations": [
    {
      "LambdaFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:MyFunction",
      "Events": ["s3:ObjectCreated:*"]
    }
  ]
}

S3 파일 업로드 방법

1) AWS CLI

aws s3 cp file.jpg s3://bucket-name/

2) AWS SDK (Node.js)

const AWS = require('aws-sdk');
const fs = require('fs');

const s3 = new AWS.S3({ region: 'ap-northeast-2' });

const uploadParams = {
  Bucket: 'bucket-name',
  Key: 'uploads/file.jpg',
  Body: fs.createReadStream('file.jpg'),
  ACL: 'public-read'  // 퍼블릭 액세스 허용
};

s3.upload(uploadParams, (err, data) => {
  if (err) console.log("Upload Error", err);
  else console.log("Upload Success", data.Location);
});

3) Presigned URL (일회성 업로드)

const params = {
  Bucket: 'bucket-name',
  Key: 'uploads/file.jpg',
  Expires: 300 
};

const url = s3.getSignedUrl('putObject', params);
console.log('Presigned URL:', url);

S3의 활용 사례

  • 웹사이트 정적 파일 저장: 이미지, HTML, CSS, JS 파일 저장
  • 백업 및 로그 저장소: EC2, 데이터베이스 백업, CloudTrail 로그 저장
  • CDN과 연동 (CloudFront): S3와 CDN을 연결하여 글로벌 배포
  • 데이터 레이크 구축: 빅데이터 분석을 위한 원시 데이터 저장소

S3의 장점

  • 무제한 저장 공간: 용량 제한 없음
  • 99.999999999% 내구성(11 9s): 데이터 손실 가능성이 거의 없음
  • 저렴한 비용: 스토리지 클래스 선택으로 비용 절감 가능
  • 강력한 보안: IAM, 버킷 정책, 암호화 지원
  • S3 API 지원: 다양한 SDK 및 REST API 제공

0개의 댓글