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 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 | Deny | |
Deny | Allow | |
Deny | Deny | |
Allow | 없음 | |
없음 | Allow | |
없음 | 없음 |














