본문 바로가기

카테고리 없음

S3를 통해 간편하게 스토리지 만들기

S3를 통해 간편하게 스토리지 만들기

Amazon S3(Simple Storage Service)으로 시작하는 클라우드 컴퓨팅

Andrew Glover , Co-Founder, ThirstyHead.com

요약:  Amazon S3(Simple Storage Service)는 웹 애플리케이션 개발자가 이미지, 비디오, 음악 및 문서와 같은 디지털 자산을 저장하는 데 사용할 수 있는 공개 서비스입니다. S3는 프로그래밍 방식으로 서비스와 상호 작용할 수 있도록 RESTful API를 제공합니다. 이 기사에서는 오픈 소스 JetS3t 라이브러리를 통해 Amazon의 S3 클라우드 서비스를 활용하여 데이터를 저장 및 검색하는 방법에 대해 설명합니다.

원문 게재일:  2009 년 4 월 07 일 번역 게재일:   2009 년 6 월 09 일 
난이도:  중급 영어로:  보기 PDF:  A4 and Letter (120KB | 9 pages)Get Adobe® Reader® 
페이지뷰:  1873 회 
의견:   0 (보기 | 의견 추가 - 로그인)

평균 평가 등급 2 개 총 6표 평균 평가 등급 (6 투표수)
아티클 순위



소개

클라우드는 일부 작업 또는 서비스를 공동으로 처리하면서도 단일 엔터티인 것처럼 보이는 느슨하게 연결된 컴퓨터 그룹을 의미하는 추상적인 개념이다. 화면 뒤에 숨겨져 있는 아키텍처 또한 추상적이므로 각 클라우드 공급자는 필요에 따라 해당 오퍼링을 자유롭게 설계할 수 있다. 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의 보안
작동 중인 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을 이용한 다운로드 

이 프로세스는 정말 간단하다. 몇 줄의 코드만으로 특수 URL을 통해서만 다운로드할 수 있는 보안 자산을 클라우드 환경에 만들었다.

S3를 활용하여 시간 제한이 있는 다운로드 지원하기

S3는 일정 수준의 대역폭 및 스토리지를 유지할 필요가 없는 경우에 효과적으로 대응할 수 있다. 예를 들어, 1년 동안 특정 기간에만 동영상을 제공하는 비즈니스 모델이 있다면 기존 스토리지 모델의 경우에는 일정량의 랙 공간을 구입(또는 사용자의 하드웨어를 제공하여 연결)해야 하며 다운로드가 활발하게 진행된 후 상당 기간 동안 다운로드 활동이 저조해지는 경우를 많이 볼 수 있다. 그럼에도 불구하고 수요와 상관 없이 비용을 지불해야 한다. 하지만 이 모델을 S3에 적용하면 오직 필요한 경우에만 스토리지 및 대역폭에 대한 비용을 지불하므로 효과적으로 수요에 대응할 수 있다. 또한 S3의 보안 기능을 활용하여 동영상을 다운로드할 수 있는 시기뿐만 아니라 다운로드할 수 있는 사용자까지도 지정할 수 있다.

S3를 사용하면 이러한 요구 사항을 매우 쉽게 충족할 수 있다. 상위 레벨에서 다음과 같은 4단계 작업만을 수행하여 제한된 기간 동안 공개적으로 액세스할 수 있는 동영상 다운로드를 작성할 수 있다.

  1. S3에 로그인한다.
  2. 버켓을 생성한다.
  3. 해당 버켓에 원하는 동영상(또는 오브젝트)를 추가한다.
  4. 동영상에 대한 시간 제한이 있는 URL을 생성한다.

정말 간단한 프로세스이다.

현명한 선택

S3의 pay-as-you-go 모델에는 기존 스토리지 모델에 비해 몇 가지 명확한 장점이 있다. 예를 들어, 하드 드라이브에 음악 파일 모음을 저장하려면, 예를 들어, 130달러를 지불하고 500GB 하드 드라이브를 마련해야 한다. 하지만 저장할 데이터의 용량은 500GB에 미치지 못하기 때문에 비싸지는 않더라도 필요하지 않는 용량을 위해 GB당 약 25센트의 비용을 지불하게 된다. 게다가 장치도 관리해야 하고 전기비도 나간다. 하지만 Amazon에서 제시하는 모델을 따르게 되면 시간에 따라 가치가 떨어지는 자산에 130달러라는 비용을 지금 당장 투자하지 않아도 된다. GB당 10센트 미만의 비용만 지불하면 되며 스토리지 하드웨어를 관리 및 유지보수하는 데 소요되는 비용은 지불하지 않아도 된다. 이제 엔터프라이즈 규모에서 이러한 장점을 통해 얻을 수 있는 효과를 생각해 보자. 예를 들어, Twitter에서는 백만 명 이상의 사용자 계정에 대한 이미지를 S3에 저장한다. 사용량에 따라 비용을 지불하고 있는 Twitter는 이미지를 저장 및 서비스하기 위한 하드웨어 인프라를 구입하는 데 들어가는 막대한 비용뿐만 아니라 하드웨어 인프라를 구성 및 관리하는 데 소요되는 인건비와 부품 비용까지도 절약할 수 있다.

클라우드의 장점은 여기에서 그치지 않는다. 낮은 지연 시간과 고가용성이라는 장점도 누릴 수 있다. Amazon의 클라우드에 저장된 자산은 물리적으로 전세계에 저장되어 있으므로 컨텐츠를 다양한 지역에 빠르게 제공할 수 있다. 또한 자산이 여러 시스템에 분산되어 있으므로 일부 시스템(또는 네트워크의 일부)에서 오류가 발생하더라도 데이터의 고가용성을 유지할 수 있다.

