Amazon Simple Storage Service(Amazon S3)는 업계 최고의 확장성과 데이터 가용성 및 보안과 성능을 제공하는 객체 스토리지 서비스입니다. Amazon S3는 99.999999999%의 내구성을 제공하도록 설계되었으며, 전 세계의 수백만 애플리케이션을 위한 데이터를 저장합니다.
Amazon S3 소개
Amazon S3
- what: AWS에서 제공하는 오브젝트 스토리지 서비스
- when:
- 파일을 저장하고 활용하고 싶을 때(미디어, 로그, 소스코드, 파일, 백업)
- Static Hosting 기능으로 서버 없이 웹 페이지를 제공하고 싶을 때
- 기타 파일을 관리하고 싶을 때
- How:
- 99.999999999%의 내구성 / 99.99%의 가용성을 가진 분산 스토리지로 파일 저장
- 다양한 기능
- Presigned URL: 제한된 사람에게만 전달, 버저닝/권한 관리
- 주기적인 복제, 일정기간 파일 삭제 방지, 버저닝, 암호화 등
- 객체 스토리지 서비스: 파일 보관만 가능 <-> Block Storage Service(EBS, EFS 등)
- 글로벌 서비스. 단, 데이터는 리전에 저장
- 무제한 용량
※ 파일 스토리지 VS 오브젝트 스토리지
파일 스토리지
- 파일을 계층 구조로 관리
- 빠르게 찾고 업데이트 작업 가능
- 확장이 제한적(수십 테라바이트 수준)
오브젝트 스토리지
- 파일을 오브젝트(데이터, 메타데이터, 아이디) 단위로 관리
- 정확한 경로를 알아야 찾기 가능
- 확장이 쉬움(수십 페타파이트 이상)
Amazon S3 기초
버킷
- S3의 저장공간을 구분하는 단위
- 디렉토리/폴더와 같은 개념
- 버킷 이름은 전 세계에서 고유 값: 리전에 관계없이 중복된 이름이 존재할 수 없음
S3 객체의 구성
- Owner: 소유자
- Key: 파일의 이름
- Value: 파일의 데이터
- Version Id: 파일의 버전 아이디
- Metadata: 파일의 정보를 담은 데이터
- ACL: 파일의 권한을 담은 데이터
- Torrents: 토렌트 공유를 위한 데이터
S3의 내구성
- 최소 3개의 가용영역(AZ)에 데이터를 분산 저장(Standard의 경우)
- 99.999999999% 내구성
- 99.9% SLA 가용성(스토리지 클래스에 따라 다름)
S3 보안 설정
- S3 모든 버킷은 새로 생성 시 기본적으로 Private(비공개)
- 보안 설정은 객체 단위와 버킷 단위로 구성
- Bucket Polkicy: 버킷 단위
- ACL(Access Control List): 객체 단위
- MFA를 활용해 객체 삭제 방지 가능
- Versioning을 통해 파일 관리 가능
- 액세스 로그 생성 및 전송 가능
실습 - S3 버킷 생성하기
- S3 검색 후 버킷 만들기

- 파일 업로드 (혹은 드래그 앤 드롭)

실습 - EC2 실행 시 S3 파일 불러오기
- S3 권한을 가진 IAM 역할 생성

- EC2 인스턴스 생성 시 IAM 설정 및 UserData 설정

