S3(Simple Storage Service)의 핵심 기능
S3(Simple Storage Service)는 인터넷 스토리지 서비스로, 용량은 무제한이고 파일을 저장하는 용도로 사용됩니다.
웹프로토콜인 HTTP 프로토콜로 파일에 접근할 수 있습니다.
HTTP프로토콜을 이용해서 파일을 업로그, 다운로드 시킬 수 있습니다.
S3를 써야하는 이유
SNS와 같이 서버에 많은 미디어 파일을 저장해야하는 경우,
1) EC2와 EBS만을 사용해서 저장을 하게되면 용량에 따른 과금도 부담되고 ==> 비용
2) 저장소를 구축해서 관리하는 것에도 문제있습니다. ==> 성능
하지만 S3를 사용하면 S3 한 곳에 모든 미디어 파일을 관리할 수 있고,
과금 문제도 EC2& EBS 조합에 상대적으로 훨씬 싼 가격에 이용할 수 있고,
구축 후 확장이나 축소와 같은 DB 관리하는 것에도 속도를 유지하는 상태에서 저장소가 무제한이라 가능합니다.
또한, EC2와 EBS로 정적 웹 서비스(HTML과 JavaScript로 구성된, (XML이 아닌)) 를 구축한다면 일일이 EC2 EBS를 생성할 필요없이 바로 S3에서 연결하여 사용하면 됩니다.
쉽게 말하면 HTTP 프로토콜로 정적 웹처리를 할 수 있는 기능을 가진 클라우드 저장소라고 생각하시면 됩니다.
단, 기존의 네이버 클라우드와 같은 서비스는 저장할 목적으로만 만들어서 프로토콜이 업로드와 다운로드로만을 위해서 만들어졌다고 생각하면 됩니다.
클라우드에서 필요로하는 부가적인 프로그램의 설치없이도 HTTP 프로토콜로 구성된 서비스를 사용해서 처리할 수 있습니다.
S3는 AWS에서 스스로 서버를 증설하고 성능을 관리하기 때문에 EC2&EBS로 구축했을때 처럼 성능이나 용량을 높이는 기술력을 갖추고 있지 않아도 됩니다.
만약 동적웹페이지(ASP, JSP, PHP, Ruby on Rails로 구성된) 서비스를 한다면 동적 웹페이지의 처리는 EC2나 다른 곳으로 돌리고 나머지 정적웹페이지 처리만 S3에서 하는 방식으로 서비스를 할 수도 있습니다.
S3의 기본 개념
객체(Object) : S3에 데이터가 저장되는 최소 단위. 1) 파일 2) 메타데이터로 구성이 됩니다.
- 기본적으로 객체의 Key가 데이터의 이름이고, Value가 데이터 파일입니다.
- 객체 하나의 크기는 최소 1Byte부터 4TB까지 입니다.
- 메타데이터는 HTTP Content-Type 형식(MIME)입니다. 파일의 확장자에 따라 자동으로 설정되며 임의로 설정할 수도 있습니다. Key-Value 형식으로 저장됩니다.
버킷(bucket) : S3에서 생성할 수 있는 최상위 디렉토리입니다. 버킷은 각 Region 별로 생성이 가능하고, 버킷의 모든 이름은 모든 S3 Region에서 유일해야합니다. 계정별로 100개까지 생성할 수 있습니다.
- 버킷 안에 객체(Object)들이 저장됩니다.
- 버킷 안에 디렉토리 생성이 가능합니다.
- 저장 가능한 용량은 무제한입니다.
- 저속 제어 및 권한 관리가 가능합니다.
ex) http://apple.s3.amazonaws.com/image.jpg => 와 같이 URL로 접근이 가능합니다. 여기서 버킷명이 apple 이고 object명이 image.jpg 입니다.
내구성과 가용성 : 1년 기준으로 99.999999999%의 내구성을 보여줍니다. 즉 무슨 이야기이냐면 내부에 저장된 Object를 유실하지 않고 1년동안 보존할 수 있는가입니다. 가용성은 1년동안 정상적인 서비스를 통해서 사용할 수 있는 시간이라고 해석하면 됩니다.
요금 : 요금의 경우에는 1) 저장 용량 2) 데이터 전송량 3) HTTP 요청(Request) 개수로 책정됩니다.
* 자세한 요금에 관련된 사항은 http://aws.amazon.com/s3/pricing/ 을 참고하시면 됩니다
S3의 스토리지 유형
S3는 내구성에 따라 다른 두 가지의 스토리지의 옵션이 있습니다. 이 옵션은 디렉토리의 Object 별로 설정할 수 있습니다.
1) Standard Storage
: 일반적인 스토리 옵션입니다. 내구성은 99.999999999% 이고, 내구성을 유지하기 위해서 AWS에서 더 많은 관심을 기울이기 때문에 그만큼 비용이 많이 들기 때문에 요금이 높습니다.
유실되면 안 되는 중요한 데이터를 서비스 저장해야하는 경우가 있는 경우 사용합니다.
2) RRS, Reduced Redundancy Storage
: Standard Storage보다 낮은 99.99% 내구성을 가지고 있습니다. 내구성을 높이는 원리가 동일한 파일을 복사해서 사본으로 관리하여 내구성을 높이는 것입니다. 그런데 RRS는 사본 수를 줄여서 요금을 낮추었습니다. 그만큼 낮은 내구성을 가지고 있습니다.
원본 데이터가 다른 곳에 있어서 유실해도 치명적이지 않은 데이터로써, 원본으로 다시 생성할 수 있는 데이터를 저장하는 경우 사용합니다.
11.1 S3 버킷 생성하기
보통 Region별로 서비스가 나위어서 해당 Region에 접속하지 않으면 해당의 서비스 객체를 볼 수 없는데 S3는 모든 리전이 통합되기때문에 어떤 리전에서 들어가서 S3 Bucket을 확인해도 같은 페이지가 나옵니다.
S3 버킷을 생성해보겠습니다. EC2 Dashboard=>S3=>Create Bucket=>Bucket Name 입력, Region 선택=>Create
seouls3bucket이 생성된 모습을 볼 수 있었습니다.
11.2 S3 버킷에 웹페이지에서 파일 올리고 받기
이번에 할 기능은 웹클라우드, 웹하드처럼 단순하게 올리고 받는 것입니다. 일단은 어떤식으로 올라가고 내려받아지는지에 대한 기본 원리에 대해서 설명하겠습니다.
생성된 해당 bucket을 더블 클릭해서 들어갑니다.
그리고 나서 그동안 많이 해봤던 설명이 없어도 아주 직관적인 과정입니다.
파일을 추가한 후, Set Details를 클릭합니다.
그리고 S3 타입을 선택하라는 것이 나오는데, 여기서 설명하자면 위에서 설명드렸던 Standard Storage또는 Reduced Redundancy Storage 두 가지 중 하나를 선택하는 것입니다. 중간에 있는 "Use Standard - Infrequent Access Storage"는 Standard Storage를 사용은 하지만 많은 접근이 없는 경우 요금을 낮출 수 있는 선택지입니다.
여기서는 "Use Standard Storage" 로 설정하고 그 밑에 있는 "Use Server Side Encryption" 은 서버에서 파일을 암호화해서 저장하는 옵션입니다. 체크 안하는 것으로 합니다. 왜냐하면 나중에 필요하게 되면 추후 설정할 수 있습니다.
그리고 Set Permissions 를 선택해서 넘어갑니다.
일단 여기서는 S3의 버킷에 대해서 접근하는 것을 하지않고 나중으로 넘기기때문에 기본값으로 합니다.
"Grant me full control" 은 자신의 계정에 모든 제어 권한을 부여합니다. 기본값 그대로 사용합니다.
"Make everything public" 은 올리는 모든 파일을 인터넷에서 접근가능하게합니다. 기본값 그대로 사용합니다.
Set Metadata로 넘어갑니다.
마지막으로 올라오는 파일확장자에 따라 자동으로 HTTP Content-Type을 자동으로 설정하는 옵션입니다. 기본값 그대로 사용합니다.
Start Upload로 마지막으로 클릭하면 업로그된 파일을 볼 수 있습니다.
이제 올라간 파일을 볼 수 있고, 파일을 더블클릭하고나 오른쪽버튼 클릭을 해서 Download로 파일을 받을 수 있습니다.
* 추가로 S3를 관리하기 쉽게 하기 위해서 구글에 S3 GUI Client 를 입력하면 나오는 S3 관리 툴을 보실 수 있습니다. S3를 관리할 때는 이 툴을 사용하면 좋습니다.
11.3 S3 세부 설정하기
S3는 버킷과 객체를 어떻게 설정하느냐에 따라 기능이 달라집니다.
권한 설정의 의미는 파일을 전체 공개하거나 특정 사용자에게만 공개하고 싶을 때 사용합니다.
그리고 버킷 정책을 설정하는 것에 따라 다양한 접근 제어가 가능해집니다. 예를 들어 특정 도메인에서만 S3 객체를 링크할 수 있도록 허용할 수 있도록 하고 싶다면, HTTP Referer 접근 제어 설정을 활용할 수 있습니다.
버킷을 정적 웹서버(정적 웹 호스팅)으로 사용하도록 설정하면 버킷 자체로 간단한 웹사이트 운영이 가능합니다.
추가로 버킷 로그 기록, 객체의 스토리지 옵션, 버저닝, 수명 주기를 관리할 수도 있습니다.
11.3.1 S3 객체 권한 관리하기
S3에 올라간 파일과 메타데이터를 객체라고 표현합니다.
S3에서는 객체마다 각각 접근 권한을 설정할 수 있습니다.
파일을 인터넷에 공개하는 접근 권한으로 바꾸는 것을 보이겠습니다.
해당 파일을 선택하고 Properties를 눌러서 해당하는 Link URI를 복사하여 접근해보겠습니다.
다음과 같이 접근이 거부되는 것을 볼 수 있습니다.
다시 파일을 선택하는 화면으로 돌아와서 오른쪽 클릭을 하고 Make Public을 클릭하고 확인을 하면 해당 파일이 정상적으로 다시 접근이 가능하는 것을 볼 수 있습니다. Make Public으로 만드는 과정은 파일이 많아도 모두 선택 후 오른쪽 클릭으로 Make Public을 누르면 됩니다.
그리고 해당 Object의 접근 권한을 설정하는 부분은 해당 객체의 Permissions에 들어가서 설정하시면 볼 수 있습니다.
현재 Me는 계정을 소유한 나이고, 모든 권한을 다 가지고 있습니다.
Everyone은 객체를 열고 다운로드를 받을 수 있는 권한만 가지고 있습니다.
* 추가적으로 Grantee는 권한을 부여할 대상입니다.
추가적으로 계정을 발급해 계정별로 권한을 부여하고 싶을때는 IAM 부분을 참조하여 계정을 생성하여 설정하게됩니다. 여기서는 다루지는 않겠습니다.
- Open/Download는 파일을 열고 다운로드할 수 있는 권한.
- View Permission은 Permission을 볼 수 있는 권한.
- Edit Permission은 권한을 수정할 수 있는 권한.
11.3.2 S3 bucket 권한 관리하기
버킷에 권한을 설정해보겠습니다. 버킷에 권한을 설정하게 되면 버킷 안에 있는 모든 객체에 그 권한 설정이 적용됩니다.
먼저 다시 버킷을 선택하는 화면에서, 접근하는 자를 구분하여 권한을 주기위한 정책을 만들어 보겠습니다.
정책을 만드는데 AWS는 JSON방식으로 입력된 정책을 사용하기 때문에 다음과 같은 과정을 거칩니다.
해당 bucket선택=>Add bucket policy=>Bucket Policy Editor에서 하단 AWS Policy Generator을 선택합니다.
상단의 과정을 거치게되면 http://awspolicygen.s3.amazonaws.com/policygen.html 으로 이동하게됩니다.
해당 사이트에서 S3 Bucket Policy를 선택하고,
Effect : 정책이 Allow 정책이냐, Deny 정책이냐를 선택해주고,
Principal : 권한을 적용할 사용자입니다. 누구한테 이 정책에 대한 것을 적용할 것이냐입니다. 여기서 IAM의 계정을 넣으면 그 계정의 사용자만 허용되는 정책이 만들어집니다. 여기서는 인터넷에 공개할 목적이기 때문에 * (와일드카드)로 해줍니다.
AWS Service : 해당하는 서비스에 정책을 적용하겠다라는 선택입니다. Amazon S3를 선택합니다.
Actions : 어떤 행위를 정책에서 적용할지에 대한 것입니다. 여기서는 허용정책이기 때문에 getObject와 같은 정책을 선택하면 객체를 참조하는 것을 허용하는 정책이 됩니다.
Amazon Resource Name(ARN) : 아마존 리소스를 사용하기 위한 이름입니다. ex) arn:aws:s3:::examplebucket10/* 를 넣게되면 의미가 AWS의 S3라는 서비스에 생성된 examplebucket10 버킷안에 모든 리소스를 뜻하게됩니다.
모두 입력하였으면 Add Statement를 누르고 하단에 Generate Policy를 클릭합니다.
그러면 다음과 같이 정책이 생성되게됩니다. 그리고 생성된 정책을 복사합니다.
그리고 다시 Bucket Policy Editor로 돌아와서 붙여넣기를 해줍니다. 그리고 저장을 해주면 정책적용이 됩니다.
이제 해당하는 seouls3bucket은 어떤 파일을 올려도 버킷안에 있는한 모든 사용자들에게 오픈되는 형태로 서비스를 제공하게됩니다.
실제로 해보면 어떤 객체를 업로드하더라도 모두 인터넷에 공객되는 것을 볼 수 있습니다.
11.3.3 S3 정적 웹사이트 호스팅 사용하기
S3를 웹 서버 형태로 사용하는 것을 써보겠습니다.
S3에서 사실 정적 웹사이트 호스팅 설정을 하지 않아도 웹브라우저를 이용해서 파일에 접근할 수 있습니다.
하지만 그냥 사용하는 것과 정적 웹사이트 호스팅 설정을 사용하는 것은 큰 차이점이 있습니다.
다음은 일반적인 S3의 URL 형태입니다.
s3-(리전 이름).amazonaws.com/(버킷 이름)/(파일 이름)
ex) http://s3-ap-northeast-1.amazonaws.com/seouls3bucket/image.jpg
다음은 정적 웹사이트 호스팅 설정을 한 S3의 URL 형태입니다.
(버킷이름).s3-website-(리전이름).amazonaws.com/(파일이름)
ex) http://seouls3bucket.s3-website-ap-northeast-1.amazonaws.com/image.jpg
이 URL을 S3 Website Endpoint라고 합니다.
두가지 URL의 형태의 큰 차이점이 있습니다.
이 차이점은 URL이 다음의 형태처럼 http://seouls3bucket.s3-website-ap-northeast-1.amazonaws.com/image.jpg
서브 도메인의 형태로 들어가야 DNS 서버에서 CNAME을 설정해서 사용할 수 있습니다.
CNAME을 사용해야하는 이유는 여러가지의 버킷이 존재하기 때문에 하나의 URI를 사용해서는 버킷을 다 표현해서 구분할 수없기 때문입니다.
CNAME 설정은 AWS의 DNS 서비스인 Route 53에서 설정이 가능하고 다른 도메인을 사고 파는 호스팅을 해주는 서비스에서도 가능합니다.
정적 웹사이트 호스팅 설정을 사용하게되면 여러파일과 버킷으로 고유한 이름으로 리다이렉션을 할 수 있기 때문에 좋습니다.
정적 웹사이트 호스팅용 버킷을 새로 만들고 나서 간단한 웹사이트를 만들어보겠습니다.
S3 버킷 목록에서 위쪽의 Create Bucket 버튼을 클릭합니다.
그리고 Bucket Name을 완성하고 Create 해줍니다.
버킷이 생성이 되면 생성된 버킷을 클릭하고, 버킷은 웹사이트용으로 만들 것이기 때문에 인터넷에 공개하도록 권한을 설정해줘야합니다.
위에서 권한을 정책으로 설정했던 것처럼 인터넷을 통해서 모든 사람들이 접근할 수 있도록 설정해줍니다.
일단 버킷클릭=>Properties=>Add bucketpolicy
*그리고 바로 위에 있는 내용인 AWS Policy Generator 링크로 접속해서 똑같은 과정으로 모든 사람들에게 접근권한을 줍니다.
- http://awspolicygen.s3.amazonaws.com/policygen.html
저같은 경우에는 버킷이름만 다르게해서 다음과 같이 JSON 형식이 나왔습니다.
그리고 Save를 눌러서 저장을 해줍니다.
그리고 이제 본격적으로 정적웹사이트호스팅 기능을 사용하기 위해서 설정을 하겠습니다.
버킷 클릭=>Static Website Hosting=>Do not enable website hosting 으로 되어있는 설정을=>Enable website hosting으로 변경=>그리고 버킷의 URI로 연결되었을때, 첫페이지를 장식할 index.html을 설정=>Save
그리고 index.html 파일을 만들어서 해당 버킷에 업로드 해줍니다.
- index.html 의 소스
<html>
<head>
<title>S3 Example Website Hosting</title>
</head>
<body>
<p>Hello S3</p>
</body>
</html>
이제 1) 웹사이트용으로 모든사람들이 접근할 수 있도록 접근권한 설정 2) 정적웹사이트호스팅 설정 3) index.html 업로그
세가지의 활동이 끝이 나게되고 이제 bucket을 클릭=>Properties=>Static Website Hosting=>Endpoint 클릭 으로 index.html로 접속이 되는지 확인합니다.
이렇게 S3 정적 웹사이트 호스팅 활용과정이 모두 마무리되게됩니다.
요즘 많이 쓰는 jQuery, jQuery UI, Bootstrap 등의 JavaScript 라이브러리 파일은 EC2에서 웹 서버를 구축하여 서비스를 하는 것보다 S3 정적 웹사이트 호스팅을 활용하여 서비스하는 것이 훨씬 좋습니다.
또한 이미지, CSS 파일 등도 S3 정적 웹사이트 호스팅 기능을 활용하는 것이 좋습니다.
지금까지 S3의 핵심기능을 살펴봤습니다.
다음 시간부터는 S3의 부가적인 기능들을 설명하겠습니다.
* Reference
1. 아마존 웹 서비스를 다루는 기술 - 이재홍 - 이분의 책은 AWS의 바이블이라고 생각됩니다. 구매해서 보시는 것 추천.