Amazon S3의 장점을 간단하게 요약하자면 저비용, 고가용성 및 보안이라고 말할 수 있다. SAN 전문가이면서 디지털 항목을 저장하는 하드웨어 자산을 관리하는 작업을 좋아하는 경우가 아니라면 이 모든 작업을 Amazon에게 맡기는 것이 효과적일 것이다. 다른 사람이 제공하는 서비스를 빌려서 사용할 수 있음에도 불구하고 굳이 시간이 갈수록 가치가 떨어지는 하드웨어에 투자하는 것은 낭비에 가깝다고 생각하지 않는가?


참고자료

교육

  • Amazon S3: Amazon Simple Storage Service의 홈 페이지를 방문하자. 

  • JetS3t: JetS3t 툴킷 및 애플리케이션 제품군에 대한 정보를 볼 수 있다. 

  • Cloud Computing: IBM Cloud Computing Central에서 다양한 클라우드 리소스를 볼 수 있다. 

  • 기술 서점에서 다양한 기술 주제와 관련된 서적을 살펴보자. 

  • developerWorks Java 기술 영역: Java 프로그래밍과 관련된 모든 주제를 다루는 여러 편의 기사를 찾아보자. 

제품 및 기술 얻기

토론




Amazon Web Services를 사용한 클라우드 컴퓨팅, Part 2: Amazon S3(Simple Storage Service)를 통해 클라우드의 스토리지 수요에 대응하기

안정적이고 유연하며 경제적인 스토리지와 데이터 검색

Prabhakar Chaganti, CTO, Ylastic, LLC

요약:  기본적인 Amazon SDB(SimpleDB) 개념에 대해 알아보고 SDB와 상호 작용하기 위한 오픈 소스 Python 라이브러리인 boto에서 제공하는 일부 기능을 살펴보십시오. 이 "Amazon Web Services를 사용한 클라우드 컴퓨팅" 시리즈에서는 Amazon Web Services를 사용한 클라우드 컴퓨팅에 대해 설명합니다. 신뢰할 수 있으며 확장 가능한 애플리케이션을 만들고 빌드할 수 있는 Amazon Web Services의 뛰어난 기능을 살펴보십시오. 이 기사에서는 Amazon S3(Simple Storage Service)에서 제공하는 확장성과 응답성이 뛰어난 서비스에 대해 설명합니다. S3와 통신하는 데 사용되는 도구에 대해 알아보고 코드 샘플을 사용하여 간단한 쉘을 실습해 볼 수 있습니다.

이 연재 자세히 보기

이 기사에 태그:  웹_서비스

원문 게재일:  2008 년 8 월 19 일 번역 게재일:   2009 년 3 월 31 일 
난이도:  초급 영어로:  보기 PDF:  A4 and Letter (166KB | 21 pages)Get Adobe® Reader® 
페이지뷰:  4125 회 
의견:   0 (보기 | 의견 추가 - 로그인)

평균 평가 등급 2 개 총 9표 평균 평가 등급 (9 투표수)
아티클 순위

Amazon S3(Simple Storage Service)

이 시리즈의 Part 1에서는 Amazon Web Services의 빌딩 블록을 소개한 후 이 가상 인프라를 사용하여 웹 확장이 가능한 시스템을 빌드하는 방법에 대해 설명한다.

이 기사에서는 Amazon S3(Simple Storage Service)에 대해 자세히 설명한다. S3는 전세계 어디에서나 언제라도 대용량의 데이터를 간편하게 저장하고 검색할 수 있도록 지원하는 확장성 높은 고속 인터넷 데이터 스토리지 시스템이다. 사용자는 실제 서비스 사용량에 따라 스토리지 및 대역폭 비용을 지불하면 된다. 설치 비용, 최소 비용 또는 정기적인 오버헤드 비용이 없다.

Amazon에서 스토리지 인프라에 대한 관리 및 유지보수를 담당하므로 사용자는 자신의 시스템 및 애플리케이션의 핵심 기능에 집중할 수 있다. 업계의 인정을 받은 S3는 사용자의 데이터 스토리지 요구에 쉽게 대응할 수 있는 뛰어난 플랫폼이다. S3는 다음과 같은 부분에 장점을 가지고 있다.

  • 애플리케이션 데이터 저장
  • 개인 및 기업 백업
  • 미디어를 비롯하여 많은 대역폭을 사용하는 기타 컨텐츠를 경제적인 비용으로 빠르게 고객에게 제공할 수 있다.

S3의 특징은 다음과 같다.

신뢰성
내결함성을 지닌 S3는 최소한의 중단 시간으로 또는 중단 시간 없이 매우 빠르게 시스템을 복구할 수 있도록 설계되었다. Amazon에서는 99.99% 가용성을 보장하는 SLA(Service Level Agreement)를 제공한다.
단순성
단순한 개념을 바탕으로 만들어진 S3는 애플리케이션 개발에 적합한 높은 유연성을 제공한다. 필요한 경우, S3 구성 요소를 기반으로 하는 추가 기능을 활용하여 복잡한 스토리지 스키마를 만들 수 있다.
확장성
높은 수준의 확장성이 제공되므로 웹 확장 애플리케이션에 대한 수요가 급증할 경우 서비스 레벨을 간편하게 올릴 수 있다.
경제성
S3 비용은 시중에 나와 있는 다른 기업용 및 개인용 데이터 스토리지 솔루션에 비해 높은 경쟁력을 가지고 있다.

S3 프레임워크의 바탕이 되는 세 가지 기본 개념은 버켓오브젝트 및 이다.

버켓

