 |
|
난이도 : 중급 Andrew Glover , Co-Founder, ThirstyHead.com
원문 게재일 : 2009 년 4 월 07 일 번역 게재일 : 2009 년 6 월 09 일 Amazon S3(Simple Storage Service)는 웹 애플리케이션 개발자가 이미지, 비디오, 음악 및 문서와 같은
디지털 자산을 저장하는 데 사용할 수 있는 공개 서비스입니다. S3는 프로그래밍 방식으로 서비스와 상호 작용할 수
있도록 RESTful API를 제공합니다. 이 기사에서는 오픈 소스 JetS3t 라이브러리를 통해 Amazon의 S3 클라우드 서비스를
활용하여 데이터를 저장 및 검색하는 방법에 대해 설명합니다.
소개
클라우드는 일부 작업 또는 서비스를 공동으로 처리하면서도 단일 엔터티인 것처럼 보이는
느슨하게 연결된 컴퓨터 그룹을 의미하는 추상적인 개념이다. 화면 뒤에 숨겨져 있는 아키텍처 또한
추상적이므로 각 클라우드 공급자는 필요에 따라 해당 오퍼링을 자유롭게 설계할 수 있다. SaaS(Software
as a Service)는 클라우드가 일부 서비스를 사용자에게 제공한다는 점에서 관련된 개념이다. 클라우드
모델의 경우에는 소프트웨어 및 소프트웨어 실행에 필요한 하드웨어를 서비스 공급자가 이미 구입해 놓은
상태이므로 사용자가 따로 구입하지 않아도 되기 때문에 비용을 절감할 수 있다.
 |
클라우드 컴퓨팅의 기원
클라우드 컴퓨팅이라는 용어는 새로운 용어가 아니지만(Amazon에서 2006년부터 클라우드
서비스를 제공하기 시작함) Google과 Amazon의 클라우드 오퍼링이 많이 알려지면서 2008년부터
전문 용어로 사용되기 시작했다. Google의 App Engine을 통해 사용자는 웹 애플리케이션을 빌드하여
Google의 인프라에서 호스팅할 수 있다. S3와 함께 Amazon Web Services에는 Amazon의 인프라에서
애플리케이션을 호스팅하는 기능을 제공하는 EC2(Elastic Cloud Compute) 계산 웹 서비스도 있다. 다른
회사에서도 Amazon 및 Google과의 치열한 경쟁에 뛰어들고 있으며, 대표적으로 Microsoft®에서는
Azure를 발표했으며 Sun Microsystems에서도 제품을 준비하고 있다(공식적으로 출시된 클라우드 컴퓨팅
제품은 아직 없음). IBM®에서는 최근에 개발자용 특정
제품을 Amazon EC2 환경에서도 사용할 수 있도록 준비하고 있다고 발표했다.
|
|
예를 들어, Amazon의 S3 오퍼링을 살펴보자. 이름으로 알 수 있듯이 S3는 웹 개발자가 애플리케이션에
사용할 이미지, 비디오, 음악 및 문서와 같은 디지털 자산을 저장하는 데 사용할 수 있는 공개 서비스이다. S3의
사용 환경은 인터넷에 디지털 자산이 포함된 하드 드라이브를 가지고 있는 시스템이 있다는 느낌을 준다. 실제로
한 지역에 분산되어 있는 수많은 시스템에 디지털 자산(또는 그 일부)이 있다. 또한 데이터를 저장 및 검색하는
서비스 요청을 수행하는 모든 복잡한 작업이 Amazon에서 자동으로 처리된다. 사용자는 매월 GB당 약 15센트의
소액으로 Amazon의 서버에 자산을 저장하고 데이터를 송수신할 수 있다.
시간과 노력을 절약할 수 있도록 Amazon S3 서비스는 RESTful API를 제공하므로 HTTP 통신을 통해 원하는
언어로 S3에 액세스할 수 있다. JetS3t 프로젝트는 S3의 RESTful API와 관련된 세부 작업을 추상화하여
일반적인 Java 메소드 및 클래스로 제공하는 오픈 소스 Java 라이브러리이다. 코딩 작업은 적게 할수록
좋은 것이다. 다른 사람이 노력해서 만들어 놓은 기능을 활용하는 것도 좋은 방법이다. 이 기사를 읽어 보면
JetS3t를 통해 S3 및 Java 언어와 관련된 작업을 매우 쉽게 수행할 수 있을 뿐만 아니라 결과적으로 효율도
높아진다는 것을 알 수 있다.
상위 레벨에 있는 S3
논리적으로 S3는 디지털 자산을 저장 및 검색할 수 있는 매우 큰 하드 드라이브처럼 보이는
글로벌 SAN(Storage Area Network)이다. 그러나 기술적인 측면에서 Amazon의 아키텍처는 약간
다르다. S3를 통해 저장 및 검색하려고 선택한 자산을 오브젝트라고 하며 오브젝트는
버켓에 저장된다. 이러한 오브젝트와 버켓을 하드 드라이브에 비유해 보면 오브젝트는
파일에 해당하고 버켓은 폴더(또는 디렉토리)에 해당한다. 그리고 하드 드라이브와 마찬가지로
오브젝트와 버켓은 URI(Uniform Resource Identifier)를 통해 찾을 수 있다.
예를 들어, 필자의 하드 드라이브를 보면 whitepaper.pdf라는 파일이 home 디렉토리의 documents라는
폴더에 있다. 따라서 이 .pdf 파일의 URI는 /home/aglover/documents/whitepaper.pdf이다. S3에서는 URI가
약간 다르다. 첫째, 버켓은 항상 최상위 레벨이다. 즉, 하드 드라이브의 폴더(또는 디렉토리)와는 달리
버켓은 중첩될 수 없다. 둘째, 버켓은 인터넷 이름 지정 규칙을 따라야 한다. 따라서 마침표 옆에 대시
기호를 사용할 수 없다거나 밑줄을 포함할 수 없다는 등의 규칙이 적용된다. 마지막으로, 버켓 이름은
Amazon 도메인(s3.amazonaws.com) 내에서 공용 URI의 일부이므로 전체 S3에서 고유해야 한다. (다행히
계정당 100개의 버켓만 사용할 수 있으므로 좋은 이름을 수백 개씩 선점하는 경우는 발생하지 않는다.)
 |