#!/bin/bashsudo -sdnf install httpd -yservice httpd startchkconfig httpd onaws s3 cp s3://[버킷명]/index.html /var/www/html --region ap-northeast-2
S3 스토리지 클래스
S3 스토리지 클래스
- S3는 다양한 스토리지 클래스를 제공
- 클래스 별로 저장의 목적, 예산에 따라 다른 저장 방법을 적용
- 총 9가지 클래스
S3 스토리지 클래스 종류
S3 스탠다드
- 99.99% 가용성
- 99.999999999% 내구성
- 최소 3개 이상의 가용영역에 분산 보관
- 최소 보관 기간 없음, 최소 보관 용량 없음
S3 스탠다드 IA(Infrequently Accessed)
- 자주 사용되지 않는 데이터를 저렴한 가격에 보관
- 최소 3개 이상의 가용영역에 분산 보관
- 최소 저장 용량: 128kb
- 최소 저장 기간: 30일
- 데이터 요청 비용 발생: 데이터를 불러올 때마다 비용 지불(per GB)
- 사용 사례: 자주 사용하지 않는 파일 중 중요한 파일
S3 One Zone-IA
- 자주 사용되지 않고, 중요하지 않은 데이터를 저렴한 가격에 보관
- 단 한 개의 가용영역에만 보관
- 최소 저장 용량: 128kb
- 최소 저장 기간: 30일
- 데이터 요청 비용 발생: 데이터를 불러올 때마다 비용을 더 많이 지불(per GB)
- 사용 사례: 자주 사용하지 않으며 쉽게 복구할 수 있는 파일
S3 Express One Zone
- 매우 빠른 퍼포먼스를 위해서 하나의 가용영역에 위치한 특별한 저장소에 저장
- millisecond 단위의 응답속도(약 10배 빠름)
- standard와 비교해 50% 저렴한 요청 비용
- Amazon S3 Directory Bucket에 저장
- 컴퓨팅 리소스와 스토리지 리소스를 같은 공간에 위치시켜 더 빠른 액세스 가능
- 몇몇 리전만 사용 가능
S3 Glacier Instant Retrieval
- 아카이브용 저장소
- 최소 저장 용량: 128kb
- 최소 저장 기간: 90일
- 바로 액세스 가능
- 사용 사례: 의료 이미지 혹은 뉴스 아카이브 등
S3 Glacier Flexible Retrieval
- 아카이브용 저장소
- 최소 저장 용량: 40kb
- 최소 저장 기간: 90일
- 분~시간 단위 이후 액세스 가능
- 사용 사례: 장애 복구용 데이터, 백업 데이터 등
S3 Glacier Deep Archive
- 아카이브용 저장소
- 최소 저장 용량: 40kb
- 최소 저장 기간: 90일
- 데이터를 가져오는데 12~48시간 소요
- 사용 사례: 오래된 로그 저장, 사용할 일이 거의 없지만 법적으로 보관해야 하는 서류 등
S3 Intelligent-Tiering
- 머신 러닝을 사용해 자동으로 클래스 변경
- 퍼포먼스 손해/오버헤드 없이 요금 최적화
S3 on Outposts
- 온프레미스 환경에 S3 제공
- 내구성을 확보한 상태로 파일을 저장하도록 설계
- IAM, S3 SDK 등 사용가능
S3의 권한
S3의 권한 관리 방법
- IAM 정책: 자격 증명(IAM 사용자, 그룹, 역할) 등에 부여하는 정책으로 S3에 대한 권한 부여/거부
- 버킷 정책: 버킷 자체에 특정 주체가 행사할 수 있는 권한 부여/거부
- ACL
- 버킷 혹은 객체 단위로 읽기, 쓰기의 권한을 부여
- S3에서 설정을 통해 ACL을 활성화 시킨 후에 적용 가능
- 파일 업로드 시 설정 가능
- 간단하고 단순한 권한 관리만 가능
- 점점 사용하지 않는 추세. 대부분의 경우 버킷 정책 / IAM 정책으로 대체 가능
S3의 계층 구조
- AWS 콘솔에서는 S3의 디렉토리(폴더)를 생성 가능하고 확인 가능
- S3 내부적으로는 계층 구조가 존재하지 않음
S3 버킷 정책
- 버킷 단위로 부여되는 리소스 기반 정책
- 해당 버킷의 데이터에 "언제 어디서 누가 어떻게 무엇을"할 수 있는지 정의 가능
- 리소스의 계층 구조에 따라 권한 조절 가능
- 예:
"resource": "arn:aws:s3:::my-bucket/images/*" -> my-bucket의 images/로 시작하는 모든 객체에 대해서
- 다른 계정에 엔티티에 대해 권한 설정 가능
- 익명 사용자에 대한 권한 설정 가능

