IBM®
메인 컨텐츠로 가기
    Korea [국가변경]    이용약관
 
 
   
        제품    서비스 & 솔루션    고객지원 & 다운로드    회원 서비스    
메인 컨텐츠로 가기

한국 developerWorks  >  Architecture | 웹 개발  >

Amazon Web Services를 사용한 클라우드 컴퓨팅, Part 5: SimpleDB를 통해 클라우드의 데이터세트 처리하기

developerWorks
문서 옵션

JavaScript가 필요한 문서 옵션은 디스플레이되지 않습니다.

영어원문

영어원문


제안 및 의견
피드백

난이도 : 초급

Prabhakar Chaganti, CTO, Ylastic, LLC

원문 게재일 : 2009 년 2 월 10 일
번역 게재일 : 2009 년 4 월 21 일

기본적인 Amazon SDB(SimpleDB) 개념에 대해 알아보고 SDB와 상호 작용하기 위한 오픈 소스 Python 라이브러리인 boto에서 제공하는 일부 기능을 살펴보십시오. 이 "Amazon Web Services를 사용한 클라우드 컴퓨팅" 시리즈에서는 Amazon Web Services를 사용한 클라우드 컴퓨팅에 대해 설명합니다. 신뢰할 수 있으며 확장 가능한 애플리케이션을 만들고 빌드할 수 있는 Amazon Web Services의 뛰어난 기능을 살펴보십시오. 이 기사에서는 일부 기본 개념에 대해 설명한 후 boto의 기능 중 일부를 살펴봅니다.

Amazon SimpleDB

Amazon SDB는 Amazon Web Services 기반 애플리케이션의 구조화된 데이터를 쉽게 저장하고 검색할 수 있는 빠르고 확장 가능한 실시간 데이터세트 인덱싱 및 쿼리 프레임워크이다. EC2(Elastic Compute Cloud) 및 S3(Simple Storage Service) 등의 기타 Amazon Web Services와 잘 작동하도록 설계되었다. SDB를 사용하면 Amazon Web Services 환경 내에 전체 애플리케이션 스택을 빌드할 수 있다. 사용량에 따라 서비스 비용을 지불하게 된다. 또한 무료로 제공되는 서비스도 있다.

IBM 및 Amazon Web Services

IBM과 AWS는 공조를 통해 가상 컴퓨팅 환경에서 IBM 소프트웨어에 액세스할 수 있는 기능을 제공한다. Amazon EC2 환경에서는 소프트웨어를 사용자의 시스템에 설치하지 않고도 평가 및 사용할 수 있다. 용량을 즉각적으로 조정하여 엔터프라이즈급 애플리케이션을 신뢰할 수 있는 고성능 환경에 구축할 수 있으며 사용한 용량과 시간에 따라서만 비용을 지불하면 된다. EC2에 포함된 소프트웨어 오퍼링은 다음과 같다.

  • DB2 Express-C 9.5
  • Informix Dynamic Server Developer Edition 11.5
  • WebSphere Portal Server 및 Lotus Web Content Management Standard Edition
  • WebSphere sMash

이 서비스는 모든 기능과 옵션을 사용할 수 있는 제품 레벨 코드이다. developerWorks Cloud Computing Resource Center에서 이들 제품에 대한 자세한 정보를 확인하고 Amazon Machine Images를 다운로드할 수 있다.

developerWorks의 Cloud computing space에서 여러 가지 클라우드 컴퓨팅 리소스를 볼 수 있다.

SDB에는 다음과 같은 특징이 있다.

신뢰성
SDB는 인덱싱된 데이터를 여러 데이터 센터에 중복 저장하여 항상 사용 가능한 상태로 유지해 준다.
속도
SDB는 데이터를 빠르게 검색할 수 있다. 특히 Amazon Web Services 환경의 EC2 인스턴스에서 요청할 경우 매우 빠른 검색 결과를 얻을 수 있다.
단순성
다양한 프로그래밍 언어에서 사용할 수 있는 간단한 프로그래밍 모델을 통해 SDB에 액세스하고 사용할 수 있다.
보안
SDB는 높은 수준의 보안을 제공한다. 인증된 사용자만 데이터에 액세스할 수 있다.
유연성
SDB에서는 미리 정의된 스키마가 없어도 데이터를 즉시 저장할 수 있다.
경제성
SDB는 매우 경제적인 요금 체계로 운영된다. 실제 사용한 항목에 대해서만 비용이 부과된다.

이 섹션의 나머지 부분에서는 SDB의 기본 개념에 대해 살펴본다.