DNS의 특별한 기능
S3 자산의 URL에 대해서는 크게 걱정하지 않아도 된다. 예를 들어, DNS(Domain Name System) 및
CNAME(canonical name의 약자) 레코드의 특별한 기능을 통해 추가 사용자 정의 URL을 S3 자산의
URL에 맵핑할 수 있다. 이 방법을 사용하면 사용자(또는 사용자의 애플리케이션)가 S3를 사용하고
있다는 사실을 완벽하게 숨길 수 있다.
|
|
버켓은 S3에서 URI의 루트 역할을 수행한다. 즉, 버켓의 이름은 S3 내에서 오브젝트에 대한 URI에
포함된다. 예를 들어, 버켓의 이름이 agdocs이고 오브젝트의 이름이 whitepaper.pdf일 경우 URI는
http://agdocs.s3.amazonaws.com/whitepaper.pdf가 된다.
또한 S3에서는 하드 드라이브의 파일 및 폴더를 사용할 때와 마찬가지로 버켓 및 오브젝트에 대한
소유자와 권한을 지정할 수 있다. S3에서 오브젝트 또는 버켓을 정의할 때 S3 자산에 액세스할 수 있는
사용자 및 권한(예: 읽기 및 쓰기 권한)을 설정하는 액세스 제어 정책을 지정할 수 있다. 그런 다음
여러 가지 방법으로 오브젝트에 대한 액세스를 제공할 수 있다. RESTful API를 사용하는 것도 수많은
방법 중 하나이다.
S3 및 JetS3t 시작하기
S3를 사용하려면 계정이 필요하다. S3는 무료가 아니므로 계정을 만들 때 결제 방법(예: 신용
카드 번호)을 Amazon에 제공해야 한다. 하지만 설정비는 무료이고 사용량에 대한 비용만 지불하면
되므로 많이 걱정할 필요는 없다. 이 기사의 예제를 실행하는 데 드는 비용은 1달러 미만이다.
계정 생성 프로세스 중에 액세스 키 및 보안 키(일종의 사용자 이름 및 암호)와 같은 일부 자격
증명도 작성해야 한다. (x.509 인증서를 받을 수도 있지만 이 인증서는 Amazon의 SOAP API를 사용할
때만 필요하다.) 모든 액세스 정보와 마찬가지로 보안 키는 누출되지 않도록 안전하게 관리해야
한다. 만일 다른 사람이 사용자의 자격 증명을 사용하여 S3에 액세스하게 되면 해당 계정의 사용자에게
비용이 청구된다. 따라서 버켓이나 오브젝트를 생성할 때는 항상 정보가 누출되지 않도록 주의를
기울여야 하며 외부 환경에 액세스를 부여할 때는 명시적으로 부여해야 한다.
액세스 키와 보안 키가 있으면 S3의 RESTful API를 사용하는 대신 JetS3t를
다운로드한 후 JetS3t를 사용하여 S3와 상호 작용할 수 있다.
프로그래밍 방식으로 JetS3t를 통해 S3에 로그인하는 프로세스는 두 단계로 수행된다. 먼저,
AWSCredentials 오브젝트를 생성한 다음 S3Service
오브젝트로 전달해야 한다. AWSCredentials 오브젝트는 상당히 단순하다. 사용자의
액세스 및 보안 키를 String으로 받는다. S3Service
오브젝트는 실제로 인터페이스 유형이다. S3에서 RESTful API와 SOAP API를 둘 다 제공하기 때문에 JetS3t
라이브러리는 RestS3Service 및 SoapS3Service라는
두 가지 구현 유형을 제공한다. 이 기사의 목적에 따라(그리고 실제로 거의 대부분의 S3 구현에서) 사용하기
편리한 RESTful API를 사용한다.
연결된 RestS3Service 인스턴스는 Listing 1과 같이 간단히 생성할 수 있다.
Listing 1. JetS3t의 RestS3Service 인스턴스 생성하기
def awsAccessKey = "blahblah"
def awsSecretKey = "blah-blah"
def awsCredentials = new AWSCredentials(awsAccessKey, awsSecretKey)
def s3Service = new RestS3Service(awsCredentials)
|
이제 버켓을 생성하여 이름을 지정하고 동영상을 버켓에 추가한 후 제한된 시간 동안 사용할 수 있는 특수
URL을 가져오는 흥미로운 작업을 수행할 준비가 완료되었다. 이 작업은 마치 실제 비즈니스 프로세스처럼
들린다. 실제로 이 작업은 동영상과 같은 제한된 자산을 배포하는 작업과 연관된 비즈니스 프로세스이다.
버켓 생성하기
이제 가상의 동영상 비즈니스를 위해 bc50i라는 버켓을 만들어보자. JetS3t에서는 이 프로세스를 간단하게
수행할 수 있다. S3Service 유형에는 몇 가지 옵션이 있다. 필자는 getOrCreateBucket
호출을 자주 사용한다(Listing 2 참조). 이름으로 알 수 있듯이 이 메소드를 호출하면 버켓의 인스턴스(S3Bucket
유형의 인스턴스로 표현됨)가 리턴되거나 S3에 버켓이 생성된다.
Listing 2. S3 서버에 버켓 생성하기
def bucket = s3Service.getOrCreateBucket("bc50i")
|
코드 예제가 간단하다고 우습게 여겨서는 안 된다. JetS3t 라이브러리는 상당히 강력하다. 예를 들어,
listAllBuckets 호출을 통해 S3Service 인스턴스를
조회하여 사용자의 버켓 수를 빠르게 확인할 수 있다. 이 메소드는 S3Bucket
인스턴스 배열을 리턴한다. 버켓의 인스턴스를 사용하여 해당 이름 및 생성 날짜를 조회할 수 있다. 무엇보다도
JetS3t의 AccessControlList 유형을 통해 버켓에 연관된 권한을 제어할 수 있다. 예를
들어, Listing 3과 같이 bc50i 버켓 인스턴스를 누구나 읽고 쓸 수 있는 공용 버켓으로 만들 수 있다.
Listing 3. 버켓의 액세스 제어 목록 변경하기
def bucket.acl = AccessControlList.REST_CANNED_PUBLIC_READ_WRITE
|
물론 API를 통해 버켓을 자유롭게 제거할 수도 있다. 사용자의 버켓을 생성한 지역도 지정할 수 있다. 실제 데이터의
저장 위치와 관련된 복잡한 작업은 Amazon에서 자동으로 처리되지만 사용자가 미국 또는 유럽(현재 사용할 수 있는 옵션)에
버켓을 저장하도록 지정할 수도 있다.
버켓에 오브젝트 추가하기
JetS3t의 API를 사용하여 S3 오브젝트를 만드는 작업은 버켓 조작과 마찬가지로 쉽게 수행할 수 있다. 또한
이 라이브러리는 S3 버켓 내에서 파일과 연관된 컨텐츠 유형을 처리하는 복잡한 과정 중 일부를 수행할 수 있는
유용한 기능도 제공한다. 예를 들어, 제한된 기간 동안 고객에게 보여 주기 위해 S3에 업로드하려는 동영상 파일이
nerfwars2.mp4라고 가정하자. Listing 4와 같이 일반적으로 java.io.File 유형을 생성할
때와 마찬가지로 S3 오브젝트를 손쉽게 생성하고 S3Object 유형을 버켓과 연관시킬 수 있다.
Listing 4. S3 오브젝트 생성하기
def s3obj = new S3Object(bucket, new File("/path/to/nerfwars2.mp4"))
|
파일과 버켓을 사용하여 S3Object를 초기화한 후에는 Listing 5와 같이
putObject 메소드를 통해 오브젝트를 업로드하면 된다.
Listing 5. 매우 쉬운 동영상 업로드
s3Service.putObject(bucket, s3obj)
|
Listing 5의 코드로 업로드 작업이 완료되었다. 이제 동영상은 Amazon 서버에 업로드되었으며
동영상에 대한 키는 해당 이름이다. 오브젝트를 다른 이름으로 호출할 필요가 있을 경우에는 파일
이름을 재정의할 수도 있다. 실제로 JetS3t API(및 Amazon S3 RESTful API)에서 오브젝트를 생성할
경우 약간의 추가 정보가 표시된다. 이미 알고 있는 것처럼 액세스 제어 목록을 제공할 수도 있다. S3
내의 오브젝트는 추가 메타데이터를 가지고 있을 수 있으며 이러한 메타데이터는 API에서 작성할 수
있다. 나중에 S3 API(및 JetS3t)를 통해 오브젝트에 대해 해당 메타데이터를 쿼리할 수 있다.
오브젝트에 대한 URL 생성하기
이제 S3 인스턴스의 버켓에 동영상이 저장되어 있다. 실제로 이 동영상은 http://bc50i.s3.amazonaws.com/nerfwars2.mp4라는
URI에서 찾을 수 있다. 그러나 아직까지는 필자 외의 다른 사용자는 이 동영상에 액세스할 수 없다. (그리고 이 경우에는 모든
항목에 연관된 기본 액세스 제어가 자격 증명이 없는 액세스를 거부하도록 설정되어 있으므로 프로그래밍 방식으로만 액세스할
수 있다.) 필자의 목표는 액세스에 대한 요금을 청구할 수 있을 때까지 특정 고객에게만 제한된 기간 동안 새 동영상을 볼
수 있는 방법을 제공하는 것이다. (S3를 사용할 수도 있다).
그림 1에서는 작동 중인 기본 액세스 제어를 보여 준다. 리턴되어 브라우저에 표시된 XML 문서를 보면
연결하려고 시도했던 자산(http://bc50i.s3.amazonaws.com/nerfwars2.mp4)에 대한 액세스가 거부되었음을
알 수 있다.
그림 1. 작동 중인 Amazon의 보안
S3에서는 공용 URL을 쉽게 생성할 수 있다. 실제로 S3에서는 지정된 기간(예: 24시간) 동안만 유효한
공용 URL을 생성할 수 있다. 이제 앞에서 S3 서버에 저장한 동영상에 대해 48시간 동안 유효한 URL을
생성한다. 그런 다음 동영상을 다운로드해서 볼 수 있도록(2일 이내에 다운로드한 경우) 특정 고객에게
이 URL을 제공한다.
S3 오브젝트에 대한 시간 제한이 있는 URL을 생성하려면 S3Service 유형의
정적 메소드인 JetS3t의 createSignedGetUrl 메소드를 사용할 수 있다. 이 메소드는
버켓 이름, 오브젝트의 키(이 경우에는 동영상의 이름), 일부 자격 증명(JetS3t의 AWSCredentials
오브젝트 형식) 및 만기 날짜를 받는다. 원하는 버켓 이름과 오브젝트의 키를 알고 있으면 Listing 6의 Groovy
코드와 같이 URL을 빠르게 가져올 수 있다.
Listing 6. 시간 제한이 있는 URL 생성하기
def now = new Date()
def url = S3Service.createSignedGetUrl(
bucket.getName(), s3obj.key, awsCredentials, now + 2)
|
Groovy를 사용하면 + 2 구문을 통해 향후 48시간을 매우 쉽게 지정할 수
있다. 결과 URL은 다음과 같다(단일 행).
https://bc50i.s3.amazonaws.com/nerfwars2.mp4?AWSAccessKeyId=
1asd06A5MR2&Expires=1234738280&Signature=rZvk8Gkms%3D
|
이제 그림 2와 같이 이 결과 URL을 통해 브라우저 요청이 수행된다.
그림 2. URL을 이용한 다운로드
이 프로세스는 정말 간단하다. 몇 줄의 코드만으로 특수 URL을 통해서만 다운로드할 수 있는 보안 자산을 클라우드 환경에 만들었다.
S3를 활용하여 시간 제한이 있는 다운로드 지원하기
S3는 일정 수준의 대역폭 및 스토리지를 유지할 필요가 없는 경우에 효과적으로 대응할 수 있다. 예를 들어,
1년 동안 특정 기간에만 동영상을 제공하는 비즈니스 모델이 있다면 기존 스토리지 모델의 경우에는 일정량의
랙 공간을 구입(또는 사용자의 하드웨어를 제공하여 연결)해야 하며 다운로드가 활발하게 진행된 후 상당 기간
동안 다운로드 활동이 저조해지는 경우를 많이 볼 수 있다. 그럼에도 불구하고 수요와 상관 없이 비용을 지불해야
한다. 하지만 이 모델을 S3에 적용하면 오직 필요한 경우에만 스토리지 및 대역폭에 대한 비용을 지불하므로
효과적으로 수요에 대응할 수 있다. 또한 S3의 보안 기능을 활용하여 동영상을 다운로드할 수 있는 시기뿐만 아니라
다운로드할 수 있는 사용자까지도 지정할 수 있다.
S3를 사용하면 이러한 요구 사항을 매우 쉽게 충족할 수 있다. 상위 레벨에서 다음과 같은 4단계 작업만을 수행하여
제한된 기간 동안 공개적으로 액세스할 수 있는 동영상 다운로드를 작성할 수 있다.
- S3에 로그인한다.
- 버켓을 생성한다.
- 해당 버켓에 원하는 동영상(또는 오브젝트)를 추가한다.
- 동영상에 대한 시간 제한이 있는 URL을 생성한다.
정말 간단한 프로세스이다.
현명한 선택
S3의 pay-as-you-go 모델에는 기존 스토리지 모델에 비해 몇 가지 명확한 장점이 있다. 예를 들어,
하드 드라이브에 음악 파일 모음을 저장하려면, 예를 들어, 130달러를 지불하고 500GB 하드 드라이브를
마련해야 한다. 하지만 저장할 데이터의 용량은 500GB에 미치지 못하기 때문에 비싸지는 않더라도 필요하지
않는 용량을 위해 GB당 약 25센트의 비용을 지불하게 된다. 게다가 장치도 관리해야 하고 전기비도 나간다. 하지만
Amazon에서 제시하는 모델을 따르게 되면 시간에 따라 가치가 떨어지는 자산에 130달러라는 비용을 지금 당장
투자하지 않아도 된다. GB당 10센트 미만의 비용만 지불하면 되며 스토리지 하드웨어를 관리 및 유지보수하는
데 소요되는 비용은 지불하지 않아도 된다. 이제 엔터프라이즈 규모에서 이러한 장점을 통해 얻을 수 있는 효과를
생각해 보자. 예를 들어, Twitter에서는 백만 명 이상의 사용자 계정에 대한 이미지를 S3에 저장한다. 사용량에
따라 비용을 지불하고 있는 Twitter는 이미지를 저장 및 서비스하기 위한 하드웨어 인프라를 구입하는 데 들어가는
막대한 비용뿐만 아니라 하드웨어 인프라를 구성 및 관리하는 데 소요되는 인건비와 부품 비용까지도 절약할 수 있다.
클라우드의 장점은 여기에서 그치지 않는다. 낮은 지연 시간과 고가용성이라는 장점도 누릴 수
있다. Amazon의 클라우드에 저장된 자산은 물리적으로 전세계에 저장되어 있으므로 컨텐츠를 다양한
지역에 빠르게 제공할 수 있다. 또한 자산이 여러 시스템에 분산되어 있으므로 일부 시스템(또는
네트워크의 일부)에서 오류가 발생하더라도 데이터의 고가용성을 유지할 수 있다.
Amazon S3의 장점을 간단하게 요약하자면 저비용, 고가용성 및 보안이라고 말할 수 있다. SAN 전문가이면서 디지털
항목을 저장하는 하드웨어 자산을 관리하는 작업을 좋아하는 경우가 아니라면 이 모든 작업을 Amazon에게 맡기는 것이
효과적일 것이다. 다른 사람이 제공하는 서비스를 빌려서 사용할 수 있음에도 불구하고 굳이 시간이 갈수록 가치가 떨어지는
하드웨어에 투자하는 것은 낭비에 가깝다고 생각하지 않는가?
참고자료 교육
제품 및 기술 얻기
토론
필자소개
기사에 대한 평가
 |
| 이 문서 북마킹 하기
|
|