🚀 AWS(Amazon Web Service)에서 제공하는 확장 가능한 객체 스토리지이다.
Simple Storage Service , S가 세개 들어가서 S3라고 한다.
이미지 파일이나 프론트 빌드 파일등을 저장할 수 있는 저장소를 제공해준다. 그 외 사용자가 사용하는 방식에 따라 다양한 데이터 형식을 저장하고 관리할 수 있다. 프론트 빌드 파일을 저장할 경우에는 CI/CD를 통해 캐싱 삭제 명령어로 자동 캐시 삭제, 저장 배포 작업을 설정해둘 수 있어, 정적페이지를 배포할 경우 S3와 CloudFront, Route53으로 클라이언트 배포를 할 때 많이 쓰기도한다. 유저가 전송한 프로필 사진과 같은 이미지파일도 S3에 저장해 S3에 저장된 주소로 가져와 사용할 수 있다. 그 외에도 데이터 백업 용도나 다양한 소스에서 수집한 데이터를 S3에 저장해 Amazon Athena, Amazon Redshift Spectrum, AWS Glue등을 사용하여 분석해 데이터 레이크로 활용할 수도 있다.
✅ S3 주요 특징
- 확장성
- 내구성
- 가용성
- 보안
- 비용 효율성
✔️ 확장성
데이터 저장 용량에 제한이 없어 필요에 따라 자동으로 확장된다.
✔️ 내구성
여러 복제본을 통해 99.99999%의 내구성을 제공한다.
✔️ 가용성
높은 가용성을 보장하여 언제 어디서나 데이터에 접근할 수 있다.
✔️ 보안
데이터 암호화 및 다양한 접근 제어 메커니즘을 제공한다.
✔️ 비용 효율성
사용한 만큼만 비용을 지불하는 구조로, 저장량과 데이터 전송량에 따라 비용이 결정된다.
✅ S3 구조
- 버킷(Bucket) S3의 최상위 컨테이너로 데이터를 저장하는 공간이다. 모든 객체는 하나의 버킷에 속한다. 버킷의 이름은 게임 ID처럼 전 세계에서 유일해야 된다. 리전 간 객체 공유는 불가능하다.
- 객체(Object) S3에 저장되는 실제 데이터 파일을 의미하며, 각 객체는 키(Key)와 메타 데이터(MetaData)를 포함한다. 객체 하나의 크기는 1Byte ~ 5MB이고 저장 가능한 객체 갯수는 무제한이다. 객체마다 접근 권한 설정(ACL)이 가능하다.
- 메타데이터(MetaData) 객체에 대한 설명이나 정보를 담고 있다.
✅ S3 버킷 및 객체 암호화의 중요성
✔️ S3 모니터링 및 로깅하기
CloudFront를 통해 S3 스토리지 안에 있는 빌드파일을 배포했다면 S3스토리지 안에 있는 데이터를 모니터링하고 로깅도 할 수 있는 기능을 AWS에서는 제공한다.
- CloudWatch S3 버킷의 활동을 모니터링하여, 너무 많은 요청이 올 경우와 같은 이상한 징후를 감지하고 대응할 수 있다.
- CloudTrail S3 API 호출 기록을 남겨, 누가 어떤 작업을 했는지 추적할 수 있다.
- S3 Access Logs 버킷에 대한 접근 기록을 남겨, 보안 및 감사 용도로 활용할 수 있다. 로그 파일을 S3에 저장하여 관리하는 방법도 있다.
✔️ 버킷 정책 알고가기
- S3 스토리지를 버킷 수준에서 접근 제어를 설정하여, 특정 사용자나 그룹에 대한 권한을 부여할 수 있다.
- 추가적으로 ACL(Access Control Lists)를 통해 객체 수준에서 접근 제어 설정이 가능하다. S3+CloudFront로 S3에 대해 처음 접하게 되었는데, 당시에는 배포하는 것이 목적이었기에 단순 블로그에 나와있는 글들을 따라하며 작성하였다. ACL의 개념을 알게되면서 같은 서비스 내에 권한에 따라 DB에 접근 권한을 설정하여 S3 스토리지를 관리하게 하면 회원 정보를 관리할 때 더 민감한 정보에 대한 보안을 더 높힐 수 있지 않을까하는 생각이 들었다.
✔️ 만약 S3 버킷이나 객체 암호화의 중요성
S3는 서버 측 암호화(Server-Side Encryption)를 제공해 사용자가 별도로 암호화 작업을 하지 않아도 데이터를 자동으로 암호화 한다는 장점이 있다.
S3 암호화의 장점으로는 기업측면에서 볼때 컴플라이언스를 준수하여 암호화를 통해 데이터 보호 규정을 준수할 수 있고, 전송 중이거나 저장 중인 데이터가 암호화되어 무단 접근을 방지할 수 있다.
✔️ 암호화를 하지 않았을 경우에는 어떻게 될까?
지난 프로젝트에서 개발 중에 서버측에서 무수한 get 요청을 받은 적이 있다. 알고 보니 누군가 봇을 이용하여 랜덤 url로 접속하여 무수한 get요청을 보낸 것이었다. 다행이 초기 인프라만 설정해둔 상태라 유저 정보와 같은 크게 예민한 정보가 있지 않아, 보안의 왜 중요한지에 대해 알게해준 해프닝으로 끝났다. 문제를 인지한 만큼 S3를 공부하며 보안에 대해 한번 더 알고 넘어갈 필요가 있다.
- 데이터 유출 : 암호화되지 않은 데이터는 해커나 내부자의 공격에 취약해 중요한 정보가 유출될 수 있다.
- 컴플라이언스 위반 : 많은 산업에서는 데이터 보호와 관련된 법적 요구사항이 있으며, 이를 준수하지 않을 경우 법적 문제가 발생할 수 있다.
- 데이터 무결성 손상 : 암호화를 통해 데이터의 무결성을 보호하지 않으면, 데이터가 변경되거나 손상될 위험이 있다.
✅ S3를 통한 데이터 관리 및 최적화하기
- 수명 주기 정책(Lifecycle Policy)으로 데이터를 자동으로 아카이빙하거나 삭제하여 스토리지 비용을 절감할 수 있다.
- 객체의 여러 버전을 저장하여 버전 관리(Versioning)를 할 수 있다. 데이터 손실이나 변경에 대비할 수 있다.
- 리전 선택: 데이터 접근 속도와 비용을 고려하여 적절한 AWS 리전을 선택한다. 해외 서비스를 운영할 경우 국가별 리전을 선택하여 데이터를 다룰 수 있다.
✅ 요금 관련
AWS S3는 사용자가 실제로 사용한 만큼만 과금하며, 일체의 부대 비용이나 초과 요금 없다.
- 이전에 S3 서비스의 버그로 인해 특정 버킷 이름을 사용하는 경우, 외부 라이브러리에 의해 자동으로 대량의 파일 업로드 요청이 발생하여 과도한 요금이 청구되는 문제가 있었다. 업로드 요청이 거부되어도 요청 횟수에 따라 과금이 이루어지는 시스템 설계로 인해, 실제 파일이 업로드되지 않았음에도 불구하고 큰 금액의 요금이 발생하였다. 후에 AWS에서 이 문제를 인지하고 허가되지 않은 요청에 대해서는 과금하지 않겠다는 방침을 세웠다. 사용자는 버킷 이름 노출을 피하고 CDN 서비스를 사용하여 보안을 강화할 수 있게되었다.
- 개발에서 가장 중요한 비용관련에 관해서도 S3는 첫 프로젝트에 있어 부담에 적었다. 실제 세달가량 프론트 빌드파일과 유저 프로필 사진 등을 저장하고 있었을 때 달에 4~6천원 정도 비용이 청구되었다. 더 줄이는 방법도 물론 있지만, 지금은 개발에 더 몰입해야하는 시점에서 AWS S3 스토리지는 데이터를 관리하는데 최선의 선택이었다.
☑️ 마무리
AWS S3는 어떻게 사용할 지에 따라 다양하게 사용할 수 있는 유연한 객체 저장소이다. 단순 S3 + CloudFront로만 묶어서 생각하는게 아니라 모니터링과 API 로깅과 같은 다양한 목적으로 사용할 수 있다.