도메인

도메인은 구조화된 데이터를 저장하는 컨테이너이며 사용자가 실행하는 쿼리의 대상이다. 데이터는 도메인의 항목으로 저장된다. 개념적으로 도메인은 스프레드시트의 워크시트와 비슷하며, 항목은 스프레드시트의 행에 해당한다. 현재 버전의 SDB에서는 쿼리를 한 도메인에 대해서만 실행할 수 있을 뿐 여러 도메인에 대해서는 실행할 수 없다.

각 도메인에는 다음과 같은 메타데이터가 연관되어 있다.

  • 메타데이터가 마지막으로 업데이트된 날짜 및 시간
  • 도메인의 모든 항목 수
  • 도메인에 있는 모든 속성 이름/값 쌍의 수
  • 도메인에 있는 고유 속성 이름의 수
  • 도메인에 있는 모든 항목 이름의 총 크기(바이트)
  • 모든 속성 값의 총 크기(바이트)
  • 모든 고유 속성 값의 총 크기(바이트)

SDB는 SQS(Simple Queue Service)와 마찬가지로 "결과적 일관성" 모델을 따른다. SDB는 내결함성을 강화하기 위해 각 도메인의 여러 사본을 유지한다. 도메인에 대한 모든 변경 사항은 모든 사본에 적용된다.

Amazon CTO Werner Vogels는 블로그에서 결과적 일관성의 기본 개념에 대한 의견을 제시하고 있다.
이 작업은 시스템 로드와 네트워크 지연에 따라 몇 초 정도 걸리기도 하므로 변경 사항이 도메인 사용자에게 즉시 표시되지 않을 수도 있다. 결과적으로는 변경 사항이 SDB 전체에 적용되기는 하지만 SDB 기반 애플리케이션을 설계할 때는 이 지연 시간을 충분히 고려해야 한다.

항목

항목은 도메인 내의 개별 오브젝트를 나타내며 값이 포함된 속성을 가지고 있다. 개념적으로 각 항목은 스프레드시트의 행과 비슷하며, 속성은 열에 해당하고 값은 셀에 해당한다. 속성은 단일 값으로 제한되지 않기 때문에 여러 값을 가질 수 있다. SDB는 데이터의 구조화 방법에 상관 없이 도메인을 자동으로 인덱싱한다.

SDB에서는 도메인에 대한 단일 쿼리의 실행 시간에 제한을 두고 있다. 단일 쿼리의 실행 시간이 5초를 초과하면 쿼리가 중지되고 오류가 리턴된다.

SDB의 도메인은 유연하며 고정된 스키마를 사용하지 않는다. 도메인의 각 항목은 최대 256개의 고유 속성 세트를 포함할 수 있다. 또한 속성은 해당 도메인에 있는 다른 항목의 다른 모든 속성과 완전히 다를 수 있다.

제한 사항

현재 버전의 SDB를 사용할 경우에는 애플리케이션을 설계할 때 다음과 같은 제한 사항을 고려해야 한다. 표 1에서는 이러한 제한 사항(최신 문서에서 Amazon이 지정한 제한 사항)을 보여 준다.


표 1. 현재 제한 사항
매개변수현재 제한 사항
도메인 크기 도메인당 10GB
250,000,000개의 속성 이름/값 쌍
3 - 255자(a - z, A - Z, 0 - 9, '_', '-' 및 '.')
Amazon Web Services 계정당 도메인 수 100개
속성 항목당 이름/값 쌍: 256개
이름 길이: 1024바이트
값 길이: 1024바이트

XML 문서에서 유효한 UTF-8 문자만 사용할 수 있다. 제어 문자 및 XML에서 유효하지 않은 시퀀스는 사용할 수 없다.

PutAttributes 작업당 최대 100개
Select 또는 QueryWithAttributes 작업당 요청 수: 최대 256개
쿼리 응답의 최대 항목 수 256개
최대 쿼리 실행 시간 5초
쿼리 표현식당 최대 조건부 수 10개
쿼리 표현식 조건부당 최대 비교 수 10개
select 표현식당 최대 고유 속성 수 20개
select 표현식당 최대 비교 수 20개
QueryWithAttributes 및 Select의 최대 응답 크기 1MB



위로


가격

SDB는 일정 한도까지 무료로 사용할 수 있으며, 무료 한도 초과시 사용량에 따라 가격이 책정된다. 비용 부과 기준은 다음과 같다.

  • 각 SDB 요청의 시스템 사용량
  • 지정된 요청을 완료하는 데 사용된 시스템 용량. 1.7-GHz Xeon 프로세서의 시간당 용량으로 계산된다.