S3 버킷 관리 방법의 선택
- IAM 정책
- 같은 계정의 IAM 엔티티의 S3 권한을 관리할 때
- S3 이외의 다른 AWS 서비스와 같이 권한을 관리할 때
- 버킷 정책
- 익명 사용자 혹은 다른 계정의 엔티티의 S3 이용 권한을 관리할 때
- S3만의 권한을 관리할 때
실습 - S3 권한 부여: IAM 정책
- 사용자 그룹 생성

- 권한 추가

※ 정책 연결: AWS에서 지정한 권한 설정
※ 인라인 정책 생성: 임의로 정책 생성 가능
- 사용자를 생성하여 생성한 그룹에 추가
실습 - S3 권한 부여: 버킷 정책
- S3 버킷 생성
- 버킷 권한 탭에서 버킷 정책 설정
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListSpecificBucket",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::demo-my-home-bucket-342849269408",
"Condition": {
"StringLike": {
"s3:prefix": [
"",
"home/",
"home/${aws:username}/*"
]
}
}
},
{
"Sid": "FullAccessToUserHome",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::demo-my-home-bucket-342849269408/home/${aws:username}",
"arn:aws:s3:::demo-my-home-bucket-342849269408/home/${aws:username}/*"
]
}
]
}
S3 업로드/다운로드
S3의 업로드/다운로드 방법
- AWS Web Console
- AWS SDK/AWS CLI
- 일반 URL(버킷/파일이 공개되어 있을 경우, 다운로드만 가능)
- 미리 서명된 URL(Presigned URL)
※ 수동 파일 공유의 문제점
- IAM 유저의 개수 제한
- 관리가 어려움
- 만료 기간 설정이 어려움
- 유출 시 모두에게 다시 공유 필요
- 세세한 권한 조절 불가능
미리 서명된 URL(Presigned URL)
- S3의 파일을 안전하게 공유하고 싶을 때 사용
- 생성자가 가진 권한으로 파일에 접근 가능한 임시 URL을 생성
- URL의 만료 기간 지정 가능
- Method(Get, Put 등) 설정 가능
- URL의 권한은 생성자가 가진 권한 중 일부 혹은 전체 사용
- 예: 생성자가 Get 권한이 없다면 URL로 GET 불가능
Amazon S3 멀티파트 업로드
- 하나의 파일을 여러 파트로 나누어서 업로드 하는 방식
- 장점
- 빠른 속도
- 파일 업로드의 컨트롤 보장(예: 중간부터 업로드하기)
- 단점
- 업로드 로직이 단일 파트보다 조금 더 복잡
- 업로드에서 발생하는 파일들의 관리 포인트 증가
※ AWS에서는 100mb 이상의 파일을 업로드 할 경우 멀티파트 업로드를 권장

* 주의사항
- 멀티파트 업로드가 중지되거나(명시적 중지가 아닌 에러 등), 업로드 이후 합치지 않을 경우 업로드 된 파트 파일은 S3에 잔류 => 비용 발생!
- S3 Storage Lens 등의 서비스로 현재 완료되지 않은 멀티파트 업로드 파일 확인 가능
- S3 생명주기 설정을 통해 일정 시간 이후 삭제 가능
S3 버전관리 및 객체 잠금
S3 버전 관리
S3 버전 관리
- 객체의 생성, 업데이트, 삭제의 모든 단계를 저장
- 삭제 시에는 실제 객체를 삭제하는 대신 마커를 추가
- 버킷 단위로 활성화 필요(기본적으로 비활성화)
- 수명 주기 관리와 연동 가능
- MFA 인증 후 삭제 기능을 통해 보안 강화 가능
S3 버전 관리 유의사항
- 중지 가능. 단, 비활성화 불가능
- 한번 버전 관리를 시작하면 비활성화 불가능(버킷 삭제 후 재생성으로 해결은 가능)
- 모든 버전에 대해 비용 발생
- 10gb 객체의 버전이 5개 있다면, 총 50gb에 대해 비용 발생
S3 객체 잠금
S3 객체 잠금
- Write Once, Read Many(WORM) 모델을 활용하여 객체를 저장
- 고정된 시간, 혹은 무기한으로 객체의 삭제/덮어쓰기 방지 가능
- 규정 준수 및 객체의 보호를 위해 사용
- 버전의 활성화 필요
S3 객체 잠금의 종류
- 보관보드(Rentention Mode): 일정 기간 동안 수정 방지
- 규정 준수 모드: 누구도 잠금 설정 변경, 객체 삭제 불가능
- 거버넌스 모드: 특별한 권한 없이 삭제 혹은 잠금 설정 변경 불가능
- 객체 삭제 방지 혹은 규정에 따라 보관하기 위해 사용
- 규정 준수 모드의 테스트
- 법적 보존(Legal Hold)
- Hold를 객체에 부여하고, Hold가 존재하는 한 객체 삭제, 수정 불가능
- 제한 기간이 없음
※ 버전 관리 활성화