버켓은 기본 빌딩 블록이다. Amazon S3에 저장된 각 오브젝트는 버켓에 포함된다. 버켓은 파일 시스템의 폴더나 디렉토리와 비슷한 개념이다. 파일 폴더와 버켓의 주요 차이점 중 하나는 URL을 통해 각 버켓과 해당 컨텐츠에 액세스할 수 있다는 것이다. 예를 들어, "prabhakar"라는 버켓이 있으면 http://prabhakar.s3.amazonaws.com이라는 URL을 사용하여 이 버켓에 액세스할 수 있다.

각 S3 계정은 최대 100개의 버켓을 포함할 수 있다. 버켓은 서로 중첩될 수 없으므로 버켓 내에 다른 버켓을 만들 수 없다. 버켓을 만들 때 위치 제한 조건을 지정하여 버켓의 지리적 위치를 지정할 수 있다. 이렇게 하면 해당 버켓 내에서 저장한 모든 오브젝트가 해당 지역에 자동으로 저장된다. 현재까지 지정할 수 있는 버켓의 위치는 미국과 유럽 연합이다. 버켓을 만들 때 위치를 지정하지 않은 경우에는 계정의 청구지 주소와 가장 가까운 위치에 버켓과 해당 컨텐츠가 저장된다.

버켓 이름은 다음 S3 요구 사항을 따라야 한다.

  • 이름은 숫자나 문자로 시작되어야 한다.
  • 이름의 길이는 3 - 255자 사이여야 한다.
  • 이름에는 소문자, 숫자, 마침표, 밑줄 및 대시 기호만 사용할 수 있다.
  • 이름에 숫자와 마침표를 사용할 수 있기는 하지만 IP 주소 형식을 사용할 수는 없다. 예를 들어, 버켓에 192.168.1.254라는 이름을 지정할 수 없다.
  • 버켓 네임스페이스는 S3에 있는 모든 계정의 모든 버켓에서 공유하므로 버켓 이름은 전체 S3에서 고유해야 한다.

URL을 통해 액세스할 수 있는 오브젝트가 포함된 버켓은 다음과 같은 추가 S3 요구 사항을 따라야 한다.

  • 버켓의 이름에 밑줄을 사용할 수 없다.
  • 이름의 길이는 3 - 63자 사이여야 한다.
  • 이름 끝에 대시 기호를 사용할 수 없다. 예를 들어, myfavorite-.bucket.com은 올바르지 않은 이름이다.
  • 이름에서 마침표 옆에 대시 기호를 사용할 수 없다. 따라서 my-.bucket.com은 올바르지 않은 이름이다.

media.yourdomain.com과 같은 도메인 이름 지정 규칙을 버켓에 사용할 수 있다. 따라서 기존 웹 도메인이나 서브도메인을 Amazon S3에 맵핑할 수 있다. 실제 맵핑은 S3를 가리키는 DNS CNAME 항목을 추가할 때 수행된다. 이 스키마를 사용할 때 얻게 되는 장점은 URL에 고유한 도메인 이름을 사용하여 파일을 다운로드할 수 있다는 것이다. CNAME 맵핑은 버켓의 S3 주소를 변환하는 역할을 수행한다. 예를 들어, http://media.yourdomain.com.s3.amazonaws.com은 보다 익숙한 http://media.yourdomain.com으로 변환된다.

오브젝트

오브젝트는 S3에 있는 버켓 내에 저장된 데이터를 포함한다. 오브젝트는 저장할 파일과 같은 것이라고 생각할 수 있다. 저장된 각 오브젝트는 데이터와 메타데이터라는 두 가지 엔티티로 구성되어 있다. 데이터는 PDF 파일, Word 문서, 비디오 파일과 같이 실제로 저장되는 컨텐츠이며 저장된 데이터에는 오브젝트를 설명하는 연관된 메타데이터가 있다. 메타데이터의 예로는 저장되는 오브젝트의 컨텐츠 유형, 오브젝트가 마지막으로 수정된 날짜 및 사용자나 사용자의 애플리케이션과 관련된 기타 메타데이터가 있다. 오브젝트에 대한 메타데이터는 오브젝트를 저장하기 위해 S3로 보낼 때 개발자가 키/값 쌍을 사용하여 지정한다.

버켓 수에는 제한이 있었지만 오브젝트 수에는 제한이 없다. 버켓에는 오브젝트를 무제한으로 저장할 수 있으며 각 오브젝트의 최대 데이터 용량은 5GB이다.

공개적으로 액세스할 수 있는 S3 오브젝트의 데이터는 HTTP, HTTPS 또는 BitTorrent를 통해 검색할 수 있다. BitTorrent를 사용하면 S3 계정의 대용량 미디어 파일을 쉽게 배포할 수 있다. Amazon에서 오브젝트의 토런트를 만들어서 배포한다.

S3 버켓에 저장된 각 오브젝트는 고유 키로 식별된다. 이는 파일 시스템의 폴더에 있는 파일 이름에 적용되는 개념과 비슷하다. 즉, 하드 드라이브에 있는 폴더 내의 파일 이름은 고유해야 한다. 버켓 내의 각 오브젝트는 단 하나의 키를 가지고 있다. 버켓의 이름과 키를 함께 사용하여 S3에 저장된 각 오브젝트의 고유 ID를 제공한다.

S3 내의 모든 오브젝트는 S3 서비스 URL, 버켓 이름 및 고유 키가 결합된 URL을 사용하여 액세스할 수 있다. prabhakar 버켓에 my_favorite_video.mov 키가 있는 오브젝트를 저장한 경우 http://prabhakar.s3.amazonaws.com/my_favorite_video.mov를 통해 해당 오브젝트에 액세스할 수 있다.

그림 1처럼 개념이 간단하기는 하지만 버켓, 오브젝트 및 키를 활용하면 데이터 스토리지 솔루션을 유연하게 빌드할 수 있다. 이러한 빌딩 블록을 사용하여 S3에 데이터를 간편하게 저장할 수 있으며 S3를 기반으로 하는 복잡한 스토리지 및 애플리케이션을 계층화 및 빌드하여 추가 기능을 제공할 수 있다.