무료 한도

적어도 2009년 6월 1일까지 매월 사용량을 기준으로 최초 25시간 동안의 시스템 사용 시간, 1GB의 데이터 전송 및 1GB의 스토리지에 대해 비용이 부과되지 않는다. Amazon에서 한정 기간 동안 상당한 수준의 용량을 무료로 제공하므로 많은 유형의 애플리케이션을 매우 쉽게 사용할 수 있다. 표 2에서는 가격 예제를 보여 준다.


표 2. 시스템 사용 가격
수량비용
최초 25시간 동안의 시스템 사용 시간 무료
추가 시스템 사용 시간 시스템 사용 시간당 0.14달러

표 3에서는 SDB를 통해 송수신된 데이터의 용량에 대한 가격을 보여 준다. 동일 지역 내에서 SDB와 기타 Amazon Web Services 사이에 전송된 데이터에는 비용이 부과되지 않는다. 그러나 다른 지역에 있는 SDB와 기타 Amazon Web Services 사이에 전송된 데이터에는 송신 및 수신 전송에 인터넷 데이터 전송 요금이 부과된다.


표 3. 데이터 전송 가격
전송 유형비용
모든 데이터 전송 최초 1GB의 수신 데이터: 무료
0.100달러/GB — 1G 이후의 모든 수신 데이터

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

표 4에서는 구조화된 데이터 스토리지의 비용을 보여 준다.


표 4. 구조화된 데이터 스토리지
스토리지 용량비용
모든 데이터 스토리지 최초 1GB의 데이터 용량: 무료
0.25달러/GB - 1G 이후의 모든 데이터 스토리지(월간)

Amazon SDB에서 최신 가격 정보를 확인할 수 있으며 Amazon에서 제공하는 Simple Monthly Calculator를 사용하여 SDB 및 기타 Amazon Web Services에 대한 월간 사용 비용을 계산할 수 있다.




위로


SDB 시작하기

SDB를 시작하려면 먼저 Amazon Web Services 계정(참고자료 참조)을 등록해야 한다. 이 시리즈의 Part 2에서 Amazon Web Services에 등록하는 방법에 대한 자세한 설명을 볼 수 있다. Amazon Web Services 계정을 만든 후에는 다음 단계를 수행하여 계정에 대한 Amazon SDB 서비스를 활성화해야 한다.

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

모든 Amazon Web Services 통신은 SOAP 인터페이스 또는 쿼리 인터페이스를 통해서 이루어진다. 이 기사에서는 쿼리 인터페이스를 사용하여 써드파티 라이브러리를 통해 SDB와 통신한다.

액세스 키를 받아야 한다. 액세스 키는 Web Services Account 정보 페이지에서 View Access Key Identifiers를 선택하여 액세스할 수 있다. 이제 Amazon Web Services를 사용할 준비가 완료되었으며 SDB 서비스를 사용할 수 있게 되었다.




위로


SDB와 상호 작용하기

이 예제에서는 Python 쉘에서 간단한 코드를 실행하여 오픈 소스 써드파티 Python 라이브러리인 boto를 사용하여 SDB를 익힌다.

boto 설치 및 환경 설정

boto를 다운로드한다. 이 기사를 쓸 때 최신 버전은 1.6b였다. 아카이브를 원하는 디렉토리에 압축 풀기한다. Listing 1과 같이 압축 풀기한 디렉토리로 변경한 후 setup.py를 실행하여 boto를 로컬 Python 환경에 설치한다.


Listing 1. boto 설치하기

$ cd directory_where_you_unzipped_boto

$ python setup.py install

Amazon Web Services 액세스 키를 가리키도록 일부 환경 변수를 설정한다. 액세스 키는 Web Services Account 정보에서 확인할 수 있다.


Listing 2. 환경 변수 설정하기

# Export variables with your AWS access keys
$ export AWS_ACCESS_KEY_ID=Your_AWS_Access_Key_ID 
$ export AWS_SECRET_ACCESS_KEY=Your_AWS_Secret_Access_Key

Listing 3과 같이 Python 쉘을 시작하고 boto 라이브러리를 가져와서 모든 설정이 올바르게 지정되었는지 확인한다.


Listing 3. 설정 확인하기

