Amazon S3 part.1

2021. 9. 6. 01:12Cloud/AWS 기초

Amazon S3는 어떤 서비스 일까?


아마존에서 설명하기로는

 

저장공간을 제공해 주는 객체 수준의 스토리지 이다.

 


객체 스토리지 (Object-based storage device)라고 하는데 이렇게 거창한 단어는 무슨 의미일까?

 

우리가 평소에 웹 하드(구글 드라이브, 네이버 클라우드 등등)를 사용할때 어떻게 파일을 관리하는지 한 번 상상해 보자. 먼저 저장하고 싶은 파일을 업로드한다. 이 파일을 수정하고 싶을때는 다운로드를 받아서 수정 후 과거 파일을 지우고 수정된 파일을 다시 업로드한다. 이와 같은 형식으로 사용하는 스토리지를 우리는 객체 스토리지 라고 표현한다. 즉 파일을 하나하나 확인하고 관리하는것이 아닌 객체(파일)단위로 관리한다 라는 것 이다. ==> 사용자가 필요한 저장공간을 형성하고 그곳에 업로드, 다운로드, 관리를 한다.

 

이런 S3의 특징은 어떤게 있을까?


99.999999999(9가 11개)의 내구성을 가지고 있다.
여기서 아마존이 이야기 하고자 하는 것은 수정을 하거나 삭제를 하기 전까지 파일에 그 어떤 손상없이 보관을 할 수있다. 라는 내구성을 가지고 있으며 안전히, 믿고 쓸수 있다 라는 의미이다. 최소한 전쟁, 대규모 자연재해 등이 발생해 데이터센터가 큰 이변이 발생하지 않는 이상은 안정성을 확보한다. 라고 볼 수 있다.

이벤트 트리거의 역할을 할 수 있다.

일반적으로 S3는 저장공간인 만큼 다양한 이벤트가 발생한다. 이에 따라 이 이벤트를 제어할 수 있는 트리거 역할을 할  수 있다.

다음은 S3 버켓의 일반적인 형성 시나리오 이다.


1. 버켓을 형성한다. 

이때 S3 버켓이라는 논리적인 저장 공간이 형성된다.

2. 이벤트가 발생한다.

파일의 업로드, 다운로드, 삭제, 수정 등등 이 대표적인 예시이다.

3. 2를 처리하기 위해 어떤 행동을 실시한다.

업로드가 되자마자 특정 app을 사용해 처리하고싶다. 라고 할때 지속적으로 S3서비스에 요청하거나 S3가 이벤트가 발생할 때마다 트리거 역할을 해 행동한다.

 

저장용량에 대한 제약이 없다.

일반적으로 5GB를 기본으로 하지만 AWS에서는 모니터링 서비스를 통해 수없이 많은 S3를 생성할 수 있다. 단 여기에 발생하는 비용은 사용자의 몫 이다.

 

이런 S3는 그럼 어떻게 사용할 수 있을까?

S3는 웹 기반의 웹 기반의 스토리지의 특징을 가지고 있어서 정적 웹 콘텐츠(static web hosting)와 미디어를 저장 및 배포를 할 수 있다. 

API함수를 사용하는데 Http/https를 사용하여 접속할 수 있는 EndPoint를 제공해 준다.

 

* Static web hosting

서버 없이도 웹 서비스를 구성할 수 있는 기술이다. 일반적으로 웹 서비스를 구연하기 위해서는 네트워크가 있어야하며 서버가 있어야하며 운영체제가 설치되어 있어야한다. 이런 모든 관리를 해야하는데 정적 웹 콘텐츠를 사용하게 되면 그냥 이 기술을 사용하기만 하면된다. 대신 CSS(client side script)만 사용하면 되지만 SSS(server side script)는 지원하지 않는다. 즉 php, jsp등은 안된다.

* EndPoint = 외부에 접속할 수 있는 접촉지점, 주로 URL로 만들어진다.

S3의 이름 : https://[버켓이름].s3.amazonaws.com의 형식을 가진다.
파일이름 : https://[버켓이름].s3.amazonaws.com/파일이름.확장자
파일을 업로드 하게 되면 버켓 안에 되는 파일도 URL도 만들어진다.

 

버켓을 만들고 제어하는 방식은 크게 2가지가 있는데 하나의 버켓에 모든 접근제어를 형성해 복잡한 문서를 만들어 제어를 하는 방법이 있다. 이 방법은 다수의 버켓을 관리할 필요가 없어서 편리하지만 제어정책을 형성하고 관리하기 힘든 단점이 있다. 다른 방법으로는 버켓을 여러 개 생성 후 동일한 데이터를 주입하여 단순하게 접근제어를 한다. 이때의 단점은 저장공간이 더 많이 발생해 비용이 발생하게된다는 점이 있다.

 

이런 귀찮은 문제를 해결하기 위한 하나의 방법으로는 access point(엑세스 포인트) 라는 개념을쓴다. 사용자별로 접근지점을 설정해 주는데 이 엑세스 포인트 별로 관리할 수 있게 된다. 엑세스 포인트는 단일 사용자, 그룹사용자, 에플리케이션 등을 지원해 준다.

 

업데이트 된 파일을 특정 사용자들만 접근하도록 하는 경우가 있는데 이때 접근제어를 할 수 있는 방법이 필요하다.
버켓을 최초로 만들게 되면 이때는 이것을 만든 소유자만 사용할 수 있는 비공개 상태(Private Access)가 된다. 하지만 접근정책을 통해서 공개 상태(Pubilc Access)를 활성화해서 모든 사용자가 공개적으로 접근할 수 있도록 할 수 도 있다. 또한 ACL정책을 사용해 특정 사용자는 특정한 경로, 파일만 접근할 수 있도록 하는 정책을 형성 할 수 있다.


