Search

S3 (Simple Storage Service)

S3

소개

객체 스토리지 서비스
RESTFul API를 사용하여 객체에 엑세스
HTTP / HTTPS 프로토콜을 사용
저장 가능한 파일 개수의 제한 없음
단일 파일 5TB 크기까지 저장
데이터를 여러 데이터센터에 중복저장
99.999999%의 내구성
데이터 암호화 기능 제공
버전 관리기능 / 정적 웹사이트 호스팅

버전 관리 (Versioning)

객체(파일)이 여러 버전을 가질 수 있음
동일한 파일이름을 업로드하면 여러 버전으로 저장됨(ex: 버전1, 버전2)
실수로 객체를 덮어쓰거나 삭제한 경우 이전 버전으로 복구 가능
실수로 객체를 삭제하는 것을 방지하기 위해 MFA Delete 옵션을 추가할 수 있음
객체를 하나의 파일이 아닌 여러 버전으로 보존할 수 있음
버전관리 기능을 사용하려면 해당 기능을 활성화 해야함
비용 증가 방지를 위해 Lifecycle Policy를 함께 설정하는 방법이 존재

객체 암호화

데이터를 전송 중에 그리고 스토리지에 저장된 동안 보호하기 위해 암호화 사용
서버 측 암호화 (SSE / Server Side Encryption)
S3에 저장된 데이터를 보호하기 위한 암호화
데이터가 서버에 저장되기 전에 객체를 암호화
SSE-S3 : S3에서 관리하는 암호화
SSE-KMS : KMS에서 관리하는 암호화, KMS를 이용하므로 키를 자동으로 교체하거나 감사기능을 지원
SSE-C : 사용자가 관리하는 암호화, 데이터 전송시 반드시 HTTPS를 사용해야 함
동작방식
1.
데이터가 S3에 저장될 때 암호화하고, 가져올 때 자동으로 복호화
2.
AWS KMS 또는 S3 관리 키를 사용하여 암호화 가능
클라이언트 측 암호화 (CSE / Client Side Encryption)
데이터를 전송하기 전에 클라이언트에서 암호화
전송 중 암호화
S3와 클라이언트 간의 데이터 전송을 보호하기 위한 암호화 방식이다.
동작방식
1.
HTTPS 프로토콜을 사용하여 데이터를 암호화
2.
클라이언트와 S3간 데이터가 네트워크를 통해 전송될 때 암호화
전송 보안 프로토콜 SSL/TLS를 이용해 데이터를 암호화, HTTPS 보안 프로토콜을 사용하여 전송
설정하기 위해선 아래의 S3 Bucket Policy에 aws:SecureTransport라는 조건을 추가해주면 된다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws:s3:::example-bucket/*", "Condition": { "Bool": { "aws:SecureTransport": "false" } } } ] }
JSON
복사

암호화 설정 시 성능 영향

S3 오브젝트 암호화는 보안성을 높여주지만, 암호화 및 복호화 과정에서 성능에 영향을 줄 수 있다.
전송 중 암호화 성능 영향
1.
작은 파일을 자주 전송할 때 CPU 부하 증가
2.
TLS 핸드셰이크 오버헤드 발생
3.
데이터 전송 속도 감소
암호화 방식
암호화/복호화 속도
성능 영향
특징
SSE-S3 (S3 관리 키)
가장 빠름
낮음
AWS가 키를 자동 관리하여 성능 최적화
SSE-KMS (KMS 키)
느림
중간
추가적인 KMS API 호출이 필요
SSE-C (사용자 제공 키)
가장 느림
높음
매 요청마다 키 제공 필요

버킷 정책

S3 버킷 엑세스 제어 정책
JSON 형식
조건에 따라 버킷에 엑세스를 부여학 제한하는 기능으로 사용
Ex
특정 AWS 리소스에서만 S3 버킷에 엑세스 허용
다른 AWS 계정에 버킷 엑세스 권한을 부여 가능
{ "Id": "Policy1609562393728", "Version" : "2012-10-17", "Statement" : [ { "Sid" : "Stmt16095623653131", "Effect" : "Deny", "Action" : [ "s3:GetObject", "s3:PutObject" ], "Resource" : "arn:aws:s3:::test1234", "Principal" : "*" } ] }
JSON
복사

퍼블릭 액세스 차단

버킷과 객체에 대한 퍼블릭 엑세스를 차단하거나 허용
데이터 보호를 위해 기본적으로 퍼블릭 엑세스를 차단

ACL(액세스 제어 목록)

AWS 계정에 버킷이나 객체에 읽기 / 쓰기 권한을 부여하는 기능
버킷 레벨에서 ACL을 적용하거나 객체 레벨에서 ACL을 적용 가능

정적 웹사이트 호스팅

S3에서 정적 웹사이트 호스팅 가능
정적 웹사이트
언제 접속해도 항상 같은 내용을 보여주는 변하지 않는 사이트
웹 사이트 호스팅을 하면 EC2등의 별도의 웹서버 운영을 하지 않아도 됨
웹사이트 주소는 버킷이름.s3-website-리전.amazonaws.com 형식
사이트 접속시 403 http 상태 코드가 나오면 버킷의 퍼블릭 엑세스 허용이 안되어 있다는 것

CORS (Cross-Origin Resource Sharing)

Origin
S3 버킷 주소 (버킷이름.s3-website-리전.amazonaws.com)
다른 오리진에 버킷에 대한 엑세스를 공유하는 것

액세스 로깅

S3 버킷의 모든 활동을 파일로 만들어 S3 버킷이 저장하는 기능
감사 목적으로 활용 가능
로그 분석을 위해 Amazon Athena같은 분석 도구를 사용 가능
로그 파일 저장소를 같은 버킷에 저장하면 무한 루프로 인해 로그파일이 지속적으로 증가

Replication (복제 규칙)

S3 버킷간에 객체를 자동으로 복제하는 기능
교차 리전 복제 (CRR, Cross Region Replication)
서로 다른 AWS 리전의 S3 버킷으로 객체를 복사
동일 리전 복제 (SRR, Same Region Replicaiton)
같은 AWS 리전의 S3 버킷으로 객체를 복사
버킷 복제를 위해서는 원본과 대상 버킷 모두 버전관리가 활성화 되어 있어야 함
다른 AWS 계정으로 복제 가능

스토리지 클래스

접근 빈도로 클래스를 나눔
Standard (범용)
높은 내구성, 가용성
객체 스토리지
정적 웹사이트, 콘텐츠 배포, 모바일 게임 어플리케이션에 사용
Intelligent-Tiering (엑세스 패턴을 알 수 없거나 예측할 수 없는 데이터용)
비용절감 효과
객체의 접근 빈도의 패턴을 판단하여 자동으로 클래스를 이동함
해당 스토리지에 업로드되거나 이전된 객체는 Frequent Access 계층에 저장
엑세스 패턴을 모니터링한 후 30일 연속 엑세스되지 않은 객체를 Infrequent Access 계층으로 이동
90일 연속으로 엑세스되지 않으면 객체를 Archive Access 계층으로 이동
180일 연속으로 엑세스되지 않으면 Deep Archive Access 계층으로 이동
Standard IA (빈번하지 않은 엑세스용)
Standard Infrequent Access의 줄임말
데이터 접근을 자주 하지 않고 필요할 때 빠르게 접근해야 할 때 적합한 서비스
최소 과금 기간 30일 (30일이 끝나기전에 객체를 삭제하면 30일 요금이 부과)
One Zone IA (빈번하지 않은 엑세스용)
데이터 접근을 자주 하지 않고 필요할 때 빠르게 접근해야 할 때 적합한 서비스
다른 S3와는 다르게 단일 가용영역에 저장
가격이 20% 정도 저렴
Glacier (아카이브용)
자주 접속하지 않는 장기 데이터를 위한 서비스
분기에 한 번 엑세스하는 오래된 아카이브 데이터 용도
밀리초 내에 즉시 검색
Deep Archive (아카이브용)
가장 저렴
1년의 1~2번 정도 접근하는 데이터를 장기 보관용도로 저장하는 서비스

객체 수명주기 관리 (Life Cycle Rule)

객체가 저장되어 삭제될 때까지의 수명주기를 비용 효율적으로 저장 되도록 관리하는 기능
S3 Object Lifecycle비용 절감 및 객체 관리를 자동화하는 기능이다. 정의한 규칙에 따라서 객체를 관리할 수 있다.
Lifecycle Rule을 설정하면, 주어진 조건을 만족하는 객체가 자동으로 관리된다.
버전 관리가 활성화 되어 있을 경우 객체의 버전 별로 수명 주기 정책을 적용할 수 있음
Amazon S3 Analytics
스토리지 클래스 분석
데이터 엑세스 패턴을 관찰해 자주 엑세스하지 않는 STANDARD 스토리지를 STANDARD IA 스토리지 클래스로 옮길 시점을 알려줌
S3 Object Lifecycle로 가능한 동작
객체를 특정 스토리지 클래스로 전환
객체를 자동으로 삭제
Expire(만료)된 객체의 이전 버전 정리

S3 Object Lock (S3 객체 잠금)

일정시간 또는 무기한으로 객체가 삭제되거나 덮어쓰이지 않도록 하는 기능으로 읽기만 가능
보관 기간을 설정하여 정해진 시간 동안 객체를 보호하도록 설정 가능
Write Once Read Many(WORM) 모델을 적용
WORM
객체를 잠금을 사용하기 위해선 버전관리가 활성화 되어있어야 함
거버넌스 모드(Governance Mode)
필요에 따라 일부 사용자에게 보관 설정을 변경하거나 객체를 삭제할 수 있는 권한을 부여할 수 있음
규정준수 모드(Compliance Mode)
AWS 계정의 루트 사용자를 포함한 어떤 사용자도 덮어쓰거나 삭제할 수 없음
Legal Hold(법적 보존)
객체를 덮어쓰거나 삭제할 수 없도록 하는 기능
객체를 수정해야하는 사용자의 IAM 정책에 s3 PubOjbectLegalHold 권한을 추가하면 해당 사용자는 객체를 수정, 삭제 가능
versioning 활성화
Object Lock 활성화

이벤트 알림(Event Notification)

S3의 이벤트가 발생할 때마다 알리는 기능
이벤트는 객체의 생성, 복제, 복원 등이 있음
생성된 이벤트 알림을 Amazon SNS, Amazon SQS, AWS Lambda로 보낼 수 있음
객체가 생성될 때마다 Lambda를 이용하여 파일을 처리하는 함수 구성
이벤트 알림을 Amazon EventBridge와 통합하여 이벤트 애플리케이션 구축 가능

S3 Select & S3 Glacier Select

SQL 구문을 사용해 S3 객체의 콘텐츠를 필터링하여 원하는 데이터만 가져오는 기능
데이터를 검색하는데 필요한 비용을 절감하고 지연시간을 감소 (성능 향상)

PreSignedURL

PreSignedURL을 사용하여 제한된 시간동안 객체를 공유 또는 없로드하는 만료 시간을 설정

전송 가속화 (Amazon S3 Transfer Acceleration)

S3 Transfer Acceleration는 인터넷을 통해 S3 버킷으로 데이터를 더 빠르게 업로드할 수 있도록 지원하는 기능이다.
AWS의 엣지로케이션을 활용해서 S3데이터를 사용자와 가까운 곳에 캐싱하여 전송
전 세계 각지에서 중앙의 버킷으로 업로드하는 고객이 있는 경우에 사용
Transfer Acceleration 엔드포인트: https://BUCKET-NAME.s3-accelerate.amazonaws.com
동작원리
S3 Transfer Acceleration을 사용하면 가까운 가까운 AWS 엣지 로케이션을 통해 데이터를 업로드
엣지 로케이션에서 AWS 내부 네트워크를 사용해 S3로 빠르게 전달
인터넷 속도보다 더 빠르게 전송 가능
AWS S3 → Bucket → Properties → Transfer Acceleration → Enable

AWS Transfer for SFTP

S3 버킷을 저장소로 하는 서비스
SFTP(Secure File Transfer Protocol)는 보안 파일 전송 프로토콜
온프레미스나 외부의 다른 시스템에서 SFTP를 이용하여 S3 버킷으로 파일을 전송하고 관리 가능

S3 Object Lambda

S3에서 데이터를 검색할 때 실시간으로 데이터 변환(필터링, 마스킹, 포맷 변경 등)을 적용할 수 있도록 도와주는 기능이다.
AWS Lambda를 사용해 S3 객체의 데이터를 수정 및 처리하는 기능
데이터 추가, 파일 압축 / 해제, 이미지 크기 조정 및 워터 마킹
동작 방식
사용자가 Object Lambda Access Point를 통해 S3에 데이터 요청
Lambda 함수가 요청을 가로채서 데이터를 변환
변환된 데이터를 사용자에게 반환
장단점
장점
데이터를 원본 그대로 유지하면서 변환 가능 (저장 비용 절감)
Lambda를 활용하여 다양한 변환 작업을 쉽게 추가 가능
어플리케이션에서 추가적인 데이터 처리 로직이 필요 없음
단점
실시간 변환이기 때문에 처리 속도가 느릴 수 있음
Lambda 실행 비용이 추가됨
기존 S3 URL이 아닌 Access Point 기반의 URL을 사용해야 함

S3 Data Integrity 검증 과정(데이터 무결화)

AWS S3는 저장된 데이터가 손상되거나 변조되지 않았는지 확인하기 위해 자동으로 무결성 검사를 수행한다. 주로 해시값(Checksum) 기반으로 검증하며, 다음과 같은 과정으로 동작한다.

S3 Data Integrity 검증 순서

(1) 객체 업로드 시

S3는 MD5 해시값(ETag) 또는 Checksum(SHA-1, SHA-256 등)을 계산
업로드 요청에 해시값이 포함되면, 업로드 후 S3에서 해시값을 비교해 손상 여부 확인
일치하지 않으면 업로드 실패 처리

(2) 저장 후 내부 검증

S3는 주기적으로 백엔드에서 데이터 무결성 검사를 수행
데이터가 손상되었거나 복제본에 문제가 발생하면, 정상 데이터로 복구

(3) 객체 다운로드 시

사용자는 객체 다운로드 후 로컬에서 S3의 ETag 또는 Checksum과 비교 가능
서버에서 제공한 Checksum을 통해 데이터 손상 여부 확인

요청자 지불 버킷 (Requested Pays)

일반적으로 버킷에 데이터를 다운로드 하거나 업로드 할 때 비용은 버킷 소유자가 지불
데이터 전송비용을 버킷 소유자가 아닌 요청자(데이터를 다운로드,업로드 하는 사람)이 지불하는 기능

S3 Access Point

특정한 그룹, 사용자, 애플리케이션이 허용된 S3 데이터만 엑세스 할 수 있게 하는 기능
Amazon S3 Access Point는 여러 애플리케이션이나 팀이 S3 버킷에 액세스하는 방식을 단순화하고 보안을 강화하기 위해 제공되는 기능이다.
기존에는 S3 버킷 정책(Bucket Policy) 또는 IAM 정책을 통해 액세스를 관리했지만, Access Point를 사용하면 각 애플리케이션 또는 팀별로 개별적인 엔드포인트를 생성하고 정책을 적용할 수 있다.
S3 Access Point 사용사례
여러 개의 애플리케이션 또는 팀이 하나의 S3 버킷을 공유할 때
기존에는 버킷 정책이 커지고 복잡해지는 문제가 있었음.
Access Point를 사용하면 각 팀별로 별도의 엔드포인트와 정책을 적용 가능
VPC 내에서 S3 접근을 쉽게 관리할 때 (VPC 엔드포인트 사용 가능)
특정 VPC 내에서만 접근 가능하도록 설정 가능.
VPC에서 인터넷 없이 AWS 내부 네트워크를 통해 S3에 연결 가능 (PrivateLink 활용)
AWS Organizations, AWS IAM을 활용한 세밀한 권한 관리
각 Access Point마다 IAM 역할 및 정책을 별도로 지정 가능.
S3 Access Point의 주요 기능
개별 엔드포인트 제공
Access Point는 각기 다른 고유한 엔드포인트(URL) 를 제공.
개별 정책 적용 가능
기존에는 S3 버킷 정책(Bucket Policy)만 사용할 수 있었지만, Access Point 정책을 통해 개별 앤드포인트마다 접근 제어 가능
VPC 내 전용 Access Point 가능
인터넷을 거치지 않고 VPC 내에서만 접근 가능한 Private Access Point 설정 가능.
AWS Organizations과 연동 가능
AWS Organizations을 사용하면 계정 단위로 S3 Access Point 정책을 적용 가능.

멀티 파트 업로드

대용량의 파일을 분할하여 병렬로 S3에 업로드 하는 방식
파트를 병령로 업로드 하기에 빠른 처리 속도로 업로드 가능
업로드가 실패하면 재전송 또는 수명 주기 정책을 통해 완료되지 않은 업로드 삭제 가능
이 방식을 사용하면 업로드 속도를 최적화하고, 네트워크 장애 발생 시 복구가 용이해진다.
필요한 이유
1. 대용량 파일 업로드 최적화
100MB 이상의 파일을 업로드할 때는 단일 요청보다 Multi-Part Upload가 성능이 뛰어남.
네트워크 장애 복구
Multi-Part Upload는 실패한 부분만 다시 업로드하면 되므로 시간과 비용 절감 가능.
대규모 업로드 안정성 개선
파일을 작은 단위로 나눠서 관리하므로, 대용량 업로드 시 안정성이 높아짐.
동작 방식

1. 업로드 초기화

먼저 업로드할 파일에 대해 Multi-Part Upload를 시작해야 함.

2. 파트별 업로드

파일을 여러 개의 작은 파트(최소 5MB 이상)로 나눠서 개별적으로 업로드.
이 단계에서 각 파트는 병렬로 업로드될 수 있음, 따라서 속도가 향상됨.

3. 업로드 완료 요청

모든 파트가 업로드되면 각 파트의 ETag(해시값)를 사용해 최종 파일을 결합.
S3가 모든 파트를 하나의 파일로 조립하여 최종적으로 저장.

S3 데이터 검색

Athena, S3 Select, Redshift 등의 서비스를 사용하여 S3의 데이터를 다른 플랫폼으로 이동하지 않고 바로 검색 가능
SQL 쿼리문을 사용하여 검색할 수 있음

S3 Batch Operation

단일 요청으로 많은 수의 S3 객체를 간편하게 처리하는 기능
다른 버킷에 객체 복사, 태그 또는 ACL을 설정, Glacier에서 복원을 시작

S3 Partitioning

파티셔닝이란 데이터를 특정 키 또는 기준에 따라 논리적으로 분할하는 방식
S3에서 파티셔닝을 사용하는 이유
1.
필터링된 데이터만 검색이 가능하여 쿼리 속도 향상
2.
특정 프리픽스에 요청이 집중되지 않도록 함
3.
다중 요청이 균등하게 분산

S3 Concurrent Applications

S3 Concurrent Applications여러 애플리케이션 또는 프로세스가 동시에 S3에 접근하여 읽기(Read), 쓰기(Write), 삭제(Delete) 작업을 수행하는 환경을 의미한다.
If-None-Match Header를 어느 상황에서 쓰이는가?
If-None-Match 헤더란 서버가 제공한 최신 데이터와 클라이언트가 가진 데이터가 동일한지 확인하는 용도로 쓰인다.
If-None-Match 가 필요한 상황으로는 클라이언트가 캐싱된 데이터를 사용해도 되는지 확인할 때 사용된다. 예를 들어서 브라우저나 애플리케이션이 이미 저장된 데이터를 다시 요청하는 경우 If-None-Match 헤더를 포함하면 서버에서 최신 데이터를 검사할 수 있다.

S3 Bucket의 Policy와 IAM Policy의 우선 순위

S3 Bucket Policy와 IAM Policy의 우선 순위는 존재하지 않는다. 권한의 동작 방식은 아래와 같이 동작하기에 권한은 우선순위는 없다.
S3 Bucket Policy
IAM Policy
Result
Allow
Allow
Allow
Allow
Deny
Deny
Deny
Allow
Deny
Deny
Deny
Deny
Allow
없음
Allow
없음
Allow
Allow
없음
없음
Deny