$ python
Python 2.4.5 (#1, Apr 12 2008, 02:18:19) 
[GCC 4.0.1 (Apple Computer, Inc. build 5367)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import boto
>>>

boto로 SDB 탐색하기

이 예제에서는 SDBConnection 클래스를 사용하여 SDB와 상호 작용하기 위한 기본 인터페이스를 제공한다. Python 콘솔에서 boto를 사용한다. 이 예제에서는 SDBConnection 오브젝트의 다양한 메소드를 호출하여 SDB에서 리턴하는 응답을 확인한다. 이 과정을 통해 API를 익히고 SDB의 기본 개념을 살펴볼 수 있다.

첫 번째 단계에서는 앞에서 사용자의 환경으로 내보낸 Amazon Web Services 액세스 키를 사용하여 SDB에 대한 연결 오브젝트를 생성한다. boto 라이브러리는 항상 이러한 변수가 설정되었는지 확인하기 위해 환경을 먼저 검사한다. 변수가 설정되어 있으면 boto는 연결을 생성할 때 이러한 변수를 자동으로 사용한다.


Listing 4. SDB 연결 생성하기

>>> import boto
>>> sdb_conn = boto.connect_sdb()
>>>

이 기사의 나머지 부분에서는 위에서 생성한 sdb_conn 오브젝트를 사용하여 SDB와 통신할 수 있다. 도메인에 대한 이름을 지정하여 새 도메인을 생성할 수 있다.


Listing 5. 도메인 생성하기

>>> d1 = sdb_conn.create_domain('devworks-dom-1')
>>> 

Listing 6과 같이 모든 도메인 목록을 검색한다. 그러면 Python 목록인 결과 세트 오브젝트가 리턴된다. 이 목록 전체를 반복하여 각 도메인에 액세스할 수 있다.


Listing 6. 모든 도메인 표시하기

>>> all_domains = sdb_conn.get_all_domains()
>>> 
>>> len(all_domains)
1
>>> 
>>> for d in all_domains:
...     print d.name
... 
devworks-dom-1

이름으로 단일 도메인을 검색할 수도 있다.


Listing 7. 단일 도메인 표시하기

>>> my_domain = sdb_conn.get_domain('devworks-dom-1')
>>> 
>>> print my_domain.name
devworks-dom-1

새로 생성된 도메인은 사용자가 항목을 추가할 때까지 비어 있다. 도메인 내에서 새 항목을 생성한 후 항목에 속성을 추가한다.


Listing 8. 새 항목 생성하기

>>> my_domain = sdb_conn.get_domain('devworks-dom-1')
>>> 
>>> i1 = my_domain.new_item('test_item_1')
>>> 
>>> i1['cars'] = 'BMW'
>>> 
>>> i1['fruits'] = ['apple', 'orange', 'mango']
>>> 

항목 이름을 지정하여 도메인에서 항목을 검색할 수 있으며, 이 이름은 고유해야 한다. 이는 관계형 데이터베이스의 기본 키 개념과 비슷하다.


Listing 9. 항목 및 해당 속성 검색하기

>>> my_item = my_domain.get_item('test_item_1')
>>> 
>>> print my_item
{u'cars': u'BMW', u'fruits': [u'apple', u'mango', u'orange']}
>>>

위에서 리턴된 항목 오브젝트는 활성 Item 오브젝트이기 때문에 사용자가 해당 속성 중 하나에 액세스하면 SDB에서 이 항목의 모든 속성이 자동으로 검색된다. 이 항목의 속성 값에 대한 업데이트는 SDB에 자동으로 저장된다.


Listing 10. 속성 업데이트하기
>>> my_item['cars']
u'BMW'
>>>
>>> my_item['cars'] = 'Honda'
>>> 
>>> my_item['cars']
'Honda'
>>>

SDBConnection 클래스를 사용하고 도메인 및 항목 이름을 지정하여 항목과 속성을 검색할 수도 있다.


Listing 11. SDBConnection을 사용하여 항목 검색하기

>>> 
>>> sdb_conn.get_attributes('devworks-dom-1','test_item_1')
{u'cars': u'Honda', u'fruits': [u'apple', u'mango', u'orange']}
>>> 

속성이 없는 항목은 SDB에 의해 자동으로 삭제된다. 항목 및 해당 속성을 구체적으로 지정해서 삭제할 수도 있다.


Listing 12. 항목 및 해당 속성 삭제하기

>>> sdb_conn.get_attributes('devworks-dom-1','test_item_1')
{u'cars': u'Honda', u'fruits': [u'apple', u'mango', u'orange']}
>>> 
>>> sdb_conn.delete_attributes('devworks-dom-1','test_item_1')
True
>>> sdb_conn.get_attributes('devworks-dom-1','test_item_1')
{}
>>>


Listing 13. 도메인 삭제하기

>>> sdb_conn.delete_domain('devworks-dom-1')
True
>>> 




위로


SDB 도메인 쿼리하기

구조화된 데이터를 검색할 수 있도록 SDB에서는 항목과 연관된 속성 이름-값 쌍이 포함된 사용자 정의 쿼리 언어를 제공한다. 쿼리 표현식은 조건부라는 기본 구성 요소로 구성된다. 각 조건부는 속성, 비교 연산자 및 비교할 값이 포함된 대괄호로 표시된다. 예를 들어, 조건부 ['desc' = 'Hello Devworks']desc에 대한 동등 비교를 정의한다. 각 조건부는 개별적으로 평가된 후 항목 이름 세트를 생성한다. unionintersection과 같은 세트 연산을 사용하여 여러 조건부를 결합해서 복잡한 쿼리를 작성할 수 있다.

쿼리에 조건부를 사용할 경우에는 모든 조건부 비교가 사전순으로 수행된다는 점을 고려해야 한다. 적절한 문자열 표현을 사용하여 데이터가 속성에 저장되어 있는지 확인해야 한다. 쿼리 실행 시간이 5초를 넘으면 쿼리가 자동으로 중지된다는 점을 명심해야 한다.


Listing 14. 테스트 데이터 생성하기

>>> d2 = sdb_conn.create_domain('devworks-dom-2')
>>>
>>> i1 = d2.new_item('car1')
>>> 
>>> i1['make']= 'BMW'
>>> i1['color']='grey'
>>> i1['year']='2008'
>>> i1['desc']='Sedan'
>>> i1['model']='530i'
>>> 
>>> i2 = d2.new_item('car2')
>>> 
>>> i2['make']= 'BMW'
>>> i2['color']='white'
>>> i2['year']='2007'
>>> i2['desc']='Sports Utility Vehicle'
>>> i2['model']='X5'
>>>


Listing 15. 단일 조건부를 사용하여 쿼리하기
>>> rs = d2.query("['make' = 'BMW']")
>>> for result in rs:
...     print result.name
... 
car1
car2
>>>


Listing 16. 여러 조건부를 사용하여 쿼리하기
>>> rs = d2.query("['make' = 'BMW'] intersection ['year' = '2007']")
>>> for result in rs:
...     print result.name
... 
car2
>>>

다양한 비교 연산자를 지원하는 쿼리 언어를 사용하면 범위 쿼리 및 다중 값 속성 쿼리를 수행할 수 있다. 쿼리를 작성하는 방법뿐 아니라 최상의 성능을 얻기 위해 미세 조정을 수행하는 방법에 이르는 다양한 기능과 예제를 보려면 Amazon Web Services에서 제공하는 쿼리 언어에 관한 소개 기사를 참조하는 것이 좋다.

또한 도메인에 대한 메타데이터를 검색하여 도메인의 총 항목 수를 비롯한 여러 가지 데이터를 확인할 수 있다.


Listing 17. 도메인에 대한 메타데이터
>>> my_domain = sdb_conn.get_domain('devworks-dom-2')
>>> 
>>> my_metadata = my_domain.get_metadata()
>>> 
>>> print my_metadata.item_count
2
>>> print my_metadata.item_names_size
8
>>> print my_metadata.attr_value_count
10
>>> print my_metadata.attr_names_size 
22
>>> print my_metadata.attr_values_size
56
>>> print my_metadata.timestamp       
1231798889
>>>
            




위로


결론

이 기사에서는 Amazon의 SDB 서비스와 기본 개념을 설명한 후 SDB와 통신하는 기능을 제공하는 오픈 소스 Python 라이브러리인 boto의 일부 기능을 살펴보았다.



참고자료

교육

제품 및 기술 얻기

토론


필자소개

Prabhakar Chaganti photo

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




기사에 대한 평가


보다 나은 서비스를 제공하기 위함이오니 잠시 짬을 내어 이 양식을 제출하여 주십시오.



 


 


 


이 문서 북마킹 하기

mar.gar.in mar.gar.in naver naver eolin eolin del.icio.us del.icio.us



developerWorks 콘텐트를 다른 사이트에 전재하기:
developerWorks 콘텐트에 대한 저작권은 IBM에 있습니다. IBM의 서면 허가나 원본 저자의 허락이 없이는 전재를 금합니다. 저희 콘텐트를 전재하시려면 IBM developerWorks 담당자 에게 문의하십시오.
    IBM 소개 개인정보 보호정책 문의