사전 Amazon S3
구현체

Amazon S3

gabury1고친 사람 github-actions[bot]

Amazon S3 는 파일을 인터넷 너머에 맡겨 두고 이름으로 다시 꺼내 쓰게 해 주는 저장 서비스입니다. 아마존이 운영합니다. 쓰는 사람은 디스크를 사거나 늘릴 일이 없습니다. 넣고 꺼낼 때는 웹 요청 하나면 됩니다. 사용자가 올린 사진, 백업 파일, 쌓이는 로그가 주로 여기에 놓입니다.

쉽고 빠른 이해

S3 는 파일을 이름 하나에 묶어 맡겨 두는 창고입니다. photos/puppy.jpg 라는 이름으로 사진을 올려 두면, 나중에 같은 이름으로 요청해 그 사진을 받습니다.

서버 디스크에 파일을 쌓으면 곧 디스크가 찹니다. 서버를 여러 대로 늘리면 파일이 어느 서버에 있는지도 따져야 합니다. S3 에 맡기면 용량을 미리 정하지 않아도 됩니다. 어느 서버에서든 같은 이름으로 같은 파일을 찾습니다.

어떻게 도는가:

  1. 파일을 담을 통인 버킷을 하나 만듭니다
  2. 파일에 이름을 붙여 웹 요청으로 올립니다
  3. 같은 이름으로 요청하면 파일을 돌려받습니다

대가가 있습니다. 컴퓨터의 폴더와 파일처럼 다룰 수 없습니다. 파일 중간만 고칠 수 없어서 통째로 다시 올립니다. 요청 수와 꺼내 간 데이터 양만큼 요금이 붙습니다.

상세

이 절은 S3 가 파일을 어떤 단위로 받고, 어떤 이름으로 찾고, 어떤 약속을 지키는지를 차례로 봅니다. 사진 한 장을 올리고 다시 받는 흐름을 줄곧 예로 씁니다.

S3 는 Simple Storage Service 의 줄임말입니다. AWS(Amazon Web Services, 아마존 웹 서비스)가 빌려주는 서비스 가운데 하나입니다. 설치하는 프로그램이 아니라 AWS 가 운영하는 서버에 요청을 보내 쓰는 물건입니다.

오브젝트 스토리지

S3 는 오브젝트 스토리지입니다. 데이터를 파일 하나 단위로 통째로 맡기고 통째로 꺼내는 저장 방식입니다. 이렇게 맡긴 한 덩어리를 오브젝트라고 부릅니다.

오브젝트는 파일의 내용과 그 파일을 설명하는 메타데이터로 이루어집니다. 메타데이터는 「이름 = 값」 짝의 목록입니다. 마지막으로 고친 시각이나 Content-Type 처럼 이 파일이 어떤 종류인지 알려 주는 값이 여기 들어갑니다.

우리가 익숙한 파일 시스템과는 다루는 방식이 다릅니다. 파일 시스템은 파일을 열어 중간 몇 바이트만 고쳐 쓸 수 있습니다. 오브젝트 스토리지에서는 한 바이트를 바꿔도 오브젝트 전체를 새로 올립니다. 대신 파일이 몇 개든, 얼마나 크든 같은 방식으로 받아 줍니다.

버킷과 키

오브젝트는 반드시 버킷 안에 들어갑니다. 버킷은 오브젝트를 담는 가장 바깥 통입니다. 버킷을 만들 때는 이름과 리전을 정합니다.

리전은 AWS 데이터센터가 모여 있는 지역입니다. 버킷을 만들 때 고른 리전에 데이터가 저장됩니다. 사용자와 가까운 리전을 고르면 파일을 주고받는 시간이 줄어듭니다.

버킷 이름은 모든 AWS 계정을 통틀어 겹치면 안 됩니다. 남이 이미 쓰는 이름이면 그 이름으로 버킷을 못 만듭니다. 한 번 정한 버킷 이름과 리전은 바꿀 수 없습니다.

버킷 안에서 오브젝트를 가리키는 이름이 오브젝트 키입니다. 키는 버킷 안에서 하나뿐이라, 버킷 이름과 키만 있으면 오브젝트가 하나로 정해집니다. 사진 예로 보면 버킷이 amzn-s3-demo-bucket 이고 키가 photos/puppy.jpg 입니다.