좀 더 상세하게, 내가 원하는 형태의 권한제어를 하고 싶을땐 버켓 정책(IAM, Policy Generator)을 사용해서 할 수 도있다. 이는 보통 json형태의 문서형태를 만들고 있다. 문서 형태는 아래와 같다.

 

S3제어 정책 - Policy Generator


Version = 항상 동일한데 내가 만든 정책의 버전이 아닌 전체 문서의 form버전이다.
ID = statement를 구분할 수 있는 ID이다.
SID = statementID이다. 아래에 서술될 내용을 구분하는 ID이다.
Effect = 거부와 허용을 기록하는 부분이다.

항상 어떤 이벤트가 발생하면 이 이벤트를 거부할 것인가 에 대한 요청을 먼저 찾아본다. 거부 요청이 있을 경우 접근금지, 사용안함 등의 이벤트를 발생시킨다. 하지만 어딘가에 허용이 되어 있다면 작업을 개시한다. 여기서 중요한 점은 특정 이벤트가 거부 되어있지 않다. 라고 해서 허용이 되있다는 것은 아니다.

 

Principal = 어떤 계정을 대상으로 할 것인가?

여기서 *은 모든 대상을 삼겠다 라는 의미이다.


Action = 이 제어는 어떤 행동을 할 것인가? 에 대한 내용이다. 위 문서는 S3를 대상으로 한 모든 요청의 종류 라는 의미이다.
Resource = 조금 구체적으로 대상을 어떻게? 뭘 할것인가에 대한 내용이다. 위 문서는 aws의 s3 안의 모든 파일들을 대상으로 삼아 두었다.
condition = 조건을 명시해 둔다. 위 문서는 IP를 지정해 두고 not ip address ip주소가 지정된 출발지 주소(54.240.143.0/24)가 아니면 안된다. 라고 명시가 되어 있다.
버켓을 사용하는 보안주체가 많을 경우 하나의 버켓 정책으로 하면 복잡해 지기에 다양한 버킷정책을 사용한다

 

 

S3를 사용해 전체 정적 웹 사이트 호스팅(html, 이미지, 동영상 등으로만 구성된 경우)을 구축하는 경우 굉장히 간편한데 그 이유는 다음과 같다.


1. 네트워크 생성도 안해도되며
2. 서버도 안 만들어도 된다.
3. 관리를 할필요가 없다.
즉 S3를 이용해서가 아니라 네트워크와 서버를 만들어서 사용할려면 가용성이나 장애대응등에 대한 조치를 취해야한다. 즉 운영, 관리상의 업무가 가중되는데 S3를 사용하면 전혀 걱정할 필요가 없다.
이런게 관리형 서비스 라고 한다.

Amazon S3 versioning

버켓에 업로드 되는 파일을 실수로 삭제 혹은 덮어쓰기 등으로 인해 내가 생각하는 행동과 다른 결과가 나오게 된다면 큰 문제가 생길 수 있을 파일들이 있다.
이때 버저닝 이라는 기능을 사용해 관리할 수 있다.
버저닝 기능을 사용해 '파일1' 이라는 파일을 삭제할 경우 Delete marker라는 마커가 형성되고 사용자에게는 실제로 파일이 삭제된 것처럼 보여준다. 이후 '파일1'을 다시 업로드 할 경우 파일은 버전을 붙여서 '파일1.버전2'의 형식으로 새롭게 생성해 준다. 즉 같은 이름의 파일이지만 다른 버전으로 사용할 수 있다. 이는 데이터 보전, 보호를 위해 사용할 수 있다.


단 S3는 저장, 요청, 전송에 대한 요금을 청구하는데 버저닝 기능이 활성화 될 경우 저장요금에서 중복적으로 계속 발생하기에 반드시 필요한 버켓에만 관리해야한다.
또한 주기적으로 더미파일을 청소할 필요가 있다.


S3의 엑세스 제어 정책 - CORS(Cross Origin Resource Sharing)
서로 다른 도메인간의 리소스를 공유해 주는 방식이다.
웹 사이트를 만들때 어딘가에 올려진 자바 스크립트 코드를 사용하거나 디자인(CSS)를 불러와 사용하는 경우가 있다. 이런 경우가 바로 CORS기능이 활성화 되는 환경을 의미한다. 버켓을 만들고 이 안에 JS, CSS코드 등을 올려둔 후 누구든지 사용하도록 허용하고 싶으면 이 기능을 활성화 시키고 문서를 작성한다.

CORS문서

allowedorigin = 어디에서 접근하는것을 허용해 줄 것인가에 대한 내용이다. 위 문서는 www.example.com에서  서 접근하면 허용하겠다 라는 의미이다.

allowedmethod = 어떤것을 받아들일건지에 대한 내용이다. pus,post,delete를 허용한다.

allowedheader= 어떤것을 처리할 것인지에 대한 내용이다. *은 모든것을 처리하겠다 라는 의미이다.

maxageseconds = 얼마나 이 기간을 유지할 것인지에 대한 내용이다. 약 3000초간 유지 하겠다는 의미이다.

이런 기능은 개발자들이 많이 사용하는 기능중 하나이다.

 

 


























'Cloud > AWS 기초' 카테고리의 다른 글

Amazon EC2 part.1  (0) 2021.09.08
Amazon S3 part.2  (0) 2021.09.06
AWS Lamdba(개발환경 설정)  (0) 2021.08.18
AWS Lamdba (코드 작성 및 관리)  (0) 2021.08.18
AWS Lambda(AWS람다란?)  (0) 2021.08.18