※ 버전 표시

S3 수명주기
수명주기
- 일정 기간 이후 오브젝트의 상태 변경 가능
- 전환 작업(Transition actions): 다른 스토리지 티어로 옮기기
- 예: 30일 후 아카이브(Glacier)로 보내기
- 예: 50일 후 객체를 IA로 보내기
- 만료 작업(Expiration actions): 오브젝트 삭제
- 수명 주기 설정 시 소급 적용
- 예: 30일 이후 만료 작업을 설정했다면 기존 버킷의 모든 30일 이상된 오브젝트도 같이 적용
- 필터 및 날짜 적용 가능
- 예: image/thumbnail/production 디렉토리의 5mb 이상 파일을 30일 뒤에 모두 아카이브
- 예: 2024-05-30 부터 /image/dev 디렉토리의 1mb 이상 이미지를 모두 삭제
전환 작업
- 일정 기간 이후 오브젝트의 스토리지 클래스 변경
- Waterfall 모델
- 제약 사항 있음
- 예: 다른 클래스 -> Standard로 변경 불가능
- 예: 128KB 미만 파일의 경우 Standard/IA -> S3-Intelligent or Glacier Instant Retieval로 변경 불가능
만료 작업
- 버저닝에 따라 다른 방식
- 버저닝이 없을 때: async로 영구 삭제
- 버저닝이 있을 때: delete marker가 현재 버전이 아니라면 marker 추가 후 현재 버전으로 격상
※ 현재 버전이 delete marker라면 동작하지 않음
- 삭제 날짜에 바로 삭제되지 않고 일정 딜레이 발생 가능
- 그 동안은 비용 없음
- HeadObject/GetObject API로 삭제 예정 확인 가능
조건
- 객체의 수명
- 전환 혹은 생성부터 일정 기간 경과 후 효과 발생
- 날짜
- 특정 날짜부터 효과 발생. 단, 콘솔로 설정 불가능(확인만 가능)
- 예: 5월 30일부터 모든 오브젝트 삭제
- 필터
- 두 조건 모두 필터링의 조건을 만족해야 발동
- 특정 조건으로 필터링 가능
- prefix
- 예: /log, /log/production, /image/thumbnails
- tag
- 특정 태그가 있을 때
- And로 연결 가능
- 오브젝트 사이즈
- 필터링 조건 조합 가능
※ S3 수명주기 설정

S3 암호화
S3의 객체 암호화
On Transit
At Rest(Server Side)

-
SSE-S3: S3에서 알아서 암호화(Default)

-
SSE-KMS: KMS 서비스를 이용해 암호화

-
SSE-C: 클라이언트에서 제공한 암호화 키를 통해 암호화

-
DSSE-KMS: KMS를 활용해서 Dual Layer(2계층) 암호화를 적용하는 암호화
Client Side
- 클라이언트가 직접 암호화