그림 1. S3 개념도 
 

액세스 로깅

각 S3 버켓에는 포함된 오브젝트에 대한 각 요청의 세부 사항이 담긴 액세스 로그 레코드가 있다. 로그 레코드는 기본적으로 해제되어 있으므로 추적하려는 Amazon S3 버켓별로 로깅을 명시적으로 설정해야 한다. 액세스 로그 레코드에는 요청 유형, 요청된 리소스, 요청의 처리 시간 및 날짜를 포함한 여러 가지 세부 사항이 있다.

로그는 S3 서버 액세스 로그 형식으로 제공되지만 Apache 결합 로그 형식으로 쉽게 변환할 수 있다. 그런 다음 필요할 때 Webalizer와 같은 오픈 소스 또는 상업용 로그 분석 도구에서 구문 분석을 통해 알아보기 쉬운 보고서와 그래프를 쉽게 작성할 수 있다. 보고서를 보면 파일에 액세스하고 있는 고객 기반에 대한 유용한 정보를 확인할 수 있다. S3 로그 레코드를 더 쉽게 시각화할 수 있는 도구에 대한 정보는 참고자료에서 볼 수 있다.

보안

S3에서 만든 각 버켓과 오브젝트는 해당 항목을 만든 사용자 계정에서만 사용할 수 있다. 다른 사용자와 고객이 S3 버켓에 있는 오브젝트 목록을 보거나 오브젝트에 포함된 데이터를 다운로드할 수 있게 하려면 소유자가 원하는 사용자와 고객에게 명시적으로 권한을 부여해야 한다. Amazon S3에서는 다음과 같은 보안 기능을 통해 버켓과 버켓에 있는 오브젝트를 보호할 수 있다.

인증
버켓 또는 오브젝트의 소유자가 만든 요청인지 확인한다. 각 S3 요청에는 사용자를 고유하게 식별하는 Amazon Web Services 액세스 키가 있어야 한다.
권한
리소스에 액세스하려는 사용자에게 리소스에 대한 권한이 있는지 확인한다. 각 S3 오브젝트에는 해당 리소스에 대한 권한을 명시적으로 식별하는 연관된 ACL(Access Control List)이 있다. 모든 Amazon Web Services 사용자나 이메일 주소로 식별된 특정 사용자에게 액세스 권한을 부여하거나 임의의 사용자에게 익명 액세스 권한을 부여할 수 있다.
무결성
요청을 보내는 사용자는 Amazon Web Services 비밀 키를 사용하여 각 S3 요청에 디지털 서명을 해야 한다. 요청이 수신되면 S3가 서명을 검사하여 전송 중에 요청이 변조되지 않았는지 확인한다.
암호화
암호화된 연결을 통해 데이터를 전송하기 위해 HTTPS 프로토콜을 사용하여 S3에 액세스할 수 있다.
부인 방지
각 S3 요청에는 트랜잭션의 증거로 사용할 수 있는 시간 소인이 적용된다.

확실한 보안을 위해 S3에 대한 모든 REST 요청은 다음과 같은 표준 단계를 따라야 한다.

  • 요청과 모든 필수 매개변수를 하나의 문자열로 어셈블해야 한다.
  • Amazon Web Services 비밀 액세스 키를 사용하여 요청 문자열의 HMAC(Hash Message Authentication Code) 키 서명 해시를 만들어야 한다.
  • 이 계산된 서명은 요청의 매개변수로 추가된다.
  • 그런 다음 요청이 Amazon S3로 전달된다.
  • Amazon S3가 제공된 서명이 요청의 유효한 HMAC 키 해시인지 확인한다.
  • 서명이 유효한 경우에만 Amazon S3가 요청을 처리한다.

가격

S3 비용은 세 가지 기준에 따라 계산되며, 이러한 기준은 버켓의 지리적 위치에 따라 각기 다르다.

  • 사용된 스토리지 공간의 총 용량. 여기에는 데이터 컨텐츠 및 연관된 메타데이터의 실제 크기가 포함된다. S3에서 사용하는 스토리지 사용 용량의 단위는 월간 GB이다. 사용자의 계정으로 사용된 스토리지 용량은 시간별로 계산되며 매월 말에 월간 스토리지 사용량으로 변환된다. 다음 표에는 스토리지 사용 가격이 있다. 

    위치 비용
    미국 0.15달러/GB(월간 스토리지 사용량 기준)
    유럽 0.18달러/GB(월간 스토리지 사용량 기준)


  • S3를 통해 송수신된 데이터 또는 대역폭의 용량. 여기에는 S3에서 업로드하거나 다운로드한 모든 데이터가 포함된다. EC2와 미국에 있는 S3 버켓 사이에 전송된 데이터에는 비용이 부과되지 않는다. EC2와 유럽 S3 버켓 사이에 전송된 데이터에는 표준 데이터 전송 요금이 부과된다(아래 그림 참조). 

    위치 비용
    미국 0.100달러/GB — 모든 수신 데이터

    0.170달러/GB — 월간 송신 데이터 중 최초 10TB 
    0.130달러/GB — 월간 송신 데이터 중 이후 40TB 
    0.110달러/GB — 월간 송신 데이터 중 이후 100TB 
    0.100달러/GB — 월간 송신 데이터 중 150TB를 초과하는 용량
    유럽 0.100달러/GB — 모든 수신 데이터

    0.170달러/GB — 월간 송신 데이터 중 최초 10TB 
    0.130달러/GB — 월간 송신 데이터 중 이후 40TB 
    0.110달러/GB — 월간 송신 데이터 중 이후 100TB 
    0.100달러/GB — 월간 송신 데이터 중 150TB를 초과하는 용량


  • 수행된 API 요청의 수. S3에서는 오브젝트 생성, 버켓 표시, 오브젝트 표시 등과 같이 인터페이스를 사용하여 수행된 각 요청에 대해 요금이 부과된다. 오브젝트와 버켓을 삭제하는 경우에는 요금이 부과되지 않는다. 이 경우에도 요금은 버켓의 지역에 따라 조금씩 다르다. 다음 표에는 API 요청에 대한 가격이 있다. 

    위치 비용
    미국 PUT, POST 또는 LIST 요청 1,000개당 0.01달러
    GET 및 기타 모든 요청 10,000개당 0.01달러 
    삭제 요청의 경우 무료
    유럽 PUT, POST 또는 LIST 요청 1,000개당 0.012달러
    GET 및 기타 모든 요청 10,000개당 0.012달러 
    삭제 요청의 경우 무료