flowchart TD
    subgraph B["버킷 · amzn-s3-demo-bucket"]
        K1["키 · photos/puppy.jpg"]
        K2["키 · photos/cat.jpg"]
        K3["키 · logs/2026-09-18.log"]
    end

그림에서 photos/ 가 폴더처럼 보이지만 폴더는 없습니다. 버킷 아래에는 키가 평평하게 늘어선 구조입니다. photos/puppy.jpg 는 빗금이 섞인 긴 이름 하나일 뿐입니다.

빗금 앞부분처럼 여러 키가 함께 가진 앞머리를 프리픽스라고 부릅니다. photos/ 가 프리픽스입니다. 목록을 조회할 때 프리픽스로 걸러 photos/ 로 시작하는 키만 받을 수 있습니다.

AWS 콘솔은 브라우저로 여는 AWS 웹 관리 화면입니다. 콘솔은 프리픽스를 폴더 모양으로 보여 줍니다. 그래서 폴더처럼 쓰이긴 합니다. 그래도 「photos 폴더의 이름을 바꾸려면」 그 프리픽스로 시작하는 키를 하나하나 옮겨야 합니다.

HTTP 로 넣고 꺼낸다

S3 와는 HTTP(HyperText Transfer Protocol)로 이야기합니다. 개요에서 말한 웹 요청이 바로 이 HTTP 요청입니다. 버킷과 오브젝트를 만들 때도, 받을 때도, 지울 때도 표준 HTTP 요청을 보냅니다.

HTTP 메서드와 주소로 자원을 다루는 방식을 REST API라고 부릅니다. REST 는 Representational State Transfer, API 는 Application Programming Interface 의 줄임말입니다.

사진 오브젝트에는 이런 주소가 붙습니다. 버킷 이름, 리전, 키가 한 줄에 다 들어 있습니다.

https://amzn-s3-demo-bucket.s3.us-west-2.amazonaws.com/photos/puppy.jpg

요청마다 누가 보냈는지 밝히는 서명이 붙습니다. S3 는 이 서명을 보고 요청을 받을지 정합니다. 서명을 손으로 계산하기는 번거롭습니다.

그래서 코드에서는 보통 AWS SDK를 씁니다. SDK 는 Software Development Kit, 곧 개발 도구 모음입니다. 함수를 부르면 SDK 가 서명을 계산해 요청을 보냅니다. 실패한 요청도 다시 보내 줍니다.

터미널에서 직접 다룰 때는 AWS CLI를 씁니다. CLI 는 Command Line Interface, 곧 명령줄 도구입니다. CLI 도 서명을 대신 계산합니다.

사진을 올리고 다시 받는 한 왕복은 아래와 같습니다.

sequenceDiagram
    participant 앱
    participant S3
    앱->>S3: PUT photos/puppy.jpg · 사진 내용
    S3-->>앱: 200 OK
    앱->>S3: GET photos/puppy.jpg
    S3-->>앱: 200 OK · 사진 내용

올릴 때는 PUT, 받을 때는 GET 을 같은 키로 보냅니다. 지울 때는 같은 키로 DELETE 를 보냅니다.

쓰자마자 읽으면 무엇이 보이나

여러 서버에 복제를 두는 저장소는 방금 쓴 값이 바로 안 보일 때가 자주 있습니다. 복제본마다 새 값이 퍼지는 데 시간이 걸리기 때문입니다. 백엔드 코드에서는 「방금 올린 파일이 목록에 없다」 같은 버그로 나타납니다.

S3 는 오브젝트의 쓰기와 삭제에 강한 일관성을 지킵니다. PUT 이 성공 응답을 돌려준 뒤에 시작한 읽기와 목록 조회는 방금 쓴 내용을 봅니다. 지운 오브젝트는 바로 읽히지 않고 목록에서도 빠집니다.

키 하나의 갱신은 원자적입니다. 한 스레드가 덮어쓰는 동안 다른 스레드가 읽으면, 옛 내용이나 새 내용 가운데 하나를 받습니다. 반쯤 쓰인 내용은 받지 않습니다.

다만 S3 가 막아 주지 않는 것이 있습니다. 같은 키에 PUT 두 개가 거의 동시에 와도 S3 는 잠금을 걸지 않습니다. 둘 중 S3 가 받은 시각이 늦은 요청의 내용이 남습니다. 이렇게 마지막 쓰기가 남는 방식을 Last Write Wins라고 부릅니다.