※ 암호화 시 데이터의 복제가 불가능한 경우 발생
S3 정적 호스팅
Amazon S3 Static Hosting
- S3를 사용해서 정적(Static) 웹 컨텐츠를 호스팅하는 기능
- 별도의 서버 없이 웹사이트 호스팅 가능
- 사용 사례: 대규모 접속이 예상되는 사전 예약 페이지, 홍보 페이지, 회사 웹사이트 등
- 장점
- 고가용성/장애 내구성을 확보
- Serverless
- 즉, 사용한 만큼만 비용을 지불
- 배포와 수정이 쉬움
- 자체적으로 도메인 주소 변경, HTTPs 불가능. 단, Route53/CloudFront 등과 연동하여 주소 변경 및 HTTPs 구현 가능
실습 - S3 정적 호스팅
- 버킷 생성 시 퍼블릭 액세스 차단 해제

- 정책 설정(불특정 다수가 접근 가능한 정책)

- 정적 웹사이트 호스팅 활성화

S3 기타기능
Amazon S3 액세스 로깅
- Amazon S3의 버킷을 정해 활동 로그를 다른 S3 버킷에 저장하는 기능
- 지정한 버킷에 로그 파일 저장
- 반드시 기록 대상 버킷과 로그 저장 버킷의 분리 필요 -> 무한 파일 생성 방지
- 보안 감사 및 분석 목적으로 활용
이벤트 호출
- 객체의 생성/삭제/변경 이벤트 발생 -> 다른 서비스 호출
- 예: 파일 업로드 시 람다를 호출해 파일 무결성 검사
- SNS, SQS, Lambda 호출 가능

S3 기타기능
- 복제(Replication): 지정 S3 버킷의 변경 내역을 다른 버킷으로 비동기로 복제하는 기능
- 다른 리전, 다른 계정의 버킷으로도 복제 가능
- Delete Marker 복제 가능
- Transfer Acceleration: CloudFront를 통해 다운로드를 최적화시키는 서비스
- Requester Pay: 버킷의 소유자 대신 요청자가 요청 및 다운로드 비용을 부담하는 모드
- 주요 사용 사례: 기업 간 데이터 공유, 리서치 데이터 공유 등
실습 - 이벤트 호출을 통한 썸네일 이미지 만들기
- IAM 역할 생성

- 람다 함수 생성

※ 람다 함수 생성 시 생성한 IAM 역할 등록

- S3 이벤트 알림 생성


※ 무한 루프 방지를 위해 접두사 설정 필수!

S3 활용 - Amazon Athena 맛보기

Amazon Athena는 표준 SQL을 사용해 Amazon S3에 저장된 데이터를 간편하게 분석할 수 있는 대화식 쿼리 서비스입니다. Athena는 서버리스 서비스이므로 관리할 인프라가 없으며 실행한 쿼리에 대해서만 비용을 지불하면 됩니다.
Amazon Athena
- 인터렉티브 쿼리를 통해 S3의 데이터를 조회할 수 있는 서비스
- 별도의 프로비저닝 혹은 서버 없이 동작 = Serverless
- 사용 사례
- 여러 로그 파일이 저장된 S3에서 필요한 데이터를 조회
- 정형화된 메타데이터 혹은 저장 데이터를 조회
- 이벤트 데이터에서 필요한 정보를 추출(A/B 테스트) 등
- 주로 AWS Glue 서비스로 데이터 스키마 생성

AWS Glue는 완전 관리형 추출, 변환 및 로드(ETL: extract, transform, and load) 서비스로 효율적인 비용으로 간단하게 여러 데이터 스토어 및 데이터 스트림 간에 원하는 데이터를 분류, 정리, 보강, 이동합니다.
로그 수집/분석 아키텍처

실습 - Athena를 활용한 로그 분석
- S3 로그 버킷 생성 및 로그 업로드

- AWS Glue Crawler를 사용해 S3 버킷에 저장된 로그의 스키마 생성

a. Add data source 시 로그 버킷 선택

b. IAM 역할 생성

c. 데이터베이스 선택

- Athena 쿼리 편집기 탐색

- 쿼리 결과 및 암호화 설정


※ S3 로그 버킷과 다른 S3 쿼리 result 버킷
- Athena 쿼리 편집기에서 쿼리 입력

참고
https://www.inflearn.com/course/%EC%89%BD%EA%B2%8C-%EC%84%A4%EB%AA%85%ED%95%98%EB%8A%94-aws-%EA%B8%B0%EC%B4%88/dashboard