최신 가격은 Amazon S3에서 확인할 수 있다. 또한 AWS Simple Monthly Calculator를 사용하여 S3 및 기타 Amazon Web Services에 대한 월간 사용 비용을 계산할 수 있다.

Amazon Web Services 및 S3 시작하기

S3를 시작하려면 먼저 Amazon Web Services 계정을 등록해야 한다. Amazon Web Services 계정 번호가 할당되며 S3와 통신하는 데 필요한 다양한 라이브러리와 도구를 사용할 때 요구되는 보안 액세스 키와 x.509 보안 인증서가 함께 제공된다.

모든 Amazon Web Services 통신은 SOAP 인터페이스 또는 쿼리/REST 인터페이스를 통해서 이루어진다. 메시지를 보내는 사용자는 이러한 인터페이스를 통해 전송된 요청 메시지가 전송 중에 변조되지 않았고 실제 사용자가 보낸 것임을 보장하기 위해 해당 메시지에 디지털 서명을 해야 한다. 이는 Amazon Web Services API를 사용할 때 유념해야 하는 가장 기본적인 사항이다. 각 요청에는 적용된 디지털 서명이 반드시 첨부되어 있어야 한다.

각 Amazon Web Services 사용자 계정은 다음과 같은 보안 권한 정보와 연관된다.

  • 쿼리/REST 인터페이스를 통해 요청을 보낸 사용자로 식별해 주는 액세스 키 ID
  • 쿼리 인터페이스에서 요청을 보낼 때 디지털 서명을 계산하는 데 사용되는 비밀 액세스 키
  • SOAP 인터페이스를 사용할 때 요청에 서명하고 인증 작업을 수행하는 데 필요한 공용 및 개인용 x.509 인증서

Web Services Account 정보에서 키와 인증서를 관리 및 재생성하고 계정 활동 및 사용량 보고서를 보고 프로파일 정보를 수정할 수 있다.

Amazon Web Services 계정 등록을 마친 후에는 다음 단계를 수행하여 사용자의 계정에 필요한 Amazon S3 서비스를 활성화해야 한다.

  1. 사용자의 Amazon Web Services 계정에 로그인한다.
  2. S3 홈 페이지로 이동한다.
  3. 페이지 오른쪽에 있는 Sign Up For This Web Service를 클릭한다.
  4. 요청된 정보를 제공하고 등록 프로세스를 완료한다.

이 기사의 예제에서는 쿼리/REST 인터페이스를 사용하여 S3와 통신한다. 먼저 액세스 키를 받아야 한다. Web Services Account 정보 페이지에서 View Access Key Identifiers를 선택하여 액세스 키에 액세스할 수 있다. 이제 Amazon Web Services를 사용할 준비가 완료되었으며 S3 서비스를 사용할 수 있게 되었다.

S3와 상호 작용하기

Amazon이나 써드파티 및 개별 개발자가 제공하는 기존 라이브러리를 사용하여 S3와 상호 작용하는 방법을 익힐 수 있다. 이 기사에서는 요청에 서명하는 방법, 데이터 캡슐화에 사용되는 XML 문서를 만드는 방법 또는 S3와 주고 받는 매개변수와 같은 S3 통신의 세부 사항에 대해 설명하지 않는다. 세부 사항에 대한 설명은 해당 라이브러리에서 확인할 수 있다. 여기에서는 해당 업체에서 제공하는 상위 레벨 인터페이스를 사용한다. 자세한 정보는 S3 Developer Guide에서 볼 수 있다.

이 기사에서는 오픈 소스 Java™ 라이브러리인 JetS3t를 사용하여 S3를 살펴본 후 간단한 코드를 보면서 S3 API에 대해 설명한다. 기사의 마지막 부분에서는 유용하고 간편한 S3 Shell에서 이러한 코드를 수집하고 관리하는 방법을 살펴본다. S3 Shell을 사용하면 언제라도 S3와 직접 통신할 수 있다.

JetS3t

JetS3t는 S3와 상호 작용하는 기능을 제공하는 오픈 소스 Java 툴킷이다. 이 툴킷은 라이브러리 이상의 의미를 가지고 있다. 이 툴킷에는 일반적인 S3 사용자뿐만 아니라 S3 기반의 애플리케이션을 빌드하는 서비스 공급자도 사용할 수 있는 매우 유용한 여러 가지 S3 관련 도구가 있다. JetS3t에는 다음과 같은 도구가 있다.