여러 키를 한꺼번에 바꿀 때도 S3 는 묶어 주지 않습니다. 모두 반영되거나 하나도 반영되지 않게 묶는 장치를 트랜잭션이라고 합니다. 잠금이나 트랜잭션이 필요하면 애플리케이션이 직접 만들어야 합니다.

버킷 설정은 이 약속 밖입니다. 버킷을 지운 직후 버킷 목록을 보면 지운 버킷이 잠깐 남아 있을 수 있습니다. 버킷 설정을 바꾼 것도 반영되는 데 시간이 조금 걸립니다.

기본은 비공개다

버킷과 오브젝트는 만들 때 비공개입니다. 권한을 따로 주지 않으면 만든 계정만 접근합니다. 실수로 파일을 인터넷에 여는 사고를 막으려고 퍼블릭 액세스 차단 설정도 기본으로 켜져 있습니다. 퍼블릭 액세스는 로그인하지 않은 누구나 접근하는 것을 말합니다.

권한은 두 방향에서 줍니다. 접근하는 쪽에 붙이는 방법과 버킷 쪽에 붙이는 방법입니다.

접근하는 쪽에 붙이는 것이 IAM 정책입니다. IAM 은 Identity and Access Management 의 줄임말로, AWS 안에서 누가 무엇을 해도 되는지 다루는 서비스입니다. 사용자나 역할에 「이 버킷을 읽어도 된다」를 붙입니다. 내 계정 안의 사람이나 서버에 권한을 줄 때 이쪽을 씁니다.

역할은 사람이 아니라 서버나 프로그램이 넘겨받아 쓰는 신원입니다. 애플리케이션 서버에 역할을 주면 코드에 비밀 키를 적어 두지 않아도 S3 에 접근합니다.

버킷 쪽에 붙이는 것이 버킷 정책입니다. 「이 계정은 여기에 올려도 된다」처럼 누가 이 버킷에 무엇을 해도 되는지 버킷에 적어 둡니다. 다른 AWS 계정에 버킷을 열어 줄 때 주로 이쪽을 씁니다.

로그인하지 않은 사용자에게 파일 하나만 잠깐 내주고 싶을 때도 있습니다. 이때는 권한을 열지 않고, 서명과 만료 시각을 담은 Presigned URL(Presigned Uniform Resource Locator, 미리 서명해 둔 주소)을 만들어 건넵니다.

버전 관리

S3 버전 관리를 켜면 같은 키에 올린 오브젝트가 덮어써지지 않고 버전으로 쌓입니다. 버전마다 고유한 버전 ID 가 붙습니다. 실수로 지우거나 덮어쓴 파일을 이전 버전으로 되살릴 수 있습니다.

대가는 저장 용량입니다. 옛 버전도 모두 저장 공간을 차지합니다. 그만큼 요금도 붙습니다.

버전 관리를 켜는 것도 버킷 설정입니다. 앞에서 본 대로 켠 직후에는 반영되기까지 시간이 조금 걸립니다.

스토리지 클래스와 수명 주기

S3 는 같은 오브젝트를 어떤 조건으로 보관할지 고르게 합니다. 이 보관 등급을 스토리지 클래스라고 부릅니다. 자주 꺼내는 데이터와 거의 안 꺼내는 데이터에 같은 값을 매기지 않으려는 장치입니다.

쓰임 클래스 예 무엇을 맞바꾸나
자주 읽는 데이터 S3 Standard 저장 요금이 가장 비싼 편입니다
가끔 읽는 데이터 S3 Standard-IA(Infrequent Access, 드문 접근) 저장은 싸고, 꺼낼 때 요금이 붙습니다
보관만 하는 데이터 S3 Glacier 계열 저장은 가장 싸고, 꺼내는 데 시간이 걸리기도 합니다
읽는 빈도를 모르는 데이터 S3 Intelligent-Tiering S3 가 읽는 빈도를 보고 등급을 옮깁니다

싼 클래스일수록 꺼내기가 비싸거나 느려집니다. 클래스를 손으로 옮기지 않으려면 S3 수명 주기 규칙을 겁니다. 「30일 지난 로그는 보관용 클래스로, 1년 지나면 삭제」 같은 규칙을 버킷에 적어 두면 S3 가 그대로 옮기고 지웁니다.

파일 시스템이 아니라서 포기한 것

S3 는 파일을 무한히 받는 쪽을 골랐습니다. 그 대신 파일 시스템이 당연히 주던 것을 몇 가지 내려놓았습니다. 백엔드 개발자가 처음 쓸 때 걸리는 것이 대개 여기입니다.

