Computer/공부정리

[Python] S3 버킷과 폴더의 개념

이르리의 공부일지 2024. 10. 1. 21:47

작성일: 2024-09-30

 

 

상황


이미지 데이터를 관리하는 컨테이너로 S3를 쓰고 있다.

Python에서는 AWS S3 API로 boto3가 있어서 이를 이용한다.

그런데 boto3를 이용한 이미지 데이터 업로드 코드를 작성하던 중에

버킷의 개념이 헷갈려서 좀 찾아보았다.

 

 

 

헷갈렸던 부분


1. S3 버킷은 파일 시스템의 폴더(디렉토리)와 같은 개념인가?

2. 버킷 하위에 생성되는 저장구조는 버킷인가 아니면 다른 무엇인가?

 

 

 

빠른 결론


1. 아니다. 

2. 버킷 하위에 생성되는 저장구조는 따로 없고, 버킷 내에 저장되는 데이터는 모두 '객체(Object)'라고 한다.

 

 

 

자세히


AWS S3에서 "폴더"의 개념은 일반적인 파일 시스템과는 다르다.

사실 S3에는 폴더디렉터리가 존재하지 않으며, 모든 것은 객체(object)로서 관리된다.

우리가 S3 버킷 안에서 "폴더"로 보이는 것들은

실제로 객체의 키(key)가 특정 규칙을 가지고 있을 때

S3 콘솔에서 계층적 구조로 표현되는 것이다.

 

 

아래를 보면 AWS 콘솔에서

현 계정이 가지고 있는 범용 버킷들을 확인할 수 있다.

캡처1. AWS S3 범용 버킷들

 

 

내가 버킷과 폴더구조를 헷갈려한 이유는 다음과 같다.

버킷 하나를 클릭하면 하위에 또 여러개의 폴더로 보이는 이름 목록들이 뜬다.

캡처2. S3 버킷 내부(하위 구조가 존재한다?)

 

하지만 이는 폴더가 아니다.

아래 사진을 보면 최하위에 있는 객체들을 확인할 수 있다.

이름은 '1.jpg'와 같이 돼있지만 실제로는

"https://{bucket}.s3.{region}.amazonaws.com/2002/.../1.jpg"

와 같은 형태를 띄는 객체인 것이다.

콘솔에서는 보기 좋게 '이름: 1.jpg' 와 같이 돼있지만 말이다.

캡처3. S3 버킷 내 최하위 경로에 위치한 객체들

 

 Python의 AWS API인 boto3의 메소드를 돌면서 좀 더 쉽게 확인할 수 있는데

나중에 글을 작성해보도록 하겠다.

힌트만 주자면

위 사진 캡처2에서 중간 구조로 보이는 '2002/'와 같은 애들도 객체라고 쓰여있지만

객체를 이루는 'Prefix'로 이해하면 되겠다.

 

객체의 완전한 이름

"https://{bucket}.s3.{region}.amazonaws.com/2024/10/.../1.jpg"

 

Prefix

2024/, 2024/10/, 2024/10/.../ 

→ 이런 녀석들을 각각 Prefix라 하고

boto3나 AWS CLI에서 필요에 맞게 쓰면 된다.

가령, '2024/'만 필요한 경우는 Prefix를 '2024/'로,

'2024/10/'만 필요한 경우는 Prefix를 '2024/10/'로

쓰면 된다는 뜻이다.