Cockpit
Amazon S3 계정의 컨텐츠를 관리하는 GUI이다.
Synchronize
사용자의 컴퓨터에 있는 디렉토리와 Amazon S3 계정을 동기화하는 명령행 애플리케이션이다.
Gatekeeper
Amazon S3 계정에 대한 액세스를 조정하는 데 사용할 수 있는 서블릿이다.
CockpitLite
조정 기능을 제공하는 Gatekeeper 서비스를 통해 모든 조작을 라우트하는 Cockpit의 경량 버전이다.
Uploader
조정 기능을 제공하는 Gatekeeper 서비스를 통해 모든 조작을 라우트하는 GUI이다. 서비스 공급자는 이 GUI를 사용해서 자신의 S3 계정에 대한 액세스를 고객에게 제공할 수 있다.

JetS3t의 최신 버전을 다운로드하자.
이러한 GUI 애플리케이션 중 하나를 S3와 상호 작용하는 데 사용할 수 있기는 하지만 S3와 통신하는 애플리케이션을 개발해야 하는 경우에는 크게 도움이 되지 않는다. 이 기사에서 사용하는 전체 소스 코드를 압축된 아카이브로 다운로드할 수 있으며, 이 아카이브에는 사용자의 작업 공간에 반입해서 바로 사용할 수 있는 Netbeans 프로젝트가 포함되어 있다.

S3에 연결하기

JetS3t에는 REST 또는 SOAP와 같은 특정 인터페이스를 구현한 클래스를 사용하여 확장해야 하는 org.jets3t.service.S3Service라는 추상 클래스가 있다. JetS3t는 S3에 연결하고 상호 작용하는 데 사용할 수 있는 다음 두 가지 구현을 제공한다.

  • org.jets3t.service.impl.rest.httpclient.RestS3Service는 REST 인터페이스를 통해 S3와 통신한다.
  • org.jets3t.service.impl.soap.axis.SoapS3Service는 Apache Axis 1.4를 사용하는 SOAP 인터페이스를 통해 S3와 통신한다.

JetS3t에서는 jets3t.properties 파일을 사용하여 S3와 통신하는 중에 사용되는 다양한 매개변수를 구성한다. 이 기사의 예제에서는 툴킷과 함께 제공되는 기본 jets3t.properties 파일을 사용한다. 매개변수에 대한 자세한 설명은 JetS3t Configuration Guide에서 볼 수 있다.

이 기사에서는 RestS3Service를 사용하여 S3에 연결한다. Amazon Web Services 액세스 키를 AWSCredentials 오브젝트 형식으로 제공하여 새 RestS3Service 오브젝트를 만들 수 있다. 이 기사에서 설명하는 코드는 API를 보여 주기 위한 것일 뿐이므로 각 코드를 실행하려면 필요한 클래스를 모두 가져와야 한다. 다운로드 패키지에 있는 소스에서 필요한 클래스를 확인할 수 있다. 제공된 Netbeans 프로젝트를 작업 공간으로 가져오면 더욱 쉽게 전체 소스 코드에 액세스할 수 있다.


Listing 1. 새 RestS3Service 만들기
String awsAccessKey = ”Your AWS access key”;
String awsSecretKey = “Your AWS Secret key”;

// use your AWS keys to create a credentials object
AWSCredentials awsCredentials = new AWSCredentials(awsAccessKey, awsSecretKey);

// create the service object with our AWS credentials
S3Service s3Service = new RestS3Service(awsCredentials);

버켓 관리하기

버켓은 org.jets3t.service.model.BaseS3Object 클래스를 확장한 org.jets3t.service.model.S3Bucket으로 캡슐화된다. 이 클래스는 JetS3t 모델의 버켓과 오브젝트의 상위 클래스이다. 각 S3Bucket 오브젝트는 버켓의 이름과 지리적 위치, 버켓의 생성 날짜, 소유자 이름, 버켓과 연관된 메타데이터 등의 중요한 버켓 정보를 인쇄하는 데 사용할 수 있는 다양한 접근자 메소드와 toString()을 제공한다.


Listing 2. 버켓 표시하기
// list all buckets in the AWS account and print info for each bucket.
S3Bucket[] buckets = s3Service.listAllBuckets();
for (S3Bucket b : buckets) {
   System.out.println(b);
}

고유한 버켓 이름을 제공하여 새 버켓을 만들 수 있다. 버켓의 네임스페이스는 모든 사용자 계정에서 공유하므로 고유 이름을 찾기가 쉽지 않을 수도 있다. 버켓과 버켓에 포함된 오브젝트를 저장할 실제 위치를 지정할 수도 있다.


Listing 3. 버켓 만들기
// create a US bucket and print its info
S3Bucket bucket = s3Service.createBucket(bucketName);
System.out.println("Created bucket - " + bucketName + " - " + bucket);


// create a EU bucket and print its info
S3Bucket bucket = s3Service.createBucket(bucketName, S3Bucket.LOCATION_EUROPE);
System.out.println("Created bucket - " + bucketName + " - " + bucket);

버켓에 있는 오브젝트를 모두 삭제해야만 버켓을 삭제할 수 있으며, 그렇지 않으면 예외가 발생한다. 사용하고 있는 RestS3Service 클래스는 단일 오브젝트를 처리하는 데 적합하다. 여러 오브젝트를 처리해야 하는 경우에는 처리 시간을 단축하기 위해 멀티스레드 방식을 사용하는 것이 좋다. 멀티스레드 방식을 지원하기 위해 JetS3t에서는 org.jets3t.service.multithread.S3ServiceSimpleMulti 클래스를 제공한다. 이 클래스를 사용하여 기존 s3Service 오브젝트를 랩핑하면 멀티프로세서의 성능을 최대한으로 활용할 수 있다. 이 기능은 버켓에 포함된 모든 오브젝트를 삭제하여 버켓을 지워야 할 때 유용하게 사용할 수 있다.


Listing 4. 버켓 삭제하기
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, “my bucket”);

// delete a bucket – it must be empty first
s3Service.deleteBucket(bucket);


// create a multi threaded version of the RestService
S3ServiceSimpleMulti s3ServiceMulti = new S3ServiceSimpleMulti(s3Service);