파일 시스템에서는 S3 에서는
파일 중간만 고쳐 씁니다 오브젝트 전체를 다시 올립니다
파일 끝에 이어 씁니다 이어 쓰는 대신 새 오브젝트로 올립니다
폴더 이름을 한 번에 바꿉니다 프리픽스 아래 키를 하나씩 옮깁니다
파일에 잠금을 겁니다 잠금이 없어 나중 요청이 이깁니다
운영체제가 경로로 파일을 엽니다 HTTP 요청으로 주고받습니다

그래서 조금씩 자주 바뀌는 데이터에는 맞지 않습니다. 주문 상태처럼 한 칸씩 고치는 값은 데이터베이스에 둡니다. S3 에는 한 번 쓰면 잘 안 바뀌는 덩어리를 둡니다.

서버가 경로로 파일을 열어야 하는 프로그램이라면 Amazon EFS 같은 파일 저장소가 맞습니다. EFS 는 Elastic File System 의 줄임말로, 여러 서버가 함께 붙여 쓰는 네트워크 파일 시스템입니다.

백엔드에서 S3 를 쓰는 곳

한 번 쓰고 여러 번 읽는 파일이 S3 에 잘 맞습니다. 백엔드에서는 주로 아래 파일을 둡니다.

  • 사용자가 올린 이미지·첨부 파일. 애플리케이션 서버는 키만 데이터베이스에 적어 둡니다
  • 백업 파일과 데이터베이스 덤프
  • 서버와 서비스가 쌓는 로그
  • 미리 만들어 둔 HTML(HyperText Markup Language)·JS(JavaScript) 같은 정적 웹사이트 파일
  • 데이터 레이크. 원본 데이터를 가공하지 않고 S3 에 쌓아 둡니다. 분석 엔진이 거기서 바로 읽습니다

정적 웹사이트 파일은 앞에 CDN(Content Delivery Network, 콘텐츠 전송 네트워크)을 두고 내보낼 때가 많습니다. CDN 은 세계 곳곳의 서버에 사본을 두고 사용자 가까운 곳에서 응답하는 전송망입니다. 이때 S3 버킷은 CDN 이 원본을 가져오는 오리진이 됩니다.

S3 의 요청 방식은 사실상 오브젝트 스토리지의 공용 말이 되었습니다. 다른 회사의 저장소나 직접 설치하는 저장소도 S3 와 같은 API 를 흉내 내는 경우가 많습니다. 이런 저장소를 S3 호환 스토리지라고 부릅니다. S3 용 SDK 로 손대지 않고 붙습니다.

관련 항목

Amazon S3 를 이루는 구성 요소

버킷 · 오브젝트 · 오브젝트 키 · 프리픽스 · 메타데이터 · 버전 ID · 리전

Amazon S3 가 속하는 상위 분류

AWS · 오브젝트 스토리지 · 클라우드 스토리지 · 클라우드 컴퓨팅 · 관리형 서비스

Amazon S3 가 제공하는 관리 기능

S3 버전 관리 · S3 수명 주기 · 스토리지 클래스 · S3 복제 · S3 Object Lock · S3 이벤트 알림 · 멀티파트 업로드

Amazon S3 에 접근을 허락하는 수단

IAM · 버킷 정책 · ACL · Presigned URL · S3 액세스 포인트 · 퍼블릭 액세스 차단

Amazon S3 를 호출하는 인터페이스

REST API · HTTP · AWS SDK · AWS CLI · AWS 서명 버전 4

Amazon S3 가 지키는 성질

강한 일관성 · 최종 일관성 · 원자성 · Last Write Wins · 내구성 · 가용성

Amazon S3 를 대신할 수 있는 다른 저장소

Amazon EBS · Amazon EFS · 파일 시스템 · 블록 스토리지 · Google Cloud Storage · Azure Blob Storage · MinIO · S3 호환 스토리지

Amazon S3 에 데이터를 두는 시스템 구성

정적 웹사이트 · CDN · CloudFront · 오리진 서버 · 데이터 레이크 · 백업 · 로그

Amazon S3 위에서 데이터를 읽는 분석 도구

Amazon Athena · Apache Spark · Apache Parquet · Apache Iceberg · Amazon EMR

다른 이름: S3 · Simple Storage Service · 아마존 S3