// get all the objects from bucket
S3Object[] objects = s3Service.listObjects(bucket);

// clear the bucket by deleting all its objects
s3ServiceMulti.deleteObjects(bucket, objects);

각 버켓에는 버켓에 대한 권한과 다른 사용자에게 제공된 액세스 레벨을 확인하는 ACL이 연관되어 있다. ACL을 검색한 후 ACL에서 제공하는 권한을 인쇄할 수 있다.


Listing 5. 버켓에 대한 ACL 검색
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, “my bucket”);

// get the ACL and print it
AccessControlList acl = s3Service.getBucketAcl(bucket);
System.out.println(acl);

새로 만든 버켓과 오브젝트에는 기본적으로 해당 항목을 소유자 전용으로 만드는 권한이 할당된다. 이러한 설정은 버켓에 대한 ACL을 변경한 후 버켓에 대한 읽기, 쓰기 또는 전체 제어 권한을 사용자 그룹에 부여하여 수정할 수 있다.


Listing 6. 버켓 및 해당 컨텐츠를 공용 항목으로 만들기
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, “my bucket”);

// get the ACL
AccessControlList acl = s3Service.getBucketAcl(bucket);

// give everyone read access
acl.grantPermission(GroupGrantee.ALL_USERS, Permission.PERMISSION_READ);

// save changes back to S3
bucket.setAcl(acl);
s3Service.putBucketAcl(bucket);

손쉽게 버켓에 대한 로깅을 활성화하고 현재 로깅 상태를 검색할 수 있다. 로깅이 활성화되면 해당 버켓의 각 파일에 대한 세부 액세스 로그가 S3에 저장된다. 로그에 사용된 스토리지 공간에 대한 비용이 사용자의 S3 계정에 부과된다.


Listing 7. S3 버켓에 대한 로깅
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, “my bucket”);

// is logging enabled?
S3BucketLoggingStatus loggingStatus = s3Service.getBucketLoggingStatus(bucketName);
System.out.println(loggingStatus);

// enable logging
S3BucketLoggingStatus newLoggingStatus = new S3BucketLoggingStatus();

// set a prefix for your log files
newLoggingStatus.setLogfilePrefix(logFilePrefix);

// set the target bucket name
newLoggingStatus.setTargetBucketName(bucketName);

// give the log_delivery group permissions to read and write from the bucket
AccessControlList acl = s3Service.getBucketAcl(bucket);
acl.grantPermission(GroupGrantee.LOG_DELIVERY, Permission.PERMISSION_WRITE);
acl.grantPermission(GroupGrantee.LOG_DELIVERY, Permission.PERMISSION_READ_ACP);
bucket.setAcl(acl);

// save the changed ACL for the bucket to S3
s3Service.putBucketAcl(bucket);

// save the changes to the bucket logging
s3Service.setBucketLoggingStatus(bucketName, newLoggingStatus, true);
System.out.println("The bucket logging status is now enabled.");

오브젝트 관리하기

버켓에 포함된 각 오브젝트는 org.jets3t.service.model.S3Object로 표현된다. 각 S3Bucket 오브젝트는 다음과 같은 오브젝트의 중요 정보를 인쇄하는 데 사용할 수 있는 toString()을 제공한다.

  • 키 이름
  • 포함하는 버켓의 이름
  • 오브젝트를 마지막으로 수정한 날짜
  • 오브젝트에 연관된 메타데이터
이 오브젝트는 메타데이터와 함께 오브젝트의 다양한 특성에 액세스할 수 있는 메소드도 제공한다.



Listing 8. 오브젝트 표시하기
// list objects in a bucket.
S3Object[] objects = s3Service.listObjects(bucket);

// print out the object details
if (objects.length == 0) {
   System.out.println("No objects found");
} else {
   for (S3Object o : objects) {
      System.out.println(o);
   }
}

일치시킬 접두부를 제공하여 검색된 오브젝트의 목록을 필터링할 수 있다.


Listing 9. 오브젝트 목록 필터링하기
// list objects matching a prefix.
S3Object[] filteredObjects = s3Service.listObjects(bucket, “myprefix”, null);

// print out the object details
if (filteredObjects.length == 0) {
   System.out.println("No objects found");
} else {
   for (S3Object o : filteredObjects) {
      System.out.println(o);
   }
}

각 오브젝트는 컨텐츠 유형, 수정된 날짜 등과 같은 연관된 메타데이터를 가질 수 있으며 애플리케이션 관련 사용자 정의 메타데이터를 오브젝트에 연관시킬 수도 있다.


Listing 10. 오브젝트 메타데이터 검색하기
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, bucketName);

// getobjects matching a prefix
S3Object[] filteredObjects = s3Service.listObjects(bucket, “myprefix”, null);

if (filteredObjects.length == 0) {
   System.out.println("No matching objects found");
}else {
   
   // get the metadata for multiple objects.
   S3Object[] objectsWithHeadDetails = s3ServiceMulti.getObjectsHeads(bucket, 
      filteredObjects);

   // print out the metadata
   for (S3Object o : objectsWithHeadDetails) {
      System.out.println(o);
   }
}

새로 만들어진 각 오브젝트는 기본적으로 개인용 오브젝트이다. JetS3t를 사용하여 다른 사용자가 오브젝트 데이터를 다운로드하는 데 사용할 수 있는 서명된 URL을 생성할 수 있다. 이 URL은 일정 기간 동안만 유효하고 해당 기간 경과 후 자동으로 만료되도록 만들 수 있다. 이 경우 오브젝트는 여전히 개인용으로 유지되지만 짧은 기간 동안 오브젝트를 다운로드할 수 있도록 다른 사용자에게 URL을 제공할 수 있다.


Listing 11. 오브젝트 다운로드를 위한 서명된 URL 생성하기
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, bucketName);

// how long should this URL be valid?
int duration = Integer.parseInt(tokens.nextToken());
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MINUTE, duration);
Date expiryDate = cal.getTime();

// create the signed url
String url = S3Service.createSignedGetUrl(bucketName, objectKey,
        awsCredentials, expiryDate);
System.out.println("You can use this public URL to access this file for the next " 
   + duration + " min - " + url);

S3에서는 버켓에 있는 오브젝트당 최대 5GB의 공간이 허용된다. 오브젝트가 5GB를 초과하는 경우에는 오브젝트를 5GB 크기의 여러 파일로 분할한 후 분할된 모든 파일을 S3에 업로드해야 한다.


Listing 12. S3에 업로드하기
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, bucketName);

// create an object with the file data
File fileData = new File(“/my_file_to_upload”);
S3Object fileObject = new S3Object(bucket, fileData);

// put the data on S3
s3Service.putObject(bucket, fileObject);
System.out.println("Successfully uploaded object - " + fileObject);

JetS3t에서 제공하는 DownloadPackage 클래스를 사용하면 간편하게 S3 오브젝트의 데이터를 로컬 파일에 연관시켜서 자동으로 S3에 저장할 수 있다. 이 기능을 사용하면 S3에서 오브젝트를 쉽게 다운로드할 수 있다.


Listing 13. S3에서 다운로드하기
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, bucketName);

// get the object
S3Object fileObject = s3Service.getObject(bucket, fileName);

// associate a file with the object data
DownloadPackage[] downloadPackages = new DownloadPackage[1];
downloadPackages[0] = new DownloadPackage(fileObject,
                            new File(fileObject.getKey()));

// download objects to the associated files
s3ServiceMulti.downloadObjects(bucket, downloadPackages);
System.out.println("Successfully retrieved object to current directory");

이 섹션에서는 JetS3t 툴킷에서 제공하는 일부 기본 기능과 이러한 기능을 사용하여 S3와 상호 작용하는 방법에 대해 설명했다. S3 서비스 및 JetS3t 툴킷에 대한 자세한 정보는 참고자료에서 볼 수 있다.

S3 Shell

지금까지 간단한 코드를 사용한 수행한 S3 통신 기능을 명령행에서 실행할 수 있는 간단한 S3 Shell 프로그램을 생성하여 보다 유용하고 지속적인 형태로 변환할 수 있다. Amazon Web Services 액세스 키와 비밀 키를 매개변수로 받은 후 콘솔 프롬프트를 리턴하는 간단한 Java 프로그램을 만든 다음 한 개 이상의 문자를 입력하여 원하는 결과를 확인할 수 있다. 예를 들어, b를 입력하면 버켓이 표시되고, om을 입력하면 특정 접두부가 일치하는 오브젝트가 표시된다. 이 프로그램을 실제로 사용해 보기를 권장한다.

이 쉘 프로그램의 main()에는 이 기사에서 사용한 코드로 구성된 구현이 채워져 있다. 이 기사에서는 내용이 너무 길어지기 때문에 S3 Shell용 코드를 제공하지 않는다. 다운로드를 통해 전체 S3 Shell 소스 코드와 해당 종속 파일을 다운로드할 수 있다. devworks-s3.jar 파일을 실행하면 S3 Shell이 실행된다.


Listing 14. S3 Shell 실행하기
java -jar devworks-s3.jar my_aws_access_key my_aws_secret_key

S3 Shell에서는 언제라도 h를 입력하여 지원되는 명령 목록을 확인할 수 있다.


그림 2. S3 Shell의 도움말
 

몇 가지 유용한 메소드가 S3 Shell에 추가되었다. S3 Shell을 사용자의 구체적인 환경에서 더욱 유용하게 사용하기 위해 다른 기능을 추가하여 쉘을 확장할 수 있다.

요약

이 기사에서는 Amazon S3 서비스의 일부 기본 개념에 대해 살펴보았다. JetS3t 툴킷은 S3와 상호 작용하는 데 사용할 수 있는 오픈 소스 라이브러리이다. 샘플 코드를 사용하여 간단한 S3 Shell을 생성하는 방법도 살펴보았으며 명령행을 통해 쉽고 간단하게 S3를 직접 사용해 보았다.

이 "Amazon Web Services를 사용한 클라우드 컴퓨팅" 시리즈의 Part 3에서는 Amazon EC2(Elastic Compute Cloud)를 사용하여 클라우드에서 가상 서버를 실행하는 방법에 대해 설명한다.


다운로드 하십시오

설명이름크기다운로드 방식
Sample code for this article devworks-s3.zip 2.93MB HTTP

다운로드 방식에 대한 정보


참고자료

교육

제품 및 기술 얻기

  • 다른 도구들과 JetS3t를 다운로드하자. 

  • IBM 평가판 제품을 다운로드하여 IBM® DB2®, Lotus®, Rational®, Tivoli® 및 WebSphere®의 애플리케이션 개발 도구 및 미들웨어 제품을 사용해 보자. 

토론

필자소개

Prabhakar Chaganti photo

Prabhakar Chaganti는 사용자의 전체 AWS 클라우드 컴퓨팅 환경(EC2, S3, SQS 및 SimpleDB 포함)을 설계, 관리 및 모니터링하는 단일 통합 인터페이스를 만들고 있는 신생 업체 Ylastic의 CTO이다. 최근에 Xen Virtualization과 GWT Java AJAX Programming이라는 두 권의 책을 집필했으며, VMware Global Virtual Appliance Challenge에서 가장 혁신적인 가상 어플라이언스에 주어지는 커뮤니티 초이스 상을 수상하기도 했다.

아티클 순위