한국어

EDPS

Amazon Web Services를 사용한 클라우드 컴퓨팅, Part 1: 소개

구입보다 현명한 임대

Prabhakar Chaganti, CTO, Ylastic, LLC

요약: 기본적인 Amazon SDB(SimpleDB) 개념에 대해 알아보고 SDB와 상호 작용하기 위한 오픈 소스 Python 라이브러리인 boto에서 제공하는 일부 함수를 살펴보십시오. 이 "Amazon Web Services를 사용한 클라우드 컴퓨팅" 시리즈에서는 Amazon Web Services를 사용한 클라우드 컴퓨팅에 대해 설명합니다. 신뢰할 수 있는 확장 가능한 애플리케이션을 만들고 빌드할 수 있는 Amazon Web Services의 뛰어난 기능을 살펴보십시오. 이 첫 번째 기사에서는 이 가상 인프라의 빌딩 블록 기능에 대해 설명합니다. Amazon Web Services를 사용하여 웹 스케일 시스템을 구축하는 방법을 살펴보십시오.

이 연재 자세히 보기

원문 게재일:  2008 년 7 월 29 일 
번역 게재일:   2009 년 3 월 10 일 
난이도:  초급 
영어로:  보기 
PDF:  A4 and Letter (10KB | 40 pages)Get Adobe® Reader® 
페이지뷰: 3568 회 
의견: 0 (의견 추가)

1 star2 stars3 stars4 stars5 stars 평균 평가 등급 (총 6표)

클라우드 컴퓨팅이란?

클라우드 컴퓨팅은 간단히 말해서 외부 환경에서 서비스로 제공되는 확장 가능한 컴퓨팅 리소스를 사용량에 따라 요금을 지불하는 방식으로 사용하는 것이라고 정의할 수 있다. 필요한 리소스만 사용한 후 사용한 리소스에 대해서만 비용을 지불하고 인터넷을 통해 시간과 장소에 제약을 받지 않고 "클라우드"에 있는 모든 리소스에 액세스할 수 있다. 그러면서도 화면 뒤의 클라우드에 있는 리소스의 유지 관리에 신경을 쓰지 않아도 된다.

기술 아키텍처 다이어그램에서 인터넷이나 IP 가용성을 클라우드(구름)로 묘사하는 데서 유래된 클라우드 컴퓨팅은 2007년부터 수평적 확장 문제에 대한 솔루션으로 알려지면서 주목을 받았다.
클라우드는 애플리케이션의 요구에 대한 높은 가용성과 빠른 응답성을 지원한다. 클라우드 컴퓨팅은 유틸리티 컴퓨팅 또는 그리드 컴퓨팅이라고도 한다.

클라우드 컴퓨팅은 확장 가능한 애플리케이션을 만들고 제공하는 방법에 있어서 패러다임의 변화를 가져왔다. 과거에는 기업에서 소중한 시간과 리소스를 투자하여 인프라를 구축하였으며, 이 인프라가 바로 기업 경쟁력의 밑바탕이 되었다. 이러한 방식은 "만들어라. 그러면 수익이 발생한다"라는 사고 방식에 기반을 두고 있었다. 이 접근 방식의 특징은 다음과 같다.

  • 사용되지 않는 많은 양의 컴퓨팅 자원이 대규모 데이터 센터의 많은 공간을 차지한 채로 남아 있다.
  • 서버를 관리할 인력이 필요하다.
  • 에너지 비용이 든다.
추가 컴퓨팅 주기에 비용을 지불하려는 회사나 사용자가 나타나지 않는 한 사용되지 않는 컴퓨팅 리소스는 결국 폐기되고 만다.

클라우드 컴퓨팅에서는 잉여 컴퓨팅 성능을 고객에게 판매하여 수익을 올릴 수 있다. 이처럼 컴퓨팅 및 IT 인프라를 유틸리티로 전환하는 발상의 전환은 모두에게 주어지는 공정한 기회이다. 클라우드 컴퓨팅은 컴퓨팅 리소스보다는 아이디어에 바탕을 둔 경쟁력을 제공한다.

애플리케이션 및 IT 시스템에 필요한 리소스는 본질적으로 스토리지, 컴퓨팅 리소스, 메시징 시스템 및 데이터베이스에 대한 수요 증가를 충족하기 위해 상품화된다. 그리고 고객은 가장 좋은 가격과 서비스를 제공하는 업체에서 이 인프라를 임대할 수 있다. 단순하다. 그렇지 않은가? 이 아이디어는 완전히 새로운 것은 아니지만 단순하면서도 혁신적인 아이디어다. 지금은 Amazon에서 도입한 획기적인 클라우드 컴퓨팅 환경으로 인해 최신 기술 트렌드를 이끌고 있다.

Amazon Web Services

Amazon Web Services는 바로 사용할 수 있는 Amazon의 컴퓨팅 인프라에 프로그래밍 방식으로 액세스할 수 있도록 지원하는 서비스 집합이다. Amazon에서 여러 해 동안 심혈을 기울여 구축한 강력한 컴퓨팅 플랫폼을 이제 인터넷을 이용하는 모든 사람이 사용할 수 있게 되었다. Amazon에서 제공하는 웹 서비스에는 여러 가지가 있지만 이 시리즈에서는 대부분의 시스템에 반드시 필요한 기능 중 일부인 스토리지, 컴퓨팅, 메시징 및 데이터세트를 제공하는 기본 빌딩 블록 서비스에 대해서만 설명한다.

Amazon에서 제공하는 신뢰할 수 있고 비용 효율적인 빌딩 블록 서비스의 기능을 활용하여 복잡하고 다양한 엔터프라이즈 애플리케이션을 만들 수 있다. 웹 서비스 자체는 사용자의 환경 외부에 있는 클라우드에 상존하며 고가용성을 지원한다.

Amazon Web Services 성공 사례

SmugMug는 500TB 이상의 데이터를 S3에 저장하는 온라인 포토 스토리지 애플리케이션으로 서비스 및 스토리지에 대한 비용을 1백만 달러 가까이 절감한 것으로 추산된다. SmugMug는 EC2(Elastic Compute Cloud) 컴퓨팅 리소스의 수요를 급증시킨 상위 사용자(heavy user)이다.

37Signals는 유명한 온라인 프로젝트 관리 소프트웨어인 Basecamp의 제작업체로 S3를 사용하여 스토리지 요구를 해결하고 있다.

New York Times에는 용량이 수 TB에 달하는 아카이브 데이터를 수백 개의 EC2 인스턴스를 사용하여 36시간 이내에 처리할 수 있는EC2의 성능에 관한 기사가 실렸다.

Animoto는 비디오 처리를 위해 대용량의 컴퓨팅 성능이 필요한 온라인 프리젠테이션 비디오 생성기로, 최근에 EC2를 사용하여 처리 성능을 신속하게 확장함으로써 회사의 시스템에 치명적인 손상을 입힐 수도 있었던 웹 트래픽의 급증을 성공적으로 견뎌냈다. 당시에 무려 3,500개의 가상 인스턴스가 동시에 실행되고 있었다.

초기 비용을 투자할 필요가 없으며 사용량에 따라 비용을 지불하면 된다. Amazon에서 하드웨어를 관리하고 서비스를 제공하므로 유지 보수 비용이 들지 않는다.

가상 인프라는 오늘날 웹 환경에서 가장 위대한 도구이다. 실제 IT 매장에서는 수 주가 걸릴 수도 있겠지만 가상 인프라에서는 단 몇 분만에 빠르게 인프라를 구축할 수 있다. 여기에서 중요한 점은 인프라가 탄력적이라는 것이다. 즉, 요구에 따라 인프라를 자유롭게 확장하거나 축소할 수 있다. 전세계의 여러 회사에서 이 탄력적인 컴퓨팅 인프라를 사용하고 있다(사이드바 참조).

막대한 인프라 투자 비용과 유지 보수 비용에 대한 부담이 없기 때문에 더욱 좋은 혁신 기회를 맞이할 수 있다. 이제부터는 소유하고 있는 수많은 서버에서 발생하는 문제를 해결하거나 디스크 공간 부족을 걱정하는 등의 사소한 부분에 시달릴 필요 없이 중요한 비즈니스 아이디어에 집중할 수 있다. Amazon의 추정에 따르면 기업에서 인프라를 구축하고 관리하는 데 약 70%의 시간을 할애하는 반면 비즈니스의 핵심 아이디어에 실제로 투자하는 작업 시간은 30%에 불과하다고 한다. Amazon에서 하드웨어 및 인프라에 대한 실질적인 관리와 고가용성을 유지하는 방법을 처리하기 때문에 사용자는 자신의 아이디어를 실현하는 데 집중할 수 있다.

이 웹 스케일 인프라의 중심 요소는 다음과 같다. 이러한 요소는 대부분의 애플리케이션에 일반적으로 필요한 빌딩 블록을 제공한다.

스토리지
파일, 문서, 사용자 다운로드 또는 백업을 위해 모든 사람에게는 스토리지가 필요하다. 애플리케이션에 필요한 모든 것을 Amazon S3(Simple Storage Service)에 저장해 두고 확장성, 신뢰성, 고가용성 및 경제성을 갖춘 스토리지를 활용할 수 있다.
컴퓨팅
Amazon EC2(Elastic Compute Cloud)는 컴퓨팅 리소스를 요구에 따라 확장 또는 축소할 수 있는 기능을 제공하며 새 서버 인스턴스를 매우 쉽게 제공할 수 있다.
메시징
Amazon SQS(Simple Queue Service)에서 제공하는 신뢰할 수 있는 무제한 메시징을 사용하여 애플리케이션 구성 요소를 분리할 수 있다.
데이터세트
Amazon SDB(SimpleDB)는 유지 보수 작업이 필요 없고 확장 가능한 인덱스 스토리지를 제공할 뿐 아니라 데이터세트에 대한 처리 및 쿼리도 지원한다.

서비스는 필요에 따라 조합해서 사용할 수 있으며, 서로 잘 연동되도록 디자인되었다. Amazon 환경 내에서 실행하기 때문에 서비스 끼리의 모든 통신은 일반적으로 매우 빠르다.

이 "Amazon Web Services를 사용한 클라우드 컴퓨팅" 시리즈의 기사에서는 각 웹 서비스를 자세히 살펴보고 웹 서비스에 액세스하는 데 사용할 수 있는 라이브러리에 대해 자세히 설명한다.
기업에서는 이 가상 인프라를 활용하여 확장 가능하고 신뢰할 수 있는 애플리케이션을 빌드할 수 있을 뿐 아니라 요구되는 데이터 처리량의 급격한 변동에 대처하기 위해 대규모 서버 팜을 갖춰야 하는 기존 애플리케이션 호스팅 플랫폼에 비해 많은 비용을 절감할 수 있다. 이 가상 인프라는 높은 수준의 중복성도 제공한다.

Amazon Web Services 사용자는 다음 두 가지 레벨의 지원을 사용할 수 있다.

  • Amazon 포럼을 모니터링하는 Amazon 관계자의 무료 포럼 기반 지원
  • 보다 신중하게 도움을 요청할 수 있는 1:1 전화 지원을 제공하는 유료 지원 패키지
Amazon에서는 공객적으로 액세스할 수 있는 대시보드에 모든 웹 서비스의 상태를 게시하며, 이 대시보드는 서비스에 대한 모든 문제와 함께 업데이트된다. 서비스 중단이 발생할 경우 Amazon Web Services 팀에서는 문제에 대한 조치를 취하는 동안 문제가 해결될 때까지 15~30분 간격으로 업데이트된 사항을 공지한다.

Amazon에서는 각 서비스의 상호 작용을 위해 표준 기반 SOAP 및 REST 인터페이스를 제공한다. Amazon이나 써드파티에서 이들 서비스와의 통신을 위해 Ruby, Python, Java™, Erlang, PHP 등을 포함한 여러 가지 언어로 작성한 개발자 라이브러리를 사용할 수 있다. 또한 명령행 도구를 사용하여 EC2의 컴퓨팅 리소스를 관리할 수 있다. REST 인터페이스는 사용하기 쉽기 때문에 원하는 프로그래밍 언어로 작성된 클라이언트를 사용하여 HTTP를 통해 웹 서비스를 요청할 수 있다.

Amazon S3를 사용한 스토리지

Amazon S3(Simple Storage Service)는 데이터 저장 및 검색 기능을 갖춘 웹 서비스 인터페이스를 제공한다. 데이터의 유형에는 제한이 없으며 인터넷을 통해 어디에서나 데이터를 저장하고 액세스할 수 있다. S3에 저장할 수 있는 오브젝트의 수에는 제한이 없으며 저장할 수 있는 오브젝트의 크기 범위는 1바이트에서 5GB까지이다. 스토리지 자체는 미국이나 유럽 연합에 있으며 버킷(운영 체제의 폴더 개념)을 만들 때 오브젝트를 저장할 스토리지 위치를 선택할 수 있다. 데이터는 Amazon의 월드와이드 e-commerce 웹 사이트에 사용되는 것과 동일한 데이터 스토리지 인프라를 사용하여 안전하게 저장된다.

S3에 저장한 각 오브젝트에 액세스 제한을 지정할 수 있으며, 간단한 HTTP 요청을 사용하여 오브젝트에 액세스할 수 있다. BitTorrent 프로토콜을 사용해서도 오브젝트를 다운로드할 수 있다.

S3를 사용하면 스토리지 공간, 데이터 액세스 및 데이터 보안에 대한 걱정을 완전히 덜 수 있다. 스토리지 서버 관리 비용까지도 신경쓰지 않아도 된다.

Amazon에서 파일의 고가용성을 보장하므로 필요할 때마다 파일을 사용할 수 있다. Amazon에서 제공하는 S3 관련 서비스 레벨 계약은 월간 측정치를 기준으로 99.9%의 가동 시간을 보장한다.

Amazon EC2를 사용한 탄력적 컴퓨팅

Amazon EC2는 가상 시스템을 수 분 내에 요청하고 수요에 따라 용량을 손쉽게 확장 또는 축소할 수 있는 웹 서비스이다. 사용한 컴퓨팅 시간에 대해서만 비용을 지불하면 된다. 컴퓨팅 용량을 늘려야 하는 경우 가상 인스턴스를 신속하게 실행할 수 있으며 수요가 줄어든 후 종료할 수 있다.

이들 인스턴스는 Linux®를 기반으로 하며 원하는 애플리케이션이나 소프트웨어를 모두 실행할 수 있다. 각 인스턴스를 사용자가 제어할 수 있다. EC2 환경 자체는 캠브리지 대학교에서 개발한 오픈 소스 Xen 하이퍼바이저를 기반으로 빌드되었다. 이 환경에서는 인스턴스에 대한 템플리트로 작동하는 AMI(Amazon machine images)를 만들 수 있다. 권한을 지정하여 인스턴스에 대한 액세스를 제어할 수 있다. 인스턴스를 사용하여 원하는 모든 작업을 수행할 수 있지만 인스턴스가 Linux 기반 이미지여야 한다는 한 가지 제약이 따른다. 최근에 Sun Microsystems과의 제휴로 Amazon에서 Open Solaris 지원을 발표하기는 했지만 무료 또는 상업용으로 사전 빌드된 EC2 이미지는 대부분 Linux를 기반으로 하고 있다.

Amazon EC2는 진정한 웹 스케일 컴퓨팅을 제공하기 때문에 컴퓨팅 리소스를 손쉽게 확장하고 축소할 수 있다. Amazon의 데이터 센터에서 실행되는 이 컴퓨팅 환경을 사용자가 완벽하게 제어할 수 있다. Amazon에서는 5가지 유형의 서버를 제공하며, 사용자의 애플리케이션 요구에 적합한 서버를 선택할 수 있다. 상용 싱글 코어 x86 서버부터 8코어 x86_64 서버까지 다양한 서버가 있다. 장애에 대비하기 위해 여러 지역 또는 가용성 영역에 인스턴스를 배치할 수 있다. Amazon에서는 IP 주소를 인스턴스에 동적으로 할당할 수 있는 탄력적 IP 주소라는 개념도 도입했다.

Amazon Simple Queue Service를 통해 신뢰할 수 있는 메시징 인프라 구축하기

Amazon SQS(Simple Queue Service)는 Amazon에 사용되는 신뢰할 수 있는 메시징 인프라에 대한 액세스를 제공한다. 간단한 REST 기반 HTTP 요청을 사용하여 어디에서나 메시지를 보내고 검색할 수 있다. 아무 것도 설치하거나 구성할 필요가 없다. 만들 수 있는 큐의 수와 보낼 수 있는 메시지의 수에 제한이 없으며 Amazon에서 여러 서버와 데이터 센터에 메시지를 저장하므로 메시징 시스템에 필요한 중복성과 신뢰성을 갖출 수 있다. 각 메시지는 최대 8KB의 텍스트 데이터를 포함할 수 있다. 메시지에 사용할 수 있는 유니코드 문자는 다음과 같다. 
#x9 | #xA | #xD | [#x20 ~ #xD7FF] | [#xE000 ~ #xFFFD] | [#x10000 ~ #x10FFFF]

각 큐의 가시성 제한 시간을 구성하여 큐에 대한 여러 리더의 액세스를 제어할 수 있다. 한 애플리케이션이 큐의 메시지를 읽고 있으면 제한 시간이 만기될 때까지 다른 리더에서는 해당 메시지가 표시되지 않는다. 제한 시간이 경과되면 큐의 메시지가 다시 표시되고 다른 리더 프로세스에서 메시지를 처리할 수 있다.

SQS는 다른 Amazon Web Services와 매우 잘 통합되기 때문에 EC2 인스턴스에서 SQS에 메시지를 보내 서로 통신하고 워크플로우를 조정하는 데 사용할 수 있는 분리된 시스템을 효과적으로 구축할 수 있다. 또한 큐를 사용하여 사용자의 애플리케이션에 사용할 자기 치료 및 자동 확장 기능을 갖춘 EC2 기반 인프라를 구축할 수 있다. SQS에서 제공하는 인증 메커니즘을 사용하여 큐의 메시지에 대한 무단 액세스를 차단할 수 있다.

Amazon SimpleDB를 통해 데이터세트 처리하기

Amazon SDB(SimpleDB)는 구조화된 데이터세트를 저장, 처리 및 쿼리하는 기능을 제공하는 웹 서비스이다. 일반적인 의미의 관계형 데이터베이스는 아니지만 클라우드 내에 약하게 구조화된 데이터 저장소를 갖춘 가용성 높은 스키마로 키 값을 저장하고 검색하는 데 사용할 수 있다. 각 키 값 세트에는 고유 항목 이름이 필요하며, 항목 자체는 도메인으로 파티션되어 있다. 각 항목은 최대 256개의 키값 데이터 쌍을 포함할 수 있다. 각 도메인 내에서 데이터세트에 대한 쿼리를 수행할 수 있다. SDB에서는 아직까지 도메인 간 쿼리가 지원되지 않는다.

SDB는 사용하기 쉬우며 관계형 데이터베이스의 기능을 대부분 제공한다. 설치나 구성 작업이 필요하지 않기 때문에 일반적인 데이터베이스에 비해 유지 보수가 훨씬 쉽다. Amazon에서 모든 관리 작업을 수행한다. 데이터는 자동으로 인덱싱되며 언제 어디서나 사용할 수 있도록 제공된다. 스키마로 제한되지 않을 경우 얻게 되는 주요 장점은 데이터를 즉시 삽입하고 새 열이나 키를 동적으로 추가할 수 있다는 것이다.

Amazon 인프라의 일부인 SDB는 사용자의 간섭 없이 자동으로 크기가 조정되므로 중요한 업무에 더 많은 시간을 투자할 수 있다. 다시 한번 말하지만 비용은 사용한 데이터세트 리소스에 대해서만 지불하면 된다.

확장 가능한 아키텍처

확장 가능한 시스템을 구축하는 데 도움이 되는 Amazon Web Services의 특징은 다음과 같다.

신뢰성
Amazon의 자체 비즈니스를 실행하고 극한 테스트를 거친 고가용성 데이터 센터에서 서비스가 실행된다.
보안
기본 보안 및 인증 메커니즘을 바로 사용할 수 있으며 서비스에 애플리케이션 관련 보안 기능을 추가하여 필요에 따라 보안을 강화할 수 있다.
비용 절감
고정 비용이나 유지 보수 비용이 없다. 사용한 만큼 서비스 비용을 지불하고 필요에 따라 리소스와 예산을 확장할 수 있다.
손쉬운 개발
단순한 API를 사용하여 가장 널리 사용되는 프로그래밍 언어로 제공되는 라이브러리와 이 가상 인프라의 모든 기능을 활용할 수 있다.
탄력성
컴퓨팅 자원을 수요에 따라 확장 또는 축소할 수 있다. 한 서버에서 여러 서버로 빠르게 확장하여 애플리케이션 요구에 대응할 수 있다.
연동성
4가지 핵심 빌딩 블록 서비스(스토리지컴퓨팅메시징 및 데이터세트)는 완벽하게 연동되도록 디자인되었으며 다양한 애플리케이션 도메인에서 작동하는 완벽한 솔루션을 제공한다.
커뮤니티
왕성한 활동을 통해 이러한 웹 서비스가 폭넓게 채택될 수 있도록 이끌고 있고 이 인프라를 기반으로 하는 고유한 애플리케이션을 만들고 있는 역동적인 사용자 커뮤니티의 도움을 받을 수 있다.

준비하기

이 "Amazon Web Services를 사용한 클라우드 컴퓨팅" 시리즈의 나머지 부분에서 서비스를 자세히 살펴보려면 먼저 Amazon Web Services 계정(참고자료참조)을 등록해야 한다. 계정을 등록하면 "Part 2: Amazon S3(Simple Storage Service)를 통해 클라우드의 스토리지 수요에 대응하기"에서 설명하는 다양한 라이브러리와 도구를 사용할 때 필요한 공용 및 개인용 보안 액세스 키와 x.509 인증서가 제공된다.

이들 웹 서버스와 상호 작용하는 데 사용할 수 있는 도구와 라이브러리는 다양한 언어로 작성되어 있다. 이 시리즈의 기사에서는 언어 불문적인 자세를 유지하기 위해 여러 언어로 작성된 예제를 사용하기는 하지만 Java, Ruby 또는 Python에 익숙하다면 더 쉽게 이해할 수 있을 것이다.

결론

이 기사에서는 Amazon의 클라우드 컴퓨팅 환경을 소개한 후 이 인프라의 네 가지 주요 부분에 대해 간략하게 설명했다. 이 시리지의 나머지 부분에서는 각 Amazon Web Service를 자세히 살펴본 후 이 가상 인프라를 활용하여 애플리케이션을 구축하는 데 사용할 수 있는 다양한 라이브러리와 도구에 대해 설명한다.


----

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® 
페이지뷰: 3023 회 
의견: 0 (의견 추가)

1 star2 stars3 stars4 stars5 stars 평균 평가 등급 (총 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)를 사용하여 클라우드에서 가상 서버를 실행하는 방법에 대해 설명한다.


----

Amazon Web Services를 사용한 클라우드 컴퓨팅, Part 3: EC2를 통해 서버 수요에 대응하기

Prabhakar Chaganti, CTO, Ylastic, LLC

요약: 기본적인 Amazon SDB(SimpleDB) 개념에 대해 알아보고 SDB와 상호 작용하기 위한 오픈 소스 Python 라이브러리인 boto에서 제공하는 일부 기능을 살펴보십시오. 이 "Amazon Web Services를 사용한 클라우드 컴퓨팅" 시리즈에서는 Amazon Web Services를 사용한 클라우드 컴퓨팅에 대해 설명합니다. 신뢰할 수 있으며 확장 가능한 애플리케이션을 만들고 빌드할 수 있는 Amazon Web Services의 뛰어난 기능을 살펴보십시오. 이 기사에서는 Amazon EC2(Elastic Compute Cloud)에서 제공하는 가상 서버에 대해 설명합니다. EC2를 통해 애플리케이션의 컴퓨팅 요구 사항을 빠르게 구성하고 수요에 따라 용량을 조정하는 방법을 살펴보십시오.

이 연재 자세히 보기

원문 게재일:  2008 년 10 월 14 일 
번역 게재일:   2009 년 4 월 07 일 
난이도:  초급 
영어로:  보기 
PDF:  A4 and Letter (78KB | 22 pages)Get Adobe® Reader® 
페이지뷰: 4058 회 
의견: 0 (의견 추가)

1 star2 stars3 stars4 stars5 stars 평균 평가 등급 (총 6표)

Amazon EC2

Amazon EC2(Elastic Compute Cloud)는 Amazon에서 제공하는 클라우드 컴퓨팅 환경의 기본 플랫폼이다. EC2에서는 비즈니스 니즈가 발생하거나 사용자가 원할 때 언제라도 손쉽게 가상 인스턴스를 생성하고, 실행하고, 제공할 수 있다. 인스턴스 유형과 실제 사용 시간에 따라 인스턴스 비용을 지불하면 된다. 가상 서버는 Amazon 데이터 센터의 안전한 환경 내에서 실행된다.

EC2에서 실행되는 웹 확장 애플리케이션이 얻을 수 있는 장점은 다음과 같다.

  • 컴퓨팅 요구 사항을 빠르게 구성할 수 있다.
  • 수요에 따라 용량을 조정할 수 있다.

이는 Yahoo의 프론트 페이지에 사이트가 올라온 후 트래픽 폭주로 인해 1시간 후에 사이트가 멈춰버릴 수도 있는 오늘날 웹 환경에서 가치를 헤아릴 수 없을 정도로 훌륭한 제안이다. 이제부터는 서버의 용량을 탄력적으로 관리할 수 있다. 이 새로운 탄력적 컴퓨팅 모델에는 다음과 같은 특징이 있다.

신뢰성
EC2에서는 인스턴스를 쉽게 제공할 수 있을 뿐 아니라 더 이상 필요 없는 인스턴스를 쉽게 제거할 수도 있다.
단순성
기본 개념이 간단하기 때문에 시스템을 유연하게 설계할 수 있다. Amazon에서 필요한 빌딩 블록을 모두 제공하므로 애플리케이션의 요구 사항에 따라 빌딩 블록을 자유롭게 결합할 수 있다.
보안
EC2는 높은 수준의 보안을 제공한다. Amazon의 안전한 데이터 센터 내에서 실행되는 모든 인스턴스는 방화벽 규칙을 구성하여 모든 액세스를 사용자가 신뢰하는 그룹으로 제한할 수 있다.
복원성
애플리케이션을 서로 다른 지역에 배치한 후 수명이 짧은 인스턴스와는 독립된 라이프사이클을 지닌 영구적 스토리지 볼륨을 사용하여 애플케이션의 복원성을 강화할 수 있다.
경제성
EC2 서비스는 사용자의 모든 서버 요구에 효과적으로 대응하기 위해 높은 경제성과 경쟁력을 갖춘 요금 체계로 운영된다.

프레임워크

이 섹션에서는 EC2 프레임워크의 기본 개념에 대해 살펴본다.

AMI(Amazon Machine Images)

AMI(Amazon Machine Images)는 사용자가 원하는 모든 소프트웨어나 애플리케이션을 실행할 수 있는 Linux® 기반의 패키지화된 서버 환경으로, EC2에서 제공하는 탄력적 컴퓨팅 환경의 핵심 요소이다. 현재 버전의 EC2에서는 Linux 기반 AMI를 지원하며 EC2 환경에서 OpenSolaris를 운영 체제로 사용하는 데 필요한 일부 초기 지원도 제공한다.

시스템 이미지에는 다음 세 가지 유형이 있다.

개인용사용자가 만든 이미지로 기본적으로 개인용이다. 사용자가 자신의 개인용 이미지를 시작할 수 있는 액세스 권한을 다른 사용자에게 부여할 수 있다.
공용사용자가 만들어서 Amazon Web Services 커뮤니티에 게시한 이미지로 누구나 이러한 이미지를 기반으로 하는 인스턴스를 실행해서 자유롭게 사용할 수 있다. Amazon Web Services Developer Connection 웹 사이트에서 모든 공용 이미지를 볼 수 있다.
유료특정 기능을 제공하는 이미지를 만들어서 Amazon 비용 외에 추가로 시간당 사용 요금을 지불할 의사가 있는 사용자에게 제공할 수 있다.

Amazon에서는 시스템 이미지를 손쉽게 만들고 관리할 수 있는 여러 가지 명령행 도구를 제공한다. 이미지 자체는 Amazon S3(Simple Storage Service)에 저장된다. EC2를 통해 이미지를 등록하면 이미지를 식별하고 이미지의 인스턴스를 실행하는 데 사용할 수 있는 고유 ID가 이미지에 할당된다. 이미지는 여러 가지 방법으로 만들 수 있다. 기존 공용 이미지를 바탕으로 자신의 이미지를 만든 후 다음과 같은 워크플로우를 사용하여 새로운 AMI를 생성할 수 있다.

  1. SSH(secure socket shell) 키 쌍을 사용하여 기존 AMI의 인스턴스를 실행한다.
  2. SSH로 인스턴스에 로그인한다.
  3. 원하는 대로 인스턴스를 사용자 정의한다.
  4. Amazon의 도구를 사용하여 실행 중인 인스턴스를 새 AMI 번들로 다시 생성한다.
  5. Amazon의 도구를 통해 번들을 S3에 업로드하여 저장한다.
  6. Amazon의 도구를 통해 새 이미지를 EC2에 등록한다.
  7. 이 새 이미지를 기반으로 하는 새 인스턴스를 실행한 후 만족할 때까지 사용자 정의 및 재번들링 작업을 반복한다.

EC2 커뮤니티에서 공용으로 제공하는 스크립트를 사용하여 새 AMI를 생성할 수도 있다. 스크립트를 사용하면 설계 단계부터 AMI를 생성할 수 있다. 자주 사용되는 스크립트는 다음과 같다.

  • Eric Hammond가 제공하는 Ubuntu 및 Debian 기반 AMI 생성 스크립트. 사이트에 있는 사전 빌드된 이미지를 사용하거나 해당 이미지를 기반으로 새로운 이미지를 만들 수 있다.
  • Ruby on Rails 애플리케이션의 기반으로 사용할 수 있는 이미지를 찾고 있는 사용자의 경우, Paul Dowman이 제공하는 스크립트를 사용하여 EC2에서 Rails 애플리케이션을 실행하기 위한 Ubuntu 기반 이미지를 만들 수 있다.
  • RightScale에서는 이미지를 설계 단계부터 만드는 데 사용할 수 있는 Ubuntu 및 CentOS 기반 스크립트를 제공한다.

인스턴스

인스턴스는 AMI를 템플리트로 사용하는 실행 중인 가상 인스턴스이다. Amazon에서 제공하는 도구를 통해 인스턴스를 실행 및 종료하고 인스턴스에 대한 세부 사항을 볼 수 있다. 또한 다양한 언어로 작성된 여러 가지 써드파티 라이브러리를 사용하여 인스턴스의 라이프사이클을 제어할 수도 있다.

인스턴스는 32비트 또는 64비트 플랫폼에 기반을 둔다. 다음 유형 중 하나일 수 있다. Amazon에서는 EC2 계산 단위로 각 인스턴스 유형에 대한 비용을 부과한다. 각 ECU(EC2 compute unit)는 해당하는 1.0 - 1.2GHz 2007 Opteron 또는 2007 Intel® Xeon™ 프로세서 용량을 제공한다. 각 인스턴스에 유형에 대한 세부 사항은 가격에서 확인할 수 있다.

S(Small) 인스턴스(m1.small)
1.7GB 메모리, 1ECU(가상 코어 1개, 1ECU 적용), 160GB 인스턴스 스토리지, 32비트 플랫폼, 적정 성능의 I/O
L(Large) 인스턴스(m1.large)
7.5GB 메모리, 4ECU(가상 코어 2개, 코어당 2ECU 적용), 850GB 인스턴스 스토리지, 64비트 플랫폼, 고성능 I/O
XL(eXtra Large) 인스턴스(m1.xlarge)
15GB 메모리, 8ECU(가상 코어 4개, 코어당 2ECU 적용), 1,690GB 인스턴스 스토리지, 64비트 플랫폼, 고성능 I/O
M(Medium) 인스턴스(c1.medium)
1.7GB 메모리, 5ECU(가상 코어 2개, 코어당 2.5ECU 적용), 350GB 인스턴스 스토리지, 32비트 플랫폼, 적정 성능의 I/O
XL(eXtra Large) 인스턴스(c1.xlarge)
7GB 메모리, 20ECU(가상 코어 8개, 코어당 2.5ECU 적용), 1,690GB 인스턴스 스토리지, 64비트 플랫폼, 고성능 I/O

인스턴스 비용은 실제 사용 시간에 따라 부과되므로 애플리케이션의 현재 로드를 기반으로 필요한 계산 용량을 손쉽게 조정할 수 있다. 따라서 많은 계산 용량을 미리 예약하지 않아도 된다.

보안 그룹

EC2 환경 내에서 시작된 모든 인스턴스는 보안 그룹 내에서 실행된다. 각 보안 그룹은 해당 그룹 내에서 실행되는 인스턴스에 대한 액세스 제한을 지정하는 방화벽 규칙을 정의한다. IP 주소 또는 CIDR(Classless Interdomain Routing) 규칙에 따라 액세스 권한을 부여하거나 제한할 수 있으며 이들 규칙에서는 포트 범위와 전송 프로토콜을 지정할 수 있다. 지정된 보안 그룹에 대한 액세스 권한도 제어할 수 있으므로 해당 보안 액세스 그룹 내에서 실행 중인 모든 인스턴스에게 사용자의 인스턴스에 대한 액세스를 자동으로 부여하거나 거부할 수 있다.

보안 키 쌍

보안 키 쌍은 인스턴스를 시작할 때 지정되는 공용/개인용 SSH 키 쌍으로, 실행된 인스턴스의 콘솔에 실제로 로그인하려는 경우에 필요하다. EC2는 키 쌍의 공용 부분을 실행된 인스턴스에 추가하며, 그런 다음 사용자가 개인용 키를 사용하여 ssh를 통해 인스턴스에 로그인할 수 있다.

보안 키 쌍은 API를 통해 Amazon Web Services를 요청할 수 있는 사용자를 고유하게 식별하게 하는 데 사용되는 Amazon Web Services 액세스 키 ID 및 보안 키(계정 정보 페이지에서 제공)와 다른 키이다. 이는 일반적으로 암호를 사용하지 않고도 인스턴스에 보안 로그인이 가능하도록 지원할 때 사용된다.

가용성 영역

EC2는 장애 복원성을 제공하기 위해 서로 다른 지역에 있는 여러 데이터 센터로 구성되어 있다. 사용자는 실행할 인스턴스를 여러 지역에 배치할 수 있으며, 이러한 지역 내에는 여러 가용성 영역이 있다. 현재 버전의 EC2에서는 동부 미국에 있는 단일 지역에 대한 액세스를 제공하며, 이 지역에는 세 개의 가용성 영역이 있다. Amazon에서는 한 지역 내의 각 가용성 영역이 다른 가용성 영역에서 발생한 장애로 인한 영향을 받지 않도록 각 영역을 분리해서 관리하고 있다.

단일 위치에서 장애가 발생할 경우 별도의 가용성 영역에 있는 인스턴스를 실행하여 애플리케이션을 보호할 수 있다. 인스턴스를 시작할 때 가용성 영역을 지정하지 않더라도 현재 시스템의 상태와 용량에 따라 가용성 영역이 자동으로 선택된다.

탄력적 IP 주소

EC2에서 실행되는 각 인스턴스에는 시작 시에 개인용 및 공용 IP 주소가 자동으로 할당되며, 이때 할당된 공용 IP 주소는 인터넷을 통해 인스턴스에 액세스하는 데 사용된다. 그리고 이 주소는 인스턴스를 시작할 때마다 변경된다. 동적 DNS 맵핑을 사용하여 DNS 이름을 IP 주소에 연결하는 경우에는 변경 사항이 인터넷을 통해 전파되는 데 최대 24시간이 소요될 수 있다. EC2에서는 이 문제로 인한 영향을 줄이기 위해 탄력적 IP 주소라는 개념을 도입했다. 각각의 탄력적 IP 주소는 특정 인스턴스가 아닌 사용자의 EC2 계정에 연결된 정적 IP 주소로 사용자가 명시적으로 해제하지 않는 한 사용자의 계정에 영구적으로 연결되어 있다.

인스턴스 간에 탄력적 IP 주소를 다시 맵핑할 수도 있다. 이 방법을 사용하면 다른 인스턴스를 시작한 후 다시 맵핑하여(또는 기존 인스턴스를 사용하여) 인스턴스 장애에 신속하게 대응할 수 있다. 단일 인스턴스와 탄력적 IP 주소는 일대일로만 맵핑할 수 있다.

EBS(Elastic Block Store)

EBS는 Amazon에서 만든 새로운 형식의 영구적 스토리지로 이를 통해 사용자는 볼륨을 만들어서 실행 중인 인스턴스에 블록 레벨 장치로 연결할 수 있다. 이러한 볼륨을 바탕으로 스냅샷을 만들 수 있으며, 나중에 스냅샷을 사용하여 볼륨을 다시 만들 수도 있다. 각 스냅샷은 특정 시점의 볼륨 상태를 나타낸다. 따라서 EBS 볼륨에 있는 인스턴스의 수명이 다한 이후에도 유지할 필요가 있는 파일과 데이터를 쉽게 저장할 수 있으며 나중에 해당 볼륨을 원하는 인스턴스에 간편하게 다시 연결할 수 있다.

단, 각 EBS 볼륨은 한 번에 한 인스턴스에만 연결할 수 있다는 제한이 있다. 그러나 단일 인스턴스에는 각기 다른 볼륨을 무제한으로 연결할 수 있다. 각 EBS 볼륨은 가용성 영역에 위치하며 연결된다. 볼륨을 연결할 대상 인스턴스는 동일한 가용성 영역에 있어야 한다. EBS 볼륨은 계정당 20개로 제한되지만 더 많은 볼륨을 사용해야 하는 경우에는 Amazon Web Services에 볼륨 수를 늘려달라고 요청할 수 있다.

가격

EC2 요금은 다음 4가지 기준에 따라 계산된다.

  • 사용된 인스턴스 유형. 두 가지 표준 인스턴스 유형이 있으며, 유형별로 코어의 수, 메모리 및 스토리지 용량, 아키텍처 등이 다르게 구성되어 있다.
    표준
    대부분의 애플리케이션에 사용할 수 있는 일반적인 인스턴스
    고성능 CPU
    높은 프로세서 성능이 필요한 계산 집약적 애플리케이션에 적합한 인스턴스

    표 1에서는 S(Small)부터 L(Large)까지의 인스턴스 유형에 대한 가격의 예를 보여 준다.

    표 1. 인스턴스 유형별 가격 

    유형세부 사항비용
    표준 S(Small)1.7GB 메모리, 1ECU, 160GB 스토리지, 32비트 플랫폼인스턴스 시간당 0.10달러
    표준 L(Large)7.5GB 메모리, 4ECU, 850GB 스토리지, 64비트 플랫폼인스턴스 시간당 0.40달러
    표준 XL(eXtra Large)15GB 메모리, 8ECU, 1,690GB 스토리지, 64비트 플랫폼인스턴스 시간당 0.80달러
    고성능 CPU M(Medium)1.7GB 메모리, 5ECU, 35GB 스토리지, 32비트 플랫폼인스턴스 시간당 0.20달러
    고성능 CPU XL(eXtra Large)7GB 메모리, 20ECU, 1,690GB 스토리지, 32비트 플랫폼인스턴스 시간당 0.80달러


  • EC2를 통해 송수신된 데이터 또는 대역폭의 용량. 미국 내 EC2, SimpleDB 및 S3 버켓 사이에 전송된 데이터에는 비용이 부과되지 않는다. EC2와 유럽 S3 버켓 사이에 전송된 데이터에는 표준 데이터 전송 요금이 부과된다. 표 2. 데이터 전송 가격 

    전송 유형비용
    인터넷 데이터 전송0.100달러/GB — 모든 수신 데이터

    0.170달러/GB — 월간 송신 데이터 중 최초 10TB 
    0.130달러/GB — 월간 송신 데이터 중 이후 40TB 
    0.110달러/GB — 월간 송신 데이터 중 이후 100TB 
    0.100달러/GB — 월간 송신 데이터 중 150TB를 초과하는 용량
    가용성 데이터 영역 전송0.00달러/GB — 동일한 데이터 영역에 있는 인스턴스 간에 전송되는 모든 데이터

    0.01달러/GB — 같은 지역에 속한 다른 데이터 영역에 있는 인스턴스 간에 전송되는 모든 데이터
    공용 및 탄력적 IP 데이터 전송0.01달러/GB — 송수신되는 모든 데이터
    개인용 IP 데이터 전송0.00달러/GB — 송수신되는 모든 데이터 


  • EBS 볼륨 및 스냅숏에 사용된 스토리지. 표 3. EBS 가격 

    유형비용
    EBS 볼륨0.10달러/GB(월)

    I/O 요청 백만 개당 0.10달러
    EBS 스냅샷0.15달러/GB(월)

    스냅샷을 저장하는 PUT 요청 1,000개당 0.01달러

    스냅샷을 로드하는 GET 요청 10,000개당 0.01달러


  • 할당된 탄력적 IP 주소 중 사용하지 않는 IP 주소 수. 표 4. 탄력적 IP 주소 가격 

    유형비용
    탄력적 IP사용 중인 탄력적 IP 주소의 경우 무료 

    전체 시간 동안 연결되지 않은 탄력적 IP 주소당 0.01달러

    탄력적 IP 주소 재맵핑당 0.00달러 — 처음 100개의 재맵핑/월
    탄력적 IP 주소 재맵핑당 0.10달러 — 100개 이후의 추가 재맵핑/월


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

EC2 시작하기

EC2를 시작하려면 먼저 Amazon Web Services 계정을 만들어야 한다. Amazon Web Services 계정을 만드는 방법에 대한 자세한 설명은 이 시리즈의 Part 2에서 볼 수 있다. 계정을 만든 후에는 다음 단계를 수행하여 계정에 대한 Amazon EC2 서비스를 활성화해야 한다.

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

모든 Amazon Web Services 통신은 SOAP 인터페이스 또는 쿼리/REST 인터페이스를 통해서 이루어진다. 이 기사에서는 쿼리/REST 인터페이스를 사용하여 EC2와 통신하므로 액세스 키를 받아야 한다. 액세스 키는 Web Services Account 정보 페이지에서 View Access Key Identifiers를 선택하여 액세스할 수 있다.

이제 Amazon Web Services를 사용할 준비가 완료되었으며 EC2 서비스를 사용할 수 있게 되었다.

EC2와 상호 작용하기

이 예제에서는 Amazon에서 제공하는 명령행 도구와 오픈 소스 써드파티 Ruby 라이브러리인 right_aws를 사용하여 EC2와 상호 작용한다. 이 기사에서 수행할 전체 작업은 다음과 같다.

  • 로컬 EC2 개발 환경 설정하기
  • 기존 AMI 실행하기
  • right_aws 라이브러리와 기타 필수 소프트웨어를 설치하도록 AMI 사용자 정의하기
  • AMI를 재번들링하여 S3에 업로드한 후 등록하기
  • 사용자 정의된 새 AMI 실행하기
  • Ruby 쉘에서 간단한 코드를 실행하여 right_aws API 익히기

로컬 EC2 개발 환경 설정하기

Amazon EC2 도구를 사용하려면 Java™ 기술이 설치되어 있어야 한다.

  1. Amazon EC2 AMI Tools과 Amazon EC2 API Tools을 다운로드한다.
  2. 도구 아카이브를 원하는 디렉토리에 압축 풀기한다.
  3. 일부 환경 변수를 설정하고 명령행에서 실행할 때 찾을 수 있도록 도구 디렉토리를 쉘 경로에 추가해야 한다. Listing 1에서는 해당 예제를 보여 준다.

    이 예제에서는 Linux용 명령을 사용하고 있으므로 Microsoft® Windows®를 사용하는 경우에는 해당 명령으로 대체해야 한다. 사용자의 계정 정보 페이지에서 EC2 X.509 인증서와 EC2 개인 키 파일을 다운로드할 수 있다.



    Listing 1. EC2 개발 환경 설정하기
    $ export EC2_HOME=path_to_the_directory_with_the_tools
    
    $ export JAVA_HOME=path_to_the_directory_with_your_java_sdk
    
    # Add the directory to your PATH
    $ export PATH=$PATH:$EC2_HOME/bin
    
    # Export variables with the paths to your private key file and X.509 certificate
    $ export EC2_PRIVATE_KEY=path_to_your_private_key 
    $ export EC2_CERT=path_to_your_x509_certificate
    

  4. 다음 명령을 통해 EC2 명령행 도구의 버전을 표시하여 모든 설정이 올바르게 지정되었는지 확인한다. 

    Listing 2. 설정 확인하기
    $ ec2-ami-tools-version
    1.3-20041 20071010
                

  5. 명령행 쉘에서 인스턴스를 실행한 다음 연결할 때 사용할 SSH 키 쌍을 만들어야 한다. Listing 3의 명령을 실행하면 새 키 쌍이 만들어진 후 키 쌍의 이름, 해당 지문 및 개인 키 데이터가 화면에 표시된다. 

    Listing 3. 새 SSH 키 쌍 만들기
    $ ec2-add-keypair devworks
     
    KEYPAIR devworks        29:d1:90:7b:3d:a4:99:52:41:e0:1f:21:d5:20:97:d3:f0:33:fd:76
    -----BEGIN RSA PRIVATE KEY-----
    MIIEowIBAAKCAQEAyxaeXt6nb+qzboVW/3ax7An8CUJjDqwNi/PZm4lGOAzOHGnuPlDXeh1GpJ9f
    hky7Bg6VEY2VfS5G6UtmIzsGf/JlquzVl/x3uyriOzeCIw+m07aSgUOBn3qW/74IZxYYkxCYdBci
    eZeKpr8Mpvuz2sfurRzQOkUeHyuEaiD1RRS7DGxxUXfpVYhGjPltfNW2xRSMLTaOZzRwRdS0cHUU
    hC+GOKFDkp8nqQpd8iGUtp2G2DI1pxRN4MbeFZHWMh5tcIo1NTc7pkFPGEwrq6pO6gIsEOLqGpTL
    +2AxJY5WToZQoTWieOVwLpjJU9fnufRs0Mt/M/TP6SGK/YkrQOprOwIDAQABAoIBAFj1UGvX9dnl
    IbHAwInoUSlGelsH9GIB5XEvYFtr9xEoMsRpdk1flfNMjZwgn3Qxeh6+Fnf438lUkwUv3M6D1WYI
    JJaJZUpM8ZlPwIcV2nBHM9k6+NOcYVQdG7VsZTvahusscssvMw+13KsLtpwSVwb3WsoDfAZ6LiaT
    Jk5in20hTiipC0pz0K9DgQ//76r20ysUFpCymj4EvQrRkk5kBtsiMixsJzimpUOrSmrRHcORKEin
    FKM6y/DFE33zhP8BNDQRaDLGni0Ip+/jP3EHmia41SSbnwzRcbXMfH5fL3KAyRsCE0ocHY+cjUng
    HPYxl1ffdLZuEW3wJDQFuTS/v4ECgYEA9r7HVVnrS2303zclzCTGen/W/SVbpflSKEYJOZpa8RtQ
    uFMOewfkTbBzfavLMVBYB8uAmcWIz5JAFSzlBaKDRCnouUeeDiDJVJd8Asbn1gCE8UVETUOthy50
    R90RTtPNMmyP7AnoSMTuzsbwVORus7IJvceWHQBB4KCh652UansCgYEA0rSmvdquidkXf5iFpebc
    6Wh/qy+L1dkgz7+HTZIMW7kxA4EfJFnqaQRPqJ5XYcLvk2IzxNQKJlZvtBhCfVYhPJ2uB2Yqxv0p
    0LXGC01fZSyhbYGfaxVymA3HMc2ULBbaFMyhO7l7zkz+G+qkylych59zJBSoUxSFStpgNL7NhkEC
    gYAPJIorLMeJ64eZo1LIgoFDx1C0XHSRbQmjuxiZ1mU6YsjDZyV+W2+hbPDJh5+CuUGNyOlthnfs
    9TbFlenAPMb9iezkYgbLKyvv6xQLP5W+xm1iOTQF4d9mam1sc566TblMHOmAPONqg9t8CS16qEI6
    +PQsF3GY+gkQ9gq54QPYvQKBgDgwjsrQd30xVI/lV7a/Uyg3gtxe6JaVuadNN0LbcMpBH64EkA58
    oANzb97SoxDiEEuog4+40CAbKtzHH2wXPPPSROeaOkwolS8gWnkHICp19XKjf6Tp6k5cVkOUxC/h
    xDSJwXGQ7FA+vgEp2NpSSjfssKLtk1ncfhNRGxjVzS9BAoGBALbBLS4Nbjs2Fco+okNQPNfJNSvW
    yWV7a6ngfRzW8B+BO6V1QRIR44bwv/Z74oQ7ttt8KoZENB5yzZwaVWpFlOjSO/4Nx++Ef4pY5aPS
    zNpXcXCZgUdA67qmOILvrG7bnDR60dcBZVBl7CjnpTlccg7MD4CBsFJx+hGRPD2yIV94
    -----END RSA PRIVATE KEY-----
    

  6. -----BEGIN RSA PRIVATE KEY-----로 시작하는 출력 부분을 로컬 파일에 저장한다. 이 파일은 인스턴스를 실행하고 SSH를 통해 인스턴스에 액세스할 때 개인 키로 사용된다. 따라서 이 파일은 누출되지 않도록 안전하게 관리해야 한다. 이 키를 사용하여 인스턴스를 실행한 후 나중에 키를 분실하게 되면 더 이상 쉘을 통해 인스턴스에 액세스할 수 없게 된다. 키 파일의 이름을 pk-devworks로 지정한 후 다음과 같이 파일에 대한 권한을 수정하여 보안을 강화한다. 

    Listing 4. 개인 키에 대한 권한 변경하기
    $ chmod 600 pk-devworks
    

이제 개발 환경이 설정되었다.

첫 번째 인스턴스 실행하기

이제 RightScale에서 제공하는 CentOS 기반의 공용 이미지 중 하나를 사용하여 첫 인스턴스를 실행한다. 이 이미지의 AMI ID는 ami-d8a347b1이다.


Listing 5. 인스턴스 실행하기
$ ec2-run-instances –k devworks -n 1 ami-d8a347b1

RESERVATION     r-2691404f      710193521658    default
INSTANCE        i-7f923516      ami-d8a347b1                    pending 
devworks        0               m1.small        2008-09-07T18:05:34+0000
us-east-1c      aki-9b00e5f2

새로 실행되는 인스턴스는 항상 보류 중 상태로 설정된다. 이 인스턴스는 현재 시동 중이므로 아직 사용할 수 없다. 이 상태에서는 인스턴스에 대한 다음과 같은 세부 사항을 볼 수 있다.

  • 시작 시간 — 이 인스턴스의 시작 시간이 UTC로 표시된다.
  • 인스턴스 유형 — 시작할 때 인스턴스의 유형을 지정하지 않았으므로 기본 m1.small 인스턴스가 자동으로 선택된다.
  • 가용성 영역 — 시작할 때 가용성 영역을 지정하지 않았으므로 현재 시스템 상태와 가용성에 따라 자동으로 가용성 영역이 선택된다.
  • 커널 — 이 인스턴스에서 사용하는 Linux 커널도 표시된다. 시작할 때 커널을 지정하거나 기본적으로 사용할 커널을 AMI에 미리 구성해 놓을 수 있다.
  • 보안 그룹 — 이 인스턴스는 기본 보안 그룹에 배치되었다. 고유한 보안 그룹을 작성하고 액세스 권한을 부여한 후 이러한 그룹에 인스턴스를 배치할 수 있다. 시작할 때 보안 그룹을 지정해야 한다. 인스턴스가 시작된 후에는 그룹 이름을 변경할 수 없지만 그룹에 대한 권한은 변경할 수 있다.

이제 실행 중인 인스턴스를 표시하여 인스턴스의 현재 상태를 확인할 수 있다.


Listing 6. 인스턴스 표시하기
$ ec2-describe-instances

RESERVATION     r-2691404f      710193521658    default
INSTANCE        i-7f923516      ami-d8a347b1    ec2-67-202-28-68.compute-1.amazonaws.com
domU-12-31-38-00-34-C8.compute-1.internal       running devworks        0
m1.small   2008-09-07T18:05:34+0000        us-east-1c      aki-9b00e5f

인스턴스가 실행 중임을 확인할 수 있으며 다음과 같은 세부 사항도 볼 수 있다.

  • 공용 DNS 이름 — 인터넷을 통해 이 인스턴스에 연결하는 데 사용할 수 있는 DNS 이름
  • 개인용 DNS 이름 — Amazon 데이터 센터 환경에 있는 EC2의 로컬 네트워크 내에서 이 인스턴스를 확인하는 데 사용되는 DNS 이름

SSH를 통해 첫 번째 인스턴스에 연결하기

이제 인스턴스에 대한 개인용 키와 공용 DNS 이름을 사용하여 SSH를 통해 인스턴스에 연결할 수 있다.


Listing 7. SSH를 통해 인스턴스에 연결하기
$ ssh -i pk-devworks root@ec2-67-202-28-68.compute-1.amazonaws.com

The authenticity of host 'ec2-67-202-28-68.compute-1.amazonaws.com (10.252.59.54)' 
can't be established.
RSA key fingerprint is ae:e5:00:54:75:65:1c:c5:44:53:72:b9:e0:b5:26:a9.
Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added 'ec2-67-202-28-68.compute-1.amazonaws.com,10.252.59.54'
(RSA) to the 
list of known hosts.


[root@domU-12-31-38-00-34-C8:~]

위에서 로그인한 후 오류 메시지가 표시되더라도 심각한 문제가 아니므로 무시해도 된다. 시동 후 AMI에서 몇 가지 사용자 정의 RightScale 스크립트가 실행되지만 여기에서는 설명하지 않는다.

인스턴스 사용자 정의 및 재번들링하기

매우 다양한 기능을 갖추고 있는 RightScale AMI는 기본 이미지로 사용하는 데 필요한 모든 기능을 제공한다. directory/home/ec2에 설치되는 EC2 명령행 도구도 포함되어 있다.

  1. 보안 인증서를 추가한다. 이러한 파일은 Listing 1에서 사용한 파일과 같다. 

    Listing 8. 인증서를 인스턴스에 복사하기
    $ scp -i pk-devworks path_to_your_private_key_cert 
    root@ec2-67-202-28-68.compute-1.amazonaws.com:/home/ec2/
    
    $ scp -i pk-devworks path_to_your_x509_cert 
    root@ec2-67-202-28-68.compute-1.amazonaws.com:/home/ec2/
               

  2. 이 이미지를 개인용 EC2 이미지로 사용할 수 있도록 환경 변수를 설정한다. /etc/profile.d/env.sh 파일을 열고 각 변수를 설정한다. 계정 정보와 액세스 키는 Web services account information에서 확인할 수 있으며 인증서와 개인용 키는 위 단계에서 인스턴스에 복사해 놓은 파일이다. 

    Listing 9. 인스턴스 환경 사용자 정의하기
    $ vim /etc/profile.d/env.sh
    
    export EC2_HOME=/home/ec2
    export EC2_CERT=
    export EC2_PRIVATE_KEY=
    export AWS_ACCOUNT_NUMBER=
    export AWS_ACCESS_KEY_ID=
    export AWS_SECRET_ACCESS_KEY=
    export PATH=$PATH:/home/ec2/bin/
    
    # Turn off the rightscripts so you don’t get the error on login.
    $ chkconfig --level 4 rightscale off
    
    # Change the login message
    $ echo “Welcome to my devworks test EC2 image” > /etc/motd
                

  3. 이 이미지에 Ruby가 이미 설치되어 있기는 하지만 이 기사에서 나중에 EC2와 상호 작용하는 데 사용할 Ruby 라이브러리를 설치해야 한다. 먼저 설치된 gem을 업데이트한 다음 right_aws gem과 기타 필요한 종속 파일을 설치한다. 

    Listing 10. Ruby gem 설치하기
    $ gem update
    $ gem install right_aws
                

  4. 이제 이 인스턴스를 재번들링하여 S3에 업로드한 후 EC2에 등록할 준비가 완료되었다. 먼저 인스턴스를 devworks-ec2라는 이름으로 재번들링한다. 이때 /mnt 및 /tmp 폴더는 무시한다. EC2 개인용 키, EC2 보안 인증서 및 Amazon Web Services 계정 번호도 지정해야 한다. 

    Listing 11. 인스턴스 재번들링하기
    $  ec2-bundle-vol -d /mnt -c /home/ec2/your_ec2_x509_cert  
    -k /home/ec2/your_ec2_private_key -u your_aws_account_number 
    -e /mnt,/tmp -s 10240 -r i386 -p devworks-ec2
                

  5. 재번들링 프로세스가 완료되면 /mnt 디렉토리에 여러 파일이 만들어진다. 다음 예제에서는 새로 생성된 AMI의 구성 요소인 이들 파일을 S3에 업로드한다. 이미지는 사용자가 지정한 버켓에 배치된다. 아래 명령에서 –b 매개변수의 값에 이미지 파일을 저장할 S3에 있는 버켓의 이름을 지정한다. 

    Listing 12. S3에 이미지 업로드하기 
    $ ec2-upload-bundle -b your_s3_bucket -m /mnt/devworks-ec2.manifest.xml 
    -a your_aws_access_key -s your_aws_secret_key
               

  6. 이제 AMI가 S3에 안전하게 저장되었다. 이제 남은 작업은 나중에 이미지를 실행할 때 사용할 AMI ID를 받기 위해 AMI를 EC2에 등록하는 것이다. 

    Listing 13. EC2에 이미지 등록하기
    $ ec2-register -K /home/ec2/your_ec2_private_key 
    -C /home/ec2/your_ec2_x509_cert your_s3_bucket/devworks-ec2.manifest.xml
    
    IMAGE   ami-58c42031
                

  7. SSH 세션을 끝내고 실행 중인 인스턴스를 종료한다. 

    Listing 14. 인스턴스 종료하기
    $ ec2-terminate-instances i-7f923516
    INSTANCE        i-7f923516      running shutting-down
    

다음 섹션에서는 새로 생성된 AMI의 새 인스턴스를 실행하게 되며 이 기사의 나머지 부분에서는 이 인스턴스에서 right_aws 라이브러리를 사용하여 EC2를 탐색한다.

Ruby로 EC2 탐색하기

RightScale에서 제공하는 Ruby 라이브러리인 right_aws는 Ruby를 통해 Amazon의 EC2 서비스에 액세스할 수 있는 기능을 제공한다. 엄격한 테스트를 거친 이 라이브러리는 자체 제품에서 사용되고 있으며 최근에 소개된 EBS를 포함한 EC2의 모든 서비스에 액세스할 수 있다. 이 라이브러리는 강력한 재시도 및 오류 처리 기능을 제공하는 HTTP 라이브러리인 RightScale:HttpConnection과 함께 rubygem으로 패키징되어 있다. 이 기사에서는 이 라이브러리에서 제공하는 EC2의 기능 중 일부에 대해서만 설명한다. 라이브러리와 함께 제공되는 문서를 검토하여 API에 대한 종합적인 이해도를 높일 수 있다. right_aws 라이브러리와 이를 지원하는 right_http_connection 라이브러리에 대한 다양한 구성 옵션도 검토하자.

이 기사에서는 EC2 통신을 위한 기본 인터페이스를 제공하는 Rightscale::Ec2 클래스를 사용한다. 이 Ruby 라이브러리는 보통 irb 콘솔에서 사용된다. 이후 예제에서는 Rightscale::Ec2 오브젝트에 메시지를 보낸 후 EC2에서 리턴한 응답을 확인하는 방식으로 진행되므로 EC2 개념을 살펴보면서 API에 익숙해질 수 있다.

  1. 새 AMI의 인스턴스를 실행한다. 인스턴스가 실행 중 상태에 도달하면 SSH를 통해 인스턴스에 연결한다. 연결이 완료된 후에는 인스턴스 내에서 irb 콘솔을 사용한다. 

    Listing 15. 새 인스턴스를 실행하고 SSH를 통해 연결하기
    $ ec2-run-instances -k devworks -n 1 ami-58c42031
    
    RESERVATION     r-5795443e      710193521658    default
    INSTANCE        i-1a9e3973      ami-58c42031                    pending devworks    0
    m1.small        2008-09-07T21:06:37+0000        us-east-1c      aki-9b00e5f2
    
    $ ec2-describe-instances 
    
    RESERVATION     r-949544fd      710193521658    default
    INSTANCE        i-5a9d3a33      ami-58c42031    
    ec2-75-101-208-95.compute-1.amazonaws.com       
    domU-12-31-38-00-78-04.compute-1.internal       
    running devworks        0               m1.small   
    2008-09-07T21:14:27+0000        us-east-1c      aki-9b00e5f2
    
    $ ssh -i pk-devworks root@ec2-75-101-208-95.compute-1.amazonaws.com
              

  2. Ruby 쉘을 시작하고 Rightscale::Ec2 오브젝트를 만든다. 

    Listing 16. Ruby 쉘과 새 Rightscale::Ec2 오브젝트
    $ irb
    irb(main):001:0> require 'rubygems'
    => true
    irb(main):002:0> require 'right_aws'
    => true
    irb(main):003:0> @ec2 = Rightscale::Ec2.new(
    ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY'])
    

이제부터는 새로 만든 변수 @ec2를 사용하여 EC2를 탐색한다. 이 예제에서는 이 라이브러리의 기본 구성을 사용하고 있다. 라이브러리와 함께 제공되는 문서에서 사용 가능한 구성 옵션 목록을 볼 수 있다.

  1. 인스턴스 목록을 검색하면 해시 배열이 리턴되며, 이 배열에 있는 각 해시는 각 인스턴스에 대한 관련 정보를 제공한다. 이 라이브러리의 API 호출에서는 대부분 이러한 응답 형식을 공통적으로 사용한다. Listing 17에서는 해당 예제를 보여 준다. 

    Listing 17. 인스턴스 설명하기
    irb(main):004:0> @ec2.describe_instances()
    
    => [{:aws_launch_time=>"2008-09-07T21:14:27.000Z", :aws_kernel_id=>"aki-9b00e5f2", 
    :ssh_key_name=>"devworks", :aws_reservation_id=>"r-949544fd", 
    :aws_availability_zone=>"us-east-1c", 
    :aws_state=>"running", :aws_instance_id=>"i-5a9d3a33", :aws_groups=>["default"], 
    :aws_image_id=>"ami-58c42031", 
    :aws_product_codes=>[], :dns_name=>"ec2-75-101-208-95.compute-1.amazonaws.com", 
    :aws_state_code=>"16", 
    :private_dns_name=>"domU-12-31-38-00-78-04.compute-1.internal", 
    :aws_instance_type=>"m1.small", 
    :aws_reason=>"", :ami_launch_index=>"0"}]
               

  2. 이미지 목록을 검색한다. 

    Listing 18. 이미지 설명하기
    irb(main):005:0> @ec2.describe_images_by_owner([ENV['AWS_ACCOUNT_NUMBER']])
    
    => [{:aws_location=>"ylastic_images/devworks-ec2.manifest.xml",
     :aws_kernel_id=>"aki-9b00e5f2", :aws_state=>"available", :aws_is_public=>false,
    :aws_architecture=>"i386", :aws_id=>"ami-58c42031", :aws_image_type=>"machine"}]
                

  3. 인스턴스를 배치할 때와 인스턴스에 대한 액세스 권한을 제한 또는 부여할 때 사용할 수 있는 보안 그룹을 만든다. 

    Listing 19. 새 보안 그룹을 만들고 그룹 표시하기
    irb(main):006:0> @ec2.create_security_group("devworks", 
       "Devworks Article Security Group")
    
    => true
    
    irb(main):008:0> @ec2.describe_security_groups()
    
    => [{:aws_group_name=>"devworks", :aws_description=>"Devworks Article Security 
       Group", 
    :aws_perms=>[]}]
                

  4. 새 보안 키 쌍을 만들고 사용자 계정의 모든 키 쌍을 표시한다. 

    Listing 20. 새 보안 키 쌍을 만들고 키 쌍 표시하기
    irb(main):018:0> @ec2.create_key_pair('mykeypair')
    
    => {:aws_key_name=>"mykeypair", 
    :aws_fingerprint=>"c6:62:22:9e:99:05:6a:17:13:06:e0:86:f9:55:2a:78:ff:99:6b:fa", 
    
    :aws_material=>"-----BEGIN RSA PRIVATE KEY-----
    \nMIIEpAIBAAKCAQEAyRdAvihBXDu30o2uvQ1h8xdIRLHs0RjQWK4Yw5Y5DkaS41EEjnDwjO6sEY5l\n
    IXSuzVj1nkZ1VMPuVR3hIXHCMJLaAO77TaXZVC9yymIUAyTcQ1+hoVLlrCuVI3dEY21WQNTEbtkI\nlI
    xMW+UhkiaKrGHmt2yYLjr754KGt7pNCpRwxPXB7brlpQ3qpapkr7XrKZppvWoG8MCmPIFx8P0K\no8Cd
    mnF9lEdns6uaJZmfs4Ls9HZHpsmn0r42GbOAkJEkj7nE5zc3rXYpmCBZhjyHus0iXjS/n9oL\nHWhV0a
    wagjvmsQgJPYqEsBeO5pDb2IOZq5okQie1YJTd1m8k8k7m9wIDAQABAoIBAQCK0lWssOem\nP8fAQHVg
    J+v1wJ3wZpBhLWsvvUh1RbCvzUK8UQL/PrKh6Ga7W/0u4nmGY6J0mJmJYhWXhyATUZBI\nrih3uoOccC
    Eff/4T/y9nmDvC+zL+xtatTA0SRdTdeu6vpPLSv1uwCUbxrbXGSnszVAbNm9dXGvsq\nMK7GCYQEB4p4
    FtJolDqGZdWAj1u5/AGjbCI+PbkbCAro55Sqnl95WAlogdQFmgxljWl9TEIsbrHf\nYZHtKHlm1lvyeB
    QdVmwLT9S7ufI1J/GAevRxrG2iEkx/IJWYGnQE0P2bXa6Ry90UyvWRPS6Zi/MD\nfWoFAxnB6Ryssr+S
    IAfpG6SGuM55AoGBAOr7yPcvg/66f/Xd3CbpmI8lIfsXBb9xki3pIEfYAWD/\n2ToxpRYPTgrwwB1ufo
    NPr7U1QfzJvAvlTXWkfp4oUnssi5sXw1okZmm01hT0j0FNvsgMG6zD8Z/9\nmgrVrH+tBxVoYqrPM/WB
    dnYhQXEGQq+UF2uPqoKDbsl3DkftXTBrAoGBANsTdLfHmRidkLCRKfSj\nUrbJOSsU6RWGFuoqgD+DZL
    ngKBTaBTd6TVONSR2JvpVJo5hyiAXQ/jQ1XtsPAuJR6fiiRvDfgF7j\n1lp1tsFpNYx2R4+eqoLrHgIC
    Ak1Ke8tWyoD3NgQ4FO9TDfW+QHn0dpLeWdNMUd2a1GVKp4hIoJal\nAoGBAITqMryO5eyZ9XNPMQ3Zp+
    +gI15xoVCunu7VJOs+ZVlGnsrp9eVKdux9TU3YiDsiQdMP8ulX\n+sQHyg63It+3EyCVC8qIYHmGiV9V
    aJql0rovjbB+GNFabDwBKLbkMhRt/MnBJ75SQaOmvSkImomh\n7up9q9mtg9cbHPlcHHnW65VNAoGAKi
    +Y7jrVVFQjJJ0PgzhgGSqug4lHSQnFJ9p/T7uxjcmIblt9\nXa2Dbm9qgPGhbYX8psKHRvdzvAH6/hvp
    5kL31xUIrCGdyqf9AvZf9uaXlTDBnvpiw0sbQC+62b9a\nD1HrNOJl2HIkNeG8cnHsYI+etbFzgqjTqu
    TBua+iiy/RHLECgYALIDqaAcd7o4V+ws+WG1G9vTlc\nJ6/sBpu3JyKMSdJYlbgIbvHgrfbKhEYuNh/H
    XNdrI6oeW9eAruqHlH+OlUx0tCg4VIeQsz/b7kPS\nY14OMAswuHHyqlZIqK4Xy/R6SQmsc/CUXWPk5I
    UesJk5f1V1NXIqqwv6+nlEucdjgYUd5w==\n-----END RSA PRIVATE KEY-----"}
    
    
    irb(main):020:0> @ec2.describe_key_pairs()
    
    => [{:aws_key_name=>"mykeypair",
    :aws_fingerprint=>"c6:62:22:9e:99:05:6a:17:13:06:e0:86:f9:55:2a:78:ff:99:6b:fa"}]
                

  5. 새 EBS 볼륨을 만든다. 이 볼륨의 가용성 영역을 us-east-1c로 지정한다. 이 볼륨을 만든 후 사용할 수 있게 되면 같은 가용성 영역에서 실행 중인 인스턴스에만 이 볼륨을 연결할 수 있다. 이 볼륨의 초기 상태는 "생성 중" 상태이다. 프로세스가 완료되면 "사용 가능한" 볼륨이 된다. 

    Listing 21. 새 EBS 볼륨을 만들고 볼륨 표시하기
    irb(main):024:0> @ec2.create_volume('', 1, 'us-east-1c')
    
    => {:aws_status=>"creating", :aws_created_at=>Mon Sep 08 00:29:35 UTC 2008, 
    :zone=>"us-east-1c", :aws_size=>1, :snapshot_id=>nil, :aws_id=>"vol-2f34d146"}
    
    irb(main):026:0> @ec2.describe_volumes()
    
    => {:aws_status=>"available", :aws_created_at=>Mon Sep 08 00:29:35 UTC 2008, 
    :zone=>"us-east-1c", :aws_size=>1, :snapshot_id=>nil, :aws_id=>"vol-2f34d146"}
                

  6. 이 볼륨을 현재 인스턴스에 블록 장치 /dev/sdj로 연결한 후 실제로 사용할 수 있도록 ext3 파일 시스템 형식으로 지정한다. 

    Listing 22. 새 EBS 볼륨을 연결하고 파일 시스템 만들기
    irb(main):031:0> @ec2.attach_volume('vol-2f34d146', 'i-5a9d3a33', '/dev/sdj')
    
    => {:aws_instance_id=>"i-5a9d3a33", :aws_device=>"/dev/sdj", 
    :aws_attachment_status=>"attaching", :aws_id=>"vol-2f34d146", 
    :aws_attached_at=>Mon Sep 08 00:34:03 UTC 2008}
    
    
    $ mkfs.ext3 /dev/sdj
    mke2fs 1.39 (29-May-2006)
    /dev/sdj is entire device, not just one partition!
    Proceed anyway? (y,n) y   
    Filesystem label=
    OS type: Linux
    Block size=4096 (log=2)
    Fragment size=4096 (log=2)
    131072 inodes, 262144 blocks
    13107 blocks (5.00%) reserved for the super user
    First data block=0
    Maximum filesystem blocks=268435456
    8 block groups
    32768 blocks per group, 32768 fragments per group
    16384 inodes per group
    Superblock backups stored on blocks: 
            32768, 98304, 163840, 229376
    
    Writing inode tables: done                            
    Creating journal (8192 blocks): done
    Writing superblocks and filesystem accounting information: done
    
    This filesystem will be automatically checked every 39 mounts or
    180 days, whichever comes first.  Use tune2fs -c or -i to override.
                

  7. 새로 포맷한 블록 장치를 파일 시스템 폴더에 마운트한다. 

    Listing 23. 로컬 디렉토리에 볼륨을 마운트하고 사용하기
    $ mount /dev/sdj /mnt/my-vol
    
    $ echo “Hello Devworks” > /mnt/my-vol/test.txt
    
    # cat /mnt/my-vol/test.txt
    
    Hello Devworks
    

이제 이 EBS 볼륨을 시스템의 다른 블록 장치와 동일한 방식으로 사용할 수 있다. 즉, 볼륨에서 읽기 및 쓰기 작업을 수행할 수 있다. 볼륨 사용을 완료한 후에는 볼륨을 실행 중인 인스턴스에서 분리할 수 있으며, 나중에 언제라도 동일한 인스턴스나 다른 인스턴스에 다시 연결할 수 있다. 이 볼륨은 EC2의 유효성 수준을 획기적으로 높여준 지속적 스토리지이다. 이 자산은 다양한 방법으로 활용할 수 있다. 예를 들어, 인스턴스의 수명보다 오랫동안 유지되어야 하는 웹 서버 로그에 대한 중요 데이터베이스 데이터를 저장하는 경우 유용하게 사용할 수 있다.

EBS 볼륨의 스냅샷을 만들어서 특정 시점의 볼륨 컨텐츠를 관리할 수 있다. 스냅샷은 자동으로 S3에 저장되며 EC2에 의해 누적되는 방식으로 만들어진다. 볼륨의 첫 번째 스냅샷에는 전체 사본이 포함되지만 이후 스냅샷에는 변경된 부분만 저장된다. 현재는 Amazon Web Services 계정당 500개의 스냅샷만 허용되며 500개 이상이 필요한 경우에는 계정 제한을 늘려달라고 요청할 수 있다.


Listing 24. EBS 볼륨의 스냅샷 만들기
irb(main):007:0> @ec2.create_snapshot('vol-2f34d146')

=> {:aws_status=>"pending", :aws_volume_id=>"vol-2f34d146", 
:aws_started_at=>Mon Sep 08 00:49:15 UTC 2008, :aws_progress=>"", 
:aws_id=>"snap-13db3c7a"}

스냅샷은 EC2에서 백그라운드로 만들어진다. 모든 스냅샷을 주기적으로 표시하여 스냅샷이 성공적으로 만들어졌는지 확인할 수 있다.


Listing 25. EBS 스냅샷 표시하기
irb(main):008:0> @ec2.describe_snapshots()

=> [{:aws_status=>"completed", :aws_volume_id=>"vol-2f34d146", 
:aws_started_at=>Mon Sep 08 00:49:15 UTC 2008, :aws_progress=>"100%", 
:aws_id=>"snap-13db3c7a"}]

마지막으로 볼륨을 인스턴스에서 분리할 수 있다. 나중에 볼륨을 동일한 인스턴스나 다른 인스턴스에 다시 연결할 수 있다.


Listing 26. EBS 볼륨 분리하기
irb(main):006:0> @ec2.detach_volume('vol-2f34d146')

=> {:aws_instance_id=>"i-5a9d3a33", :aws_device=>"/dev/sdj", 
:aws_attachment_status=>"detaching", :aws_id=>"vol-2f34d146", 
:aws_attached_at=>Mon Sep 08 00:34:03 UTC 2008}

결론

이 기사에서는 Amazon의 EC2 서비스를 소개하고 기본 개념에 대해 설명했다. EC2와 상호 작용하는 데 사용할 수 있는 오픈 소스 Ruby 라이브러리인right_aws의 일부 기능도 살펴보았다. 많은 내용을 다루기는 했지만 EC2는 방대하고 복잡한 주제이므로 Amazon EC2 Developer Guide에서 더 많은 정보를 살펴보기를 권한다.

이 "Amazon Web Services를 사용한 클라우드 컴퓨팅" 시리즈의 Part 4에서는 클라우드에서 신뢰할 수 있는 메시징 기능을 제공하는 Amazon SQS(Simple Queue Service)에 대해 설명한다.


----

Amazon Web Services를 사용한 클라우드 컴퓨팅, Part 3: EC2를 통해 서버 수요에 대응하기

Prabhakar Chaganti, CTO, Ylastic, LLC

요약: 기본적인 Amazon SDB(SimpleDB) 개념에 대해 알아보고 SDB와 상호 작용하기 위한 오픈 소스 Python 라이브러리인 boto에서 제공하는 일부 기능을 살펴보십시오. 이 "Amazon Web Services를 사용한 클라우드 컴퓨팅" 시리즈에서는 Amazon Web Services를 사용한 클라우드 컴퓨팅에 대해 설명합니다. 신뢰할 수 있으며 확장 가능한 애플리케이션을 만들고 빌드할 수 있는 Amazon Web Services의 뛰어난 기능을 살펴보십시오. 이 기사에서는 Amazon EC2(Elastic Compute Cloud)에서 제공하는 가상 서버에 대해 설명합니다. EC2를 통해 애플리케이션의 컴퓨팅 요구 사항을 빠르게 구성하고 수요에 따라 용량을 조정하는 방법을 살펴보십시오.

이 연재 자세히 보기

원문 게재일:  2008 년 10 월 14 일 
번역 게재일:   2009 년 4 월 07 일 
난이도:  초급 
영어로:  보기 
PDF:  A4 and Letter (78KB | 22 pages)Get Adobe® Reader® 
페이지뷰: 4058 회 
의견: 0 (의견 추가)

1 star2 stars3 stars4 stars5 stars 평균 평가 등급 (총 6표)

Amazon EC2

Amazon EC2(Elastic Compute Cloud)는 Amazon에서 제공하는 클라우드 컴퓨팅 환경의 기본 플랫폼이다. EC2에서는 비즈니스 니즈가 발생하거나 사용자가 원할 때 언제라도 손쉽게 가상 인스턴스를 생성하고, 실행하고, 제공할 수 있다. 인스턴스 유형과 실제 사용 시간에 따라 인스턴스 비용을 지불하면 된다. 가상 서버는 Amazon 데이터 센터의 안전한 환경 내에서 실행된다.

EC2에서 실행되는 웹 확장 애플리케이션이 얻을 수 있는 장점은 다음과 같다.

  • 컴퓨팅 요구 사항을 빠르게 구성할 수 있다.
  • 수요에 따라 용량을 조정할 수 있다.

이는 Yahoo의 프론트 페이지에 사이트가 올라온 후 트래픽 폭주로 인해 1시간 후에 사이트가 멈춰버릴 수도 있는 오늘날 웹 환경에서 가치를 헤아릴 수 없을 정도로 훌륭한 제안이다. 이제부터는 서버의 용량을 탄력적으로 관리할 수 있다. 이 새로운 탄력적 컴퓨팅 모델에는 다음과 같은 특징이 있다.

신뢰성
EC2에서는 인스턴스를 쉽게 제공할 수 있을 뿐 아니라 더 이상 필요 없는 인스턴스를 쉽게 제거할 수도 있다.
단순성
기본 개념이 간단하기 때문에 시스템을 유연하게 설계할 수 있다. Amazon에서 필요한 빌딩 블록을 모두 제공하므로 애플리케이션의 요구 사항에 따라 빌딩 블록을 자유롭게 결합할 수 있다.
보안
EC2는 높은 수준의 보안을 제공한다. Amazon의 안전한 데이터 센터 내에서 실행되는 모든 인스턴스는 방화벽 규칙을 구성하여 모든 액세스를 사용자가 신뢰하는 그룹으로 제한할 수 있다.
복원성
애플리케이션을 서로 다른 지역에 배치한 후 수명이 짧은 인스턴스와는 독립된 라이프사이클을 지닌 영구적 스토리지 볼륨을 사용하여 애플케이션의 복원성을 강화할 수 있다.
경제성
EC2 서비스는 사용자의 모든 서버 요구에 효과적으로 대응하기 위해 높은 경제성과 경쟁력을 갖춘 요금 체계로 운영된다.

프레임워크

이 섹션에서는 EC2 프레임워크의 기본 개념에 대해 살펴본다.

AMI(Amazon Machine Images)

AMI(Amazon Machine Images)는 사용자가 원하는 모든 소프트웨어나 애플리케이션을 실행할 수 있는 Linux® 기반의 패키지화된 서버 환경으로, EC2에서 제공하는 탄력적 컴퓨팅 환경의 핵심 요소이다. 현재 버전의 EC2에서는 Linux 기반 AMI를 지원하며 EC2 환경에서 OpenSolaris를 운영 체제로 사용하는 데 필요한 일부 초기 지원도 제공한다.

시스템 이미지에는 다음 세 가지 유형이 있다.

개인용사용자가 만든 이미지로 기본적으로 개인용이다. 사용자가 자신의 개인용 이미지를 시작할 수 있는 액세스 권한을 다른 사용자에게 부여할 수 있다.
공용사용자가 만들어서 Amazon Web Services 커뮤니티에 게시한 이미지로 누구나 이러한 이미지를 기반으로 하는 인스턴스를 실행해서 자유롭게 사용할 수 있다. Amazon Web Services Developer Connection 웹 사이트에서 모든 공용 이미지를 볼 수 있다.
유료특정 기능을 제공하는 이미지를 만들어서 Amazon 비용 외에 추가로 시간당 사용 요금을 지불할 의사가 있는 사용자에게 제공할 수 있다.

Amazon에서는 시스템 이미지를 손쉽게 만들고 관리할 수 있는 여러 가지 명령행 도구를 제공한다. 이미지 자체는 Amazon S3(Simple Storage Service)에 저장된다. EC2를 통해 이미지를 등록하면 이미지를 식별하고 이미지의 인스턴스를 실행하는 데 사용할 수 있는 고유 ID가 이미지에 할당된다. 이미지는 여러 가지 방법으로 만들 수 있다. 기존 공용 이미지를 바탕으로 자신의 이미지를 만든 후 다음과 같은 워크플로우를 사용하여 새로운 AMI를 생성할 수 있다.

  1. SSH(secure socket shell) 키 쌍을 사용하여 기존 AMI의 인스턴스를 실행한다.
  2. SSH로 인스턴스에 로그인한다.
  3. 원하는 대로 인스턴스를 사용자 정의한다.
  4. Amazon의 도구를 사용하여 실행 중인 인스턴스를 새 AMI 번들로 다시 생성한다.
  5. Amazon의 도구를 통해 번들을 S3에 업로드하여 저장한다.
  6. Amazon의 도구를 통해 새 이미지를 EC2에 등록한다.
  7. 이 새 이미지를 기반으로 하는 새 인스턴스를 실행한 후 만족할 때까지 사용자 정의 및 재번들링 작업을 반복한다.

EC2 커뮤니티에서 공용으로 제공하는 스크립트를 사용하여 새 AMI를 생성할 수도 있다. 스크립트를 사용하면 설계 단계부터 AMI를 생성할 수 있다. 자주 사용되는 스크립트는 다음과 같다.

  • Eric Hammond가 제공하는 Ubuntu 및 Debian 기반 AMI 생성 스크립트. 사이트에 있는 사전 빌드된 이미지를 사용하거나 해당 이미지를 기반으로 새로운 이미지를 만들 수 있다.
  • Ruby on Rails 애플리케이션의 기반으로 사용할 수 있는 이미지를 찾고 있는 사용자의 경우, Paul Dowman이 제공하는 스크립트를 사용하여 EC2에서 Rails 애플리케이션을 실행하기 위한 Ubuntu 기반 이미지를 만들 수 있다.
  • RightScale에서는 이미지를 설계 단계부터 만드는 데 사용할 수 있는 Ubuntu 및 CentOS 기반 스크립트를 제공한다.

인스턴스

인스턴스는 AMI를 템플리트로 사용하는 실행 중인 가상 인스턴스이다. Amazon에서 제공하는 도구를 통해 인스턴스를 실행 및 종료하고 인스턴스에 대한 세부 사항을 볼 수 있다. 또한 다양한 언어로 작성된 여러 가지 써드파티 라이브러리를 사용하여 인스턴스의 라이프사이클을 제어할 수도 있다.

인스턴스는 32비트 또는 64비트 플랫폼에 기반을 둔다. 다음 유형 중 하나일 수 있다. Amazon에서는 EC2 계산 단위로 각 인스턴스 유형에 대한 비용을 부과한다. 각 ECU(EC2 compute unit)는 해당하는 1.0 - 1.2GHz 2007 Opteron 또는 2007 Intel® Xeon™ 프로세서 용량을 제공한다. 각 인스턴스에 유형에 대한 세부 사항은 가격에서 확인할 수 있다.

S(Small) 인스턴스(m1.small)
1.7GB 메모리, 1ECU(가상 코어 1개, 1ECU 적용), 160GB 인스턴스 스토리지, 32비트 플랫폼, 적정 성능의 I/O
L(Large) 인스턴스(m1.large)
7.5GB 메모리, 4ECU(가상 코어 2개, 코어당 2ECU 적용), 850GB 인스턴스 스토리지, 64비트 플랫폼, 고성능 I/O
XL(eXtra Large) 인스턴스(m1.xlarge)
15GB 메모리, 8ECU(가상 코어 4개, 코어당 2ECU 적용), 1,690GB 인스턴스 스토리지, 64비트 플랫폼, 고성능 I/O
M(Medium) 인스턴스(c1.medium)
1.7GB 메모리, 5ECU(가상 코어 2개, 코어당 2.5ECU 적용), 350GB 인스턴스 스토리지, 32비트 플랫폼, 적정 성능의 I/O
XL(eXtra Large) 인스턴스(c1.xlarge)
7GB 메모리, 20ECU(가상 코어 8개, 코어당 2.5ECU 적용), 1,690GB 인스턴스 스토리지, 64비트 플랫폼, 고성능 I/O

인스턴스 비용은 실제 사용 시간에 따라 부과되므로 애플리케이션의 현재 로드를 기반으로 필요한 계산 용량을 손쉽게 조정할 수 있다. 따라서 많은 계산 용량을 미리 예약하지 않아도 된다.

보안 그룹

EC2 환경 내에서 시작된 모든 인스턴스는 보안 그룹 내에서 실행된다. 각 보안 그룹은 해당 그룹 내에서 실행되는 인스턴스에 대한 액세스 제한을 지정하는 방화벽 규칙을 정의한다. IP 주소 또는 CIDR(Classless Interdomain Routing) 규칙에 따라 액세스 권한을 부여하거나 제한할 수 있으며 이들 규칙에서는 포트 범위와 전송 프로토콜을 지정할 수 있다. 지정된 보안 그룹에 대한 액세스 권한도 제어할 수 있으므로 해당 보안 액세스 그룹 내에서 실행 중인 모든 인스턴스에게 사용자의 인스턴스에 대한 액세스를 자동으로 부여하거나 거부할 수 있다.

보안 키 쌍

보안 키 쌍은 인스턴스를 시작할 때 지정되는 공용/개인용 SSH 키 쌍으로, 실행된 인스턴스의 콘솔에 실제로 로그인하려는 경우에 필요하다. EC2는 키 쌍의 공용 부분을 실행된 인스턴스에 추가하며, 그런 다음 사용자가 개인용 키를 사용하여 ssh를 통해 인스턴스에 로그인할 수 있다.

보안 키 쌍은 API를 통해 Amazon Web Services를 요청할 수 있는 사용자를 고유하게 식별하게 하는 데 사용되는 Amazon Web Services 액세스 키 ID 및 보안 키(계정 정보 페이지에서 제공)와 다른 키이다. 이는 일반적으로 암호를 사용하지 않고도 인스턴스에 보안 로그인이 가능하도록 지원할 때 사용된다.

가용성 영역

EC2는 장애 복원성을 제공하기 위해 서로 다른 지역에 있는 여러 데이터 센터로 구성되어 있다. 사용자는 실행할 인스턴스를 여러 지역에 배치할 수 있으며, 이러한 지역 내에는 여러 가용성 영역이 있다. 현재 버전의 EC2에서는 동부 미국에 있는 단일 지역에 대한 액세스를 제공하며, 이 지역에는 세 개의 가용성 영역이 있다. Amazon에서는 한 지역 내의 각 가용성 영역이 다른 가용성 영역에서 발생한 장애로 인한 영향을 받지 않도록 각 영역을 분리해서 관리하고 있다.

단일 위치에서 장애가 발생할 경우 별도의 가용성 영역에 있는 인스턴스를 실행하여 애플리케이션을 보호할 수 있다. 인스턴스를 시작할 때 가용성 영역을 지정하지 않더라도 현재 시스템의 상태와 용량에 따라 가용성 영역이 자동으로 선택된다.

탄력적 IP 주소

EC2에서 실행되는 각 인스턴스에는 시작 시에 개인용 및 공용 IP 주소가 자동으로 할당되며, 이때 할당된 공용 IP 주소는 인터넷을 통해 인스턴스에 액세스하는 데 사용된다. 그리고 이 주소는 인스턴스를 시작할 때마다 변경된다. 동적 DNS 맵핑을 사용하여 DNS 이름을 IP 주소에 연결하는 경우에는 변경 사항이 인터넷을 통해 전파되는 데 최대 24시간이 소요될 수 있다. EC2에서는 이 문제로 인한 영향을 줄이기 위해 탄력적 IP 주소라는 개념을 도입했다. 각각의 탄력적 IP 주소는 특정 인스턴스가 아닌 사용자의 EC2 계정에 연결된 정적 IP 주소로 사용자가 명시적으로 해제하지 않는 한 사용자의 계정에 영구적으로 연결되어 있다.

인스턴스 간에 탄력적 IP 주소를 다시 맵핑할 수도 있다. 이 방법을 사용하면 다른 인스턴스를 시작한 후 다시 맵핑하여(또는 기존 인스턴스를 사용하여) 인스턴스 장애에 신속하게 대응할 수 있다. 단일 인스턴스와 탄력적 IP 주소는 일대일로만 맵핑할 수 있다.

EBS(Elastic Block Store)

EBS는 Amazon에서 만든 새로운 형식의 영구적 스토리지로 이를 통해 사용자는 볼륨을 만들어서 실행 중인 인스턴스에 블록 레벨 장치로 연결할 수 있다. 이러한 볼륨을 바탕으로 스냅샷을 만들 수 있으며, 나중에 스냅샷을 사용하여 볼륨을 다시 만들 수도 있다. 각 스냅샷은 특정 시점의 볼륨 상태를 나타낸다. 따라서 EBS 볼륨에 있는 인스턴스의 수명이 다한 이후에도 유지할 필요가 있는 파일과 데이터를 쉽게 저장할 수 있으며 나중에 해당 볼륨을 원하는 인스턴스에 간편하게 다시 연결할 수 있다.

단, 각 EBS 볼륨은 한 번에 한 인스턴스에만 연결할 수 있다는 제한이 있다. 그러나 단일 인스턴스에는 각기 다른 볼륨을 무제한으로 연결할 수 있다. 각 EBS 볼륨은 가용성 영역에 위치하며 연결된다. 볼륨을 연결할 대상 인스턴스는 동일한 가용성 영역에 있어야 한다. EBS 볼륨은 계정당 20개로 제한되지만 더 많은 볼륨을 사용해야 하는 경우에는 Amazon Web Services에 볼륨 수를 늘려달라고 요청할 수 있다.

가격

EC2 요금은 다음 4가지 기준에 따라 계산된다.

  • 사용된 인스턴스 유형. 두 가지 표준 인스턴스 유형이 있으며, 유형별로 코어의 수, 메모리 및 스토리지 용량, 아키텍처 등이 다르게 구성되어 있다.
    표준
    대부분의 애플리케이션에 사용할 수 있는 일반적인 인스턴스
    고성능 CPU
    높은 프로세서 성능이 필요한 계산 집약적 애플리케이션에 적합한 인스턴스

    표 1에서는 S(Small)부터 L(Large)까지의 인스턴스 유형에 대한 가격의 예를 보여 준다.

    표 1. 인스턴스 유형별 가격 

    유형세부 사항비용
    표준 S(Small)1.7GB 메모리, 1ECU, 160GB 스토리지, 32비트 플랫폼인스턴스 시간당 0.10달러
    표준 L(Large)7.5GB 메모리, 4ECU, 850GB 스토리지, 64비트 플랫폼인스턴스 시간당 0.40달러
    표준 XL(eXtra Large)15GB 메모리, 8ECU, 1,690GB 스토리지, 64비트 플랫폼인스턴스 시간당 0.80달러
    고성능 CPU M(Medium)1.7GB 메모리, 5ECU, 35GB 스토리지, 32비트 플랫폼인스턴스 시간당 0.20달러
    고성능 CPU XL(eXtra Large)7GB 메모리, 20ECU, 1,690GB 스토리지, 32비트 플랫폼인스턴스 시간당 0.80달러


  • EC2를 통해 송수신된 데이터 또는 대역폭의 용량. 미국 내 EC2, SimpleDB 및 S3 버켓 사이에 전송된 데이터에는 비용이 부과되지 않는다. EC2와 유럽 S3 버켓 사이에 전송된 데이터에는 표준 데이터 전송 요금이 부과된다. 표 2. 데이터 전송 가격 

    전송 유형비용
    인터넷 데이터 전송0.100달러/GB — 모든 수신 데이터

    0.170달러/GB — 월간 송신 데이터 중 최초 10TB 
    0.130달러/GB — 월간 송신 데이터 중 이후 40TB 
    0.110달러/GB — 월간 송신 데이터 중 이후 100TB 
    0.100달러/GB — 월간 송신 데이터 중 150TB를 초과하는 용량
    가용성 데이터 영역 전송0.00달러/GB — 동일한 데이터 영역에 있는 인스턴스 간에 전송되는 모든 데이터

    0.01달러/GB — 같은 지역에 속한 다른 데이터 영역에 있는 인스턴스 간에 전송되는 모든 데이터
    공용 및 탄력적 IP 데이터 전송0.01달러/GB — 송수신되는 모든 데이터
    개인용 IP 데이터 전송0.00달러/GB — 송수신되는 모든 데이터 


  • EBS 볼륨 및 스냅숏에 사용된 스토리지. 표 3. EBS 가격 

    유형비용
    EBS 볼륨0.10달러/GB(월)

    I/O 요청 백만 개당 0.10달러
    EBS 스냅샷0.15달러/GB(월)

    스냅샷을 저장하는 PUT 요청 1,000개당 0.01달러

    스냅샷을 로드하는 GET 요청 10,000개당 0.01달러


  • 할당된 탄력적 IP 주소 중 사용하지 않는 IP 주소 수. 표 4. 탄력적 IP 주소 가격 

    유형비용
    탄력적 IP사용 중인 탄력적 IP 주소의 경우 무료 

    전체 시간 동안 연결되지 않은 탄력적 IP 주소당 0.01달러

    탄력적 IP 주소 재맵핑당 0.00달러 — 처음 100개의 재맵핑/월
    탄력적 IP 주소 재맵핑당 0.10달러 — 100개 이후의 추가 재맵핑/월


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

EC2 시작하기

EC2를 시작하려면 먼저 Amazon Web Services 계정을 만들어야 한다. Amazon Web Services 계정을 만드는 방법에 대한 자세한 설명은 이 시리즈의 Part 2에서 볼 수 있다. 계정을 만든 후에는 다음 단계를 수행하여 계정에 대한 Amazon EC2 서비스를 활성화해야 한다.

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

모든 Amazon Web Services 통신은 SOAP 인터페이스 또는 쿼리/REST 인터페이스를 통해서 이루어진다. 이 기사에서는 쿼리/REST 인터페이스를 사용하여 EC2와 통신하므로 액세스 키를 받아야 한다. 액세스 키는 Web Services Account 정보 페이지에서 View Access Key Identifiers를 선택하여 액세스할 수 있다.

이제 Amazon Web Services를 사용할 준비가 완료되었으며 EC2 서비스를 사용할 수 있게 되었다.

EC2와 상호 작용하기

이 예제에서는 Amazon에서 제공하는 명령행 도구와 오픈 소스 써드파티 Ruby 라이브러리인 right_aws를 사용하여 EC2와 상호 작용한다. 이 기사에서 수행할 전체 작업은 다음과 같다.

  • 로컬 EC2 개발 환경 설정하기
  • 기존 AMI 실행하기
  • right_aws 라이브러리와 기타 필수 소프트웨어를 설치하도록 AMI 사용자 정의하기
  • AMI를 재번들링하여 S3에 업로드한 후 등록하기
  • 사용자 정의된 새 AMI 실행하기
  • Ruby 쉘에서 간단한 코드를 실행하여 right_aws API 익히기

로컬 EC2 개발 환경 설정하기

Amazon EC2 도구를 사용하려면 Java™ 기술이 설치되어 있어야 한다.

  1. Amazon EC2 AMI Tools과 Amazon EC2 API Tools을 다운로드한다.
  2. 도구 아카이브를 원하는 디렉토리에 압축 풀기한다.
  3. 일부 환경 변수를 설정하고 명령행에서 실행할 때 찾을 수 있도록 도구 디렉토리를 쉘 경로에 추가해야 한다. Listing 1에서는 해당 예제를 보여 준다.

    이 예제에서는 Linux용 명령을 사용하고 있으므로 Microsoft® Windows®를 사용하는 경우에는 해당 명령으로 대체해야 한다. 사용자의 계정 정보 페이지에서 EC2 X.509 인증서와 EC2 개인 키 파일을 다운로드할 수 있다.



    Listing 1. EC2 개발 환경 설정하기
    $ export EC2_HOME=path_to_the_directory_with_the_tools
    
    $ export JAVA_HOME=path_to_the_directory_with_your_java_sdk
    
    # Add the directory to your PATH
    $ export PATH=$PATH:$EC2_HOME/bin
    
    # Export variables with the paths to your private key file and X.509 certificate
    $ export EC2_PRIVATE_KEY=path_to_your_private_key 
    $ export EC2_CERT=path_to_your_x509_certificate
    

  4. 다음 명령을 통해 EC2 명령행 도구의 버전을 표시하여 모든 설정이 올바르게 지정되었는지 확인한다. 

    Listing 2. 설정 확인하기
    $ ec2-ami-tools-version
    1.3-20041 20071010
                

  5. 명령행 쉘에서 인스턴스를 실행한 다음 연결할 때 사용할 SSH 키 쌍을 만들어야 한다. Listing 3의 명령을 실행하면 새 키 쌍이 만들어진 후 키 쌍의 이름, 해당 지문 및 개인 키 데이터가 화면에 표시된다. 

    Listing 3. 새 SSH 키 쌍 만들기
    $ ec2-add-keypair devworks
     
    KEYPAIR devworks        29:d1:90:7b:3d:a4:99:52:41:e0:1f:21:d5:20:97:d3:f0:33:fd:76
    -----BEGIN RSA PRIVATE KEY-----
    MIIEowIBAAKCAQEAyxaeXt6nb+qzboVW/3ax7An8CUJjDqwNi/PZm4lGOAzOHGnuPlDXeh1GpJ9f
    hky7Bg6VEY2VfS5G6UtmIzsGf/JlquzVl/x3uyriOzeCIw+m07aSgUOBn3qW/74IZxYYkxCYdBci
    eZeKpr8Mpvuz2sfurRzQOkUeHyuEaiD1RRS7DGxxUXfpVYhGjPltfNW2xRSMLTaOZzRwRdS0cHUU
    hC+GOKFDkp8nqQpd8iGUtp2G2DI1pxRN4MbeFZHWMh5tcIo1NTc7pkFPGEwrq6pO6gIsEOLqGpTL
    +2AxJY5WToZQoTWieOVwLpjJU9fnufRs0Mt/M/TP6SGK/YkrQOprOwIDAQABAoIBAFj1UGvX9dnl
    IbHAwInoUSlGelsH9GIB5XEvYFtr9xEoMsRpdk1flfNMjZwgn3Qxeh6+Fnf438lUkwUv3M6D1WYI
    JJaJZUpM8ZlPwIcV2nBHM9k6+NOcYVQdG7VsZTvahusscssvMw+13KsLtpwSVwb3WsoDfAZ6LiaT
    Jk5in20hTiipC0pz0K9DgQ//76r20ysUFpCymj4EvQrRkk5kBtsiMixsJzimpUOrSmrRHcORKEin
    FKM6y/DFE33zhP8BNDQRaDLGni0Ip+/jP3EHmia41SSbnwzRcbXMfH5fL3KAyRsCE0ocHY+cjUng
    HPYxl1ffdLZuEW3wJDQFuTS/v4ECgYEA9r7HVVnrS2303zclzCTGen/W/SVbpflSKEYJOZpa8RtQ
    uFMOewfkTbBzfavLMVBYB8uAmcWIz5JAFSzlBaKDRCnouUeeDiDJVJd8Asbn1gCE8UVETUOthy50
    R90RTtPNMmyP7AnoSMTuzsbwVORus7IJvceWHQBB4KCh652UansCgYEA0rSmvdquidkXf5iFpebc
    6Wh/qy+L1dkgz7+HTZIMW7kxA4EfJFnqaQRPqJ5XYcLvk2IzxNQKJlZvtBhCfVYhPJ2uB2Yqxv0p
    0LXGC01fZSyhbYGfaxVymA3HMc2ULBbaFMyhO7l7zkz+G+qkylych59zJBSoUxSFStpgNL7NhkEC
    gYAPJIorLMeJ64eZo1LIgoFDx1C0XHSRbQmjuxiZ1mU6YsjDZyV+W2+hbPDJh5+CuUGNyOlthnfs
    9TbFlenAPMb9iezkYgbLKyvv6xQLP5W+xm1iOTQF4d9mam1sc566TblMHOmAPONqg9t8CS16qEI6
    +PQsF3GY+gkQ9gq54QPYvQKBgDgwjsrQd30xVI/lV7a/Uyg3gtxe6JaVuadNN0LbcMpBH64EkA58
    oANzb97SoxDiEEuog4+40CAbKtzHH2wXPPPSROeaOkwolS8gWnkHICp19XKjf6Tp6k5cVkOUxC/h
    xDSJwXGQ7FA+vgEp2NpSSjfssKLtk1ncfhNRGxjVzS9BAoGBALbBLS4Nbjs2Fco+okNQPNfJNSvW
    yWV7a6ngfRzW8B+BO6V1QRIR44bwv/Z74oQ7ttt8KoZENB5yzZwaVWpFlOjSO/4Nx++Ef4pY5aPS
    zNpXcXCZgUdA67qmOILvrG7bnDR60dcBZVBl7CjnpTlccg7MD4CBsFJx+hGRPD2yIV94
    -----END RSA PRIVATE KEY-----
    

  6. -----BEGIN RSA PRIVATE KEY-----로 시작하는 출력 부분을 로컬 파일에 저장한다. 이 파일은 인스턴스를 실행하고 SSH를 통해 인스턴스에 액세스할 때 개인 키로 사용된다. 따라서 이 파일은 누출되지 않도록 안전하게 관리해야 한다. 이 키를 사용하여 인스턴스를 실행한 후 나중에 키를 분실하게 되면 더 이상 쉘을 통해 인스턴스에 액세스할 수 없게 된다. 키 파일의 이름을 pk-devworks로 지정한 후 다음과 같이 파일에 대한 권한을 수정하여 보안을 강화한다. 

    Listing 4. 개인 키에 대한 권한 변경하기
    $ chmod 600 pk-devworks
    

이제 개발 환경이 설정되었다.

첫 번째 인스턴스 실행하기

이제 RightScale에서 제공하는 CentOS 기반의 공용 이미지 중 하나를 사용하여 첫 인스턴스를 실행한다. 이 이미지의 AMI ID는 ami-d8a347b1이다.


Listing 5. 인스턴스 실행하기
$ ec2-run-instances –k devworks -n 1 ami-d8a347b1

RESERVATION     r-2691404f      710193521658    default
INSTANCE        i-7f923516      ami-d8a347b1                    pending 
devworks        0               m1.small        2008-09-07T18:05:34+0000
us-east-1c      aki-9b00e5f2

새로 실행되는 인스턴스는 항상 보류 중 상태로 설정된다. 이 인스턴스는 현재 시동 중이므로 아직 사용할 수 없다. 이 상태에서는 인스턴스에 대한 다음과 같은 세부 사항을 볼 수 있다.

  • 시작 시간 — 이 인스턴스의 시작 시간이 UTC로 표시된다.
  • 인스턴스 유형 — 시작할 때 인스턴스의 유형을 지정하지 않았으므로 기본 m1.small 인스턴스가 자동으로 선택된다.
  • 가용성 영역 — 시작할 때 가용성 영역을 지정하지 않았으므로 현재 시스템 상태와 가용성에 따라 자동으로 가용성 영역이 선택된다.
  • 커널 — 이 인스턴스에서 사용하는 Linux 커널도 표시된다. 시작할 때 커널을 지정하거나 기본적으로 사용할 커널을 AMI에 미리 구성해 놓을 수 있다.
  • 보안 그룹 — 이 인스턴스는 기본 보안 그룹에 배치되었다. 고유한 보안 그룹을 작성하고 액세스 권한을 부여한 후 이러한 그룹에 인스턴스를 배치할 수 있다. 시작할 때 보안 그룹을 지정해야 한다. 인스턴스가 시작된 후에는 그룹 이름을 변경할 수 없지만 그룹에 대한 권한은 변경할 수 있다.

이제 실행 중인 인스턴스를 표시하여 인스턴스의 현재 상태를 확인할 수 있다.


Listing 6. 인스턴스 표시하기
$ ec2-describe-instances

RESERVATION     r-2691404f      710193521658    default
INSTANCE        i-7f923516      ami-d8a347b1    ec2-67-202-28-68.compute-1.amazonaws.com
domU-12-31-38-00-34-C8.compute-1.internal       running devworks        0
m1.small   2008-09-07T18:05:34+0000        us-east-1c      aki-9b00e5f

인스턴스가 실행 중임을 확인할 수 있으며 다음과 같은 세부 사항도 볼 수 있다.

  • 공용 DNS 이름 — 인터넷을 통해 이 인스턴스에 연결하는 데 사용할 수 있는 DNS 이름
  • 개인용 DNS 이름 — Amazon 데이터 센터 환경에 있는 EC2의 로컬 네트워크 내에서 이 인스턴스를 확인하는 데 사용되는 DNS 이름

SSH를 통해 첫 번째 인스턴스에 연결하기

이제 인스턴스에 대한 개인용 키와 공용 DNS 이름을 사용하여 SSH를 통해 인스턴스에 연결할 수 있다.


Listing 7. SSH를 통해 인스턴스에 연결하기
$ ssh -i pk-devworks root@ec2-67-202-28-68.compute-1.amazonaws.com

The authenticity of host 'ec2-67-202-28-68.compute-1.amazonaws.com (10.252.59.54)' 
can't be established.
RSA key fingerprint is ae:e5:00:54:75:65:1c:c5:44:53:72:b9:e0:b5:26:a9.
Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added 'ec2-67-202-28-68.compute-1.amazonaws.com,10.252.59.54'
(RSA) to the 
list of known hosts.


[root@domU-12-31-38-00-34-C8:~]

위에서 로그인한 후 오류 메시지가 표시되더라도 심각한 문제가 아니므로 무시해도 된다. 시동 후 AMI에서 몇 가지 사용자 정의 RightScale 스크립트가 실행되지만 여기에서는 설명하지 않는다.

인스턴스 사용자 정의 및 재번들링하기

매우 다양한 기능을 갖추고 있는 RightScale AMI는 기본 이미지로 사용하는 데 필요한 모든 기능을 제공한다. directory/home/ec2에 설치되는 EC2 명령행 도구도 포함되어 있다.

  1. 보안 인증서를 추가한다. 이러한 파일은 Listing 1에서 사용한 파일과 같다. 

    Listing 8. 인증서를 인스턴스에 복사하기
    $ scp -i pk-devworks path_to_your_private_key_cert 
    root@ec2-67-202-28-68.compute-1.amazonaws.com:/home/ec2/
    
    $ scp -i pk-devworks path_to_your_x509_cert 
    root@ec2-67-202-28-68.compute-1.amazonaws.com:/home/ec2/
               

  2. 이 이미지를 개인용 EC2 이미지로 사용할 수 있도록 환경 변수를 설정한다. /etc/profile.d/env.sh 파일을 열고 각 변수를 설정한다. 계정 정보와 액세스 키는 Web services account information에서 확인할 수 있으며 인증서와 개인용 키는 위 단계에서 인스턴스에 복사해 놓은 파일이다. 

    Listing 9. 인스턴스 환경 사용자 정의하기
    $ vim /etc/profile.d/env.sh
    
    export EC2_HOME=/home/ec2
    export EC2_CERT=
    export EC2_PRIVATE_KEY=
    export AWS_ACCOUNT_NUMBER=
    export AWS_ACCESS_KEY_ID=
    export AWS_SECRET_ACCESS_KEY=
    export PATH=$PATH:/home/ec2/bin/
    
    # Turn off the rightscripts so you don’t get the error on login.
    $ chkconfig --level 4 rightscale off
    
    # Change the login message
    $ echo “Welcome to my devworks test EC2 image” > /etc/motd
                

  3. 이 이미지에 Ruby가 이미 설치되어 있기는 하지만 이 기사에서 나중에 EC2와 상호 작용하는 데 사용할 Ruby 라이브러리를 설치해야 한다. 먼저 설치된 gem을 업데이트한 다음 right_aws gem과 기타 필요한 종속 파일을 설치한다. 

    Listing 10. Ruby gem 설치하기
    $ gem update
    $ gem install right_aws
                

  4. 이제 이 인스턴스를 재번들링하여 S3에 업로드한 후 EC2에 등록할 준비가 완료되었다. 먼저 인스턴스를 devworks-ec2라는 이름으로 재번들링한다. 이때 /mnt 및 /tmp 폴더는 무시한다. EC2 개인용 키, EC2 보안 인증서 및 Amazon Web Services 계정 번호도 지정해야 한다. 

    Listing 11. 인스턴스 재번들링하기
    $  ec2-bundle-vol -d /mnt -c /home/ec2/your_ec2_x509_cert  
    -k /home/ec2/your_ec2_private_key -u your_aws_account_number 
    -e /mnt,/tmp -s 10240 -r i386 -p devworks-ec2
                

  5. 재번들링 프로세스가 완료되면 /mnt 디렉토리에 여러 파일이 만들어진다. 다음 예제에서는 새로 생성된 AMI의 구성 요소인 이들 파일을 S3에 업로드한다. 이미지는 사용자가 지정한 버켓에 배치된다. 아래 명령에서 –b 매개변수의 값에 이미지 파일을 저장할 S3에 있는 버켓의 이름을 지정한다. 

    Listing 12. S3에 이미지 업로드하기 
    $ ec2-upload-bundle -b your_s3_bucket -m /mnt/devworks-ec2.manifest.xml 
    -a your_aws_access_key -s your_aws_secret_key
               

  6. 이제 AMI가 S3에 안전하게 저장되었다. 이제 남은 작업은 나중에 이미지를 실행할 때 사용할 AMI ID를 받기 위해 AMI를 EC2에 등록하는 것이다. 

    Listing 13. EC2에 이미지 등록하기
    $ ec2-register -K /home/ec2/your_ec2_private_key 
    -C /home/ec2/your_ec2_x509_cert your_s3_bucket/devworks-ec2.manifest.xml
    
    IMAGE   ami-58c42031
                

  7. SSH 세션을 끝내고 실행 중인 인스턴스를 종료한다. 

    Listing 14. 인스턴스 종료하기
    $ ec2-terminate-instances i-7f923516
    INSTANCE        i-7f923516      running shutting-down
    

다음 섹션에서는 새로 생성된 AMI의 새 인스턴스를 실행하게 되며 이 기사의 나머지 부분에서는 이 인스턴스에서 right_aws 라이브러리를 사용하여 EC2를 탐색한다.

Ruby로 EC2 탐색하기

RightScale에서 제공하는 Ruby 라이브러리인 right_aws는 Ruby를 통해 Amazon의 EC2 서비스에 액세스할 수 있는 기능을 제공한다. 엄격한 테스트를 거친 이 라이브러리는 자체 제품에서 사용되고 있으며 최근에 소개된 EBS를 포함한 EC2의 모든 서비스에 액세스할 수 있다. 이 라이브러리는 강력한 재시도 및 오류 처리 기능을 제공하는 HTTP 라이브러리인 RightScale:HttpConnection과 함께 rubygem으로 패키징되어 있다. 이 기사에서는 이 라이브러리에서 제공하는 EC2의 기능 중 일부에 대해서만 설명한다. 라이브러리와 함께 제공되는 문서를 검토하여 API에 대한 종합적인 이해도를 높일 수 있다. right_aws 라이브러리와 이를 지원하는 right_http_connection 라이브러리에 대한 다양한 구성 옵션도 검토하자.

이 기사에서는 EC2 통신을 위한 기본 인터페이스를 제공하는 Rightscale::Ec2 클래스를 사용한다. 이 Ruby 라이브러리는 보통 irb 콘솔에서 사용된다. 이후 예제에서는 Rightscale::Ec2 오브젝트에 메시지를 보낸 후 EC2에서 리턴한 응답을 확인하는 방식으로 진행되므로 EC2 개념을 살펴보면서 API에 익숙해질 수 있다.

  1. 새 AMI의 인스턴스를 실행한다. 인스턴스가 실행 중 상태에 도달하면 SSH를 통해 인스턴스에 연결한다. 연결이 완료된 후에는 인스턴스 내에서 irb 콘솔을 사용한다. 

    Listing 15. 새 인스턴스를 실행하고 SSH를 통해 연결하기
    $ ec2-run-instances -k devworks -n 1 ami-58c42031
    
    RESERVATION     r-5795443e      710193521658    default
    INSTANCE        i-1a9e3973      ami-58c42031                    pending devworks    0
    m1.small        2008-09-07T21:06:37+0000        us-east-1c      aki-9b00e5f2
    
    $ ec2-describe-instances 
    
    RESERVATION     r-949544fd      710193521658    default
    INSTANCE        i-5a9d3a33      ami-58c42031    
    ec2-75-101-208-95.compute-1.amazonaws.com       
    domU-12-31-38-00-78-04.compute-1.internal       
    running devworks        0               m1.small   
    2008-09-07T21:14:27+0000        us-east-1c      aki-9b00e5f2
    
    $ ssh -i pk-devworks root@ec2-75-101-208-95.compute-1.amazonaws.com
              

  2. Ruby 쉘을 시작하고 Rightscale::Ec2 오브젝트를 만든다. 

    Listing 16. Ruby 쉘과 새 Rightscale::Ec2 오브젝트
    $ irb
    irb(main):001:0> require 'rubygems'
    => true
    irb(main):002:0> require 'right_aws'
    => true
    irb(main):003:0> @ec2 = Rightscale::Ec2.new(
    ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY'])
    

이제부터는 새로 만든 변수 @ec2를 사용하여 EC2를 탐색한다. 이 예제에서는 이 라이브러리의 기본 구성을 사용하고 있다. 라이브러리와 함께 제공되는 문서에서 사용 가능한 구성 옵션 목록을 볼 수 있다.

  1. 인스턴스 목록을 검색하면 해시 배열이 리턴되며, 이 배열에 있는 각 해시는 각 인스턴스에 대한 관련 정보를 제공한다. 이 라이브러리의 API 호출에서는 대부분 이러한 응답 형식을 공통적으로 사용한다. Listing 17에서는 해당 예제를 보여 준다. 

    Listing 17. 인스턴스 설명하기
    irb(main):004:0> @ec2.describe_instances()
    
    => [{:aws_launch_time=>"2008-09-07T21:14:27.000Z", :aws_kernel_id=>"aki-9b00e5f2", 
    :ssh_key_name=>"devworks", :aws_reservation_id=>"r-949544fd", 
    :aws_availability_zone=>"us-east-1c", 
    :aws_state=>"running", :aws_instance_id=>"i-5a9d3a33", :aws_groups=>["default"], 
    :aws_image_id=>"ami-58c42031", 
    :aws_product_codes=>[], :dns_name=>"ec2-75-101-208-95.compute-1.amazonaws.com", 
    :aws_state_code=>"16", 
    :private_dns_name=>"domU-12-31-38-00-78-04.compute-1.internal", 
    :aws_instance_type=>"m1.small", 
    :aws_reason=>"", :ami_launch_index=>"0"}]
               

  2. 이미지 목록을 검색한다. 

    Listing 18. 이미지 설명하기
    irb(main):005:0> @ec2.describe_images_by_owner([ENV['AWS_ACCOUNT_NUMBER']])
    
    => [{:aws_location=>"ylastic_images/devworks-ec2.manifest.xml",
     :aws_kernel_id=>"aki-9b00e5f2", :aws_state=>"available", :aws_is_public=>false,
    :aws_architecture=>"i386", :aws_id=>"ami-58c42031", :aws_image_type=>"machine"}]
                

  3. 인스턴스를 배치할 때와 인스턴스에 대한 액세스 권한을 제한 또는 부여할 때 사용할 수 있는 보안 그룹을 만든다. 

    Listing 19. 새 보안 그룹을 만들고 그룹 표시하기
    irb(main):006:0> @ec2.create_security_group("devworks", 
       "Devworks Article Security Group")
    
    => true
    
    irb(main):008:0> @ec2.describe_security_groups()
    
    => [{:aws_group_name=>"devworks", :aws_description=>"Devworks Article Security 
       Group", 
    :aws_perms=>[]}]
                

  4. 새 보안 키 쌍을 만들고 사용자 계정의 모든 키 쌍을 표시한다. 

    Listing 20. 새 보안 키 쌍을 만들고 키 쌍 표시하기
    irb(main):018:0> @ec2.create_key_pair('mykeypair')
    
    => {:aws_key_name=>"mykeypair", 
    :aws_fingerprint=>"c6:62:22:9e:99:05:6a:17:13:06:e0:86:f9:55:2a:78:ff:99:6b:fa", 
    
    :aws_material=>"-----BEGIN RSA PRIVATE KEY-----
    \nMIIEpAIBAAKCAQEAyRdAvihBXDu30o2uvQ1h8xdIRLHs0RjQWK4Yw5Y5DkaS41EEjnDwjO6sEY5l\n
    IXSuzVj1nkZ1VMPuVR3hIXHCMJLaAO77TaXZVC9yymIUAyTcQ1+hoVLlrCuVI3dEY21WQNTEbtkI\nlI
    xMW+UhkiaKrGHmt2yYLjr754KGt7pNCpRwxPXB7brlpQ3qpapkr7XrKZppvWoG8MCmPIFx8P0K\no8Cd
    mnF9lEdns6uaJZmfs4Ls9HZHpsmn0r42GbOAkJEkj7nE5zc3rXYpmCBZhjyHus0iXjS/n9oL\nHWhV0a
    wagjvmsQgJPYqEsBeO5pDb2IOZq5okQie1YJTd1m8k8k7m9wIDAQABAoIBAQCK0lWssOem\nP8fAQHVg
    J+v1wJ3wZpBhLWsvvUh1RbCvzUK8UQL/PrKh6Ga7W/0u4nmGY6J0mJmJYhWXhyATUZBI\nrih3uoOccC
    Eff/4T/y9nmDvC+zL+xtatTA0SRdTdeu6vpPLSv1uwCUbxrbXGSnszVAbNm9dXGvsq\nMK7GCYQEB4p4
    FtJolDqGZdWAj1u5/AGjbCI+PbkbCAro55Sqnl95WAlogdQFmgxljWl9TEIsbrHf\nYZHtKHlm1lvyeB
    QdVmwLT9S7ufI1J/GAevRxrG2iEkx/IJWYGnQE0P2bXa6Ry90UyvWRPS6Zi/MD\nfWoFAxnB6Ryssr+S
    IAfpG6SGuM55AoGBAOr7yPcvg/66f/Xd3CbpmI8lIfsXBb9xki3pIEfYAWD/\n2ToxpRYPTgrwwB1ufo
    NPr7U1QfzJvAvlTXWkfp4oUnssi5sXw1okZmm01hT0j0FNvsgMG6zD8Z/9\nmgrVrH+tBxVoYqrPM/WB
    dnYhQXEGQq+UF2uPqoKDbsl3DkftXTBrAoGBANsTdLfHmRidkLCRKfSj\nUrbJOSsU6RWGFuoqgD+DZL
    ngKBTaBTd6TVONSR2JvpVJo5hyiAXQ/jQ1XtsPAuJR6fiiRvDfgF7j\n1lp1tsFpNYx2R4+eqoLrHgIC
    Ak1Ke8tWyoD3NgQ4FO9TDfW+QHn0dpLeWdNMUd2a1GVKp4hIoJal\nAoGBAITqMryO5eyZ9XNPMQ3Zp+
    +gI15xoVCunu7VJOs+ZVlGnsrp9eVKdux9TU3YiDsiQdMP8ulX\n+sQHyg63It+3EyCVC8qIYHmGiV9V
    aJql0rovjbB+GNFabDwBKLbkMhRt/MnBJ75SQaOmvSkImomh\n7up9q9mtg9cbHPlcHHnW65VNAoGAKi
    +Y7jrVVFQjJJ0PgzhgGSqug4lHSQnFJ9p/T7uxjcmIblt9\nXa2Dbm9qgPGhbYX8psKHRvdzvAH6/hvp
    5kL31xUIrCGdyqf9AvZf9uaXlTDBnvpiw0sbQC+62b9a\nD1HrNOJl2HIkNeG8cnHsYI+etbFzgqjTqu
    TBua+iiy/RHLECgYALIDqaAcd7o4V+ws+WG1G9vTlc\nJ6/sBpu3JyKMSdJYlbgIbvHgrfbKhEYuNh/H
    XNdrI6oeW9eAruqHlH+OlUx0tCg4VIeQsz/b7kPS\nY14OMAswuHHyqlZIqK4Xy/R6SQmsc/CUXWPk5I
    UesJk5f1V1NXIqqwv6+nlEucdjgYUd5w==\n-----END RSA PRIVATE KEY-----"}
    
    
    irb(main):020:0> @ec2.describe_key_pairs()
    
    => [{:aws_key_name=>"mykeypair",
    :aws_fingerprint=>"c6:62:22:9e:99:05:6a:17:13:06:e0:86:f9:55:2a:78:ff:99:6b:fa"}]
                

  5. 새 EBS 볼륨을 만든다. 이 볼륨의 가용성 영역을 us-east-1c로 지정한다. 이 볼륨을 만든 후 사용할 수 있게 되면 같은 가용성 영역에서 실행 중인 인스턴스에만 이 볼륨을 연결할 수 있다. 이 볼륨의 초기 상태는 "생성 중" 상태이다. 프로세스가 완료되면 "사용 가능한" 볼륨이 된다. 

    Listing 21. 새 EBS 볼륨을 만들고 볼륨 표시하기
    irb(main):024:0> @ec2.create_volume('', 1, 'us-east-1c')
    
    => {:aws_status=>"creating", :aws_created_at=>Mon Sep 08 00:29:35 UTC 2008, 
    :zone=>"us-east-1c", :aws_size=>1, :snapshot_id=>nil, :aws_id=>"vol-2f34d146"}
    
    irb(main):026:0> @ec2.describe_volumes()
    
    => {:aws_status=>"available", :aws_created_at=>Mon Sep 08 00:29:35 UTC 2008, 
    :zone=>"us-east-1c", :aws_size=>1, :snapshot_id=>nil, :aws_id=>"vol-2f34d146"}
                

  6. 이 볼륨을 현재 인스턴스에 블록 장치 /dev/sdj로 연결한 후 실제로 사용할 수 있도록 ext3 파일 시스템 형식으로 지정한다. 

    Listing 22. 새 EBS 볼륨을 연결하고 파일 시스템 만들기
    irb(main):031:0> @ec2.attach_volume('vol-2f34d146', 'i-5a9d3a33', '/dev/sdj')
    
    => {:aws_instance_id=>"i-5a9d3a33", :aws_device=>"/dev/sdj", 
    :aws_attachment_status=>"attaching", :aws_id=>"vol-2f34d146", 
    :aws_attached_at=>Mon Sep 08 00:34:03 UTC 2008}
    
    
    $ mkfs.ext3 /dev/sdj
    mke2fs 1.39 (29-May-2006)
    /dev/sdj is entire device, not just one partition!
    Proceed anyway? (y,n) y   
    Filesystem label=
    OS type: Linux
    Block size=4096 (log=2)
    Fragment size=4096 (log=2)
    131072 inodes, 262144 blocks
    13107 blocks (5.00%) reserved for the super user
    First data block=0
    Maximum filesystem blocks=268435456
    8 block groups
    32768 blocks per group, 32768 fragments per group
    16384 inodes per group
    Superblock backups stored on blocks: 
            32768, 98304, 163840, 229376
    
    Writing inode tables: done                            
    Creating journal (8192 blocks): done
    Writing superblocks and filesystem accounting information: done
    
    This filesystem will be automatically checked every 39 mounts or
    180 days, whichever comes first.  Use tune2fs -c or -i to override.
                

  7. 새로 포맷한 블록 장치를 파일 시스템 폴더에 마운트한다. 

    Listing 23. 로컬 디렉토리에 볼륨을 마운트하고 사용하기
    $ mount /dev/sdj /mnt/my-vol
    
    $ echo “Hello Devworks” > /mnt/my-vol/test.txt
    
    # cat /mnt/my-vol/test.txt
    
    Hello Devworks
    

이제 이 EBS 볼륨을 시스템의 다른 블록 장치와 동일한 방식으로 사용할 수 있다. 즉, 볼륨에서 읽기 및 쓰기 작업을 수행할 수 있다. 볼륨 사용을 완료한 후에는 볼륨을 실행 중인 인스턴스에서 분리할 수 있으며, 나중에 언제라도 동일한 인스턴스나 다른 인스턴스에 다시 연결할 수 있다. 이 볼륨은 EC2의 유효성 수준을 획기적으로 높여준 지속적 스토리지이다. 이 자산은 다양한 방법으로 활용할 수 있다. 예를 들어, 인스턴스의 수명보다 오랫동안 유지되어야 하는 웹 서버 로그에 대한 중요 데이터베이스 데이터를 저장하는 경우 유용하게 사용할 수 있다.

EBS 볼륨의 스냅샷을 만들어서 특정 시점의 볼륨 컨텐츠를 관리할 수 있다. 스냅샷은 자동으로 S3에 저장되며 EC2에 의해 누적되는 방식으로 만들어진다. 볼륨의 첫 번째 스냅샷에는 전체 사본이 포함되지만 이후 스냅샷에는 변경된 부분만 저장된다. 현재는 Amazon Web Services 계정당 500개의 스냅샷만 허용되며 500개 이상이 필요한 경우에는 계정 제한을 늘려달라고 요청할 수 있다.


Listing 24. EBS 볼륨의 스냅샷 만들기
irb(main):007:0> @ec2.create_snapshot('vol-2f34d146')

=> {:aws_status=>"pending", :aws_volume_id=>"vol-2f34d146", 
:aws_started_at=>Mon Sep 08 00:49:15 UTC 2008, :aws_progress=>"", 
:aws_id=>"snap-13db3c7a"}

스냅샷은 EC2에서 백그라운드로 만들어진다. 모든 스냅샷을 주기적으로 표시하여 스냅샷이 성공적으로 만들어졌는지 확인할 수 있다.


Listing 25. EBS 스냅샷 표시하기
irb(main):008:0> @ec2.describe_snapshots()

=> [{:aws_status=>"completed", :aws_volume_id=>"vol-2f34d146", 
:aws_started_at=>Mon Sep 08 00:49:15 UTC 2008, :aws_progress=>"100%", 
:aws_id=>"snap-13db3c7a"}]

마지막으로 볼륨을 인스턴스에서 분리할 수 있다. 나중에 볼륨을 동일한 인스턴스나 다른 인스턴스에 다시 연결할 수 있다.


Listing 26. EBS 볼륨 분리하기
irb(main):006:0> @ec2.detach_volume('vol-2f34d146')

=> {:aws_instance_id=>"i-5a9d3a33", :aws_device=>"/dev/sdj", 
:aws_attachment_status=>"detaching", :aws_id=>"vol-2f34d146", 
:aws_attached_at=>Mon Sep 08 00:34:03 UTC 2008}

결론

이 기사에서는 Amazon의 EC2 서비스를 소개하고 기본 개념에 대해 설명했다. EC2와 상호 작용하는 데 사용할 수 있는 오픈 소스 Ruby 라이브러리인right_aws의 일부 기능도 살펴보았다. 많은 내용을 다루기는 했지만 EC2는 방대하고 복잡한 주제이므로 Amazon EC2 Developer Guide에서 더 많은 정보를 살펴보기를 권한다.

이 "Amazon Web Services를 사용한 클라우드 컴퓨팅" 시리즈의 Part 4에서는 클라우드에서 신뢰할 수 있는 메시징 기능을 제공하는 Amazon SQS(Simple Queue Service)에 대해 설명한다.


----

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

Prabhakar Chaganti, CTO, Ylastic, LLC

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

이 연재 자세히 보기

원문 게재일:  2009 년 2 월 10 일 
번역 게재일:   2009 년 4 월 21 일 
난이도:  초급 
영어로:  보기 
페이지뷰: 2372 회 
의견: 0 (의견 추가)

1 star2 stars3 stars4 stars5 stars 평균 평가 등급 (총 7표)

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에 대한 동등 비교를 정의한다. 각 조건부는 개별적으로 평가된 후 항목 이름 세트를 생성한다. union 및 intersection과 같은 세트 연산을 사용하여 여러 조건부를 결합해서 복잡한 쿼리를 작성할 수 있다.

쿼리에 조건부를 사용할 경우에는 모든 조건부 비교가 사전순으로 수행된다는 점을 고려해야 한다. 적절한 문자열 표현을 사용하여 데이터가 속성에 저장되어 있는지 확인해야 한다. 쿼리 실행 시간이 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의 일부 기능을 살펴보았다.



List of Articles
번호 제목 글쓴이 날짜 조회 수
47 “개발자라면 즉시 설치!” 크롬 확장 프로그램 10가지 WindBoy 2015-03-23 104
46 Dell의 교육용 크롬북 11 “거칠게 뛰노는 아이들을 위한 튼튼한 노트북" WindBoy 2015-02-24 97
45 클라우드에서 동작하는 빅 데이터 애널리틱스 ‘조이엔트 만타’ WindBoy 2013-06-29 1549
44 무료 아마존 웹 서비스, 100% 알뜰하게 사용하는 방법 WindBoy 2013-04-14 2956
43 고해상도 크롬북의 사향 WindBoy 2013-02-24 2273
42 3년차 N드라이브, 네이버 촘촘히 엮었네 [1] WindBoy 2013-01-24 2889
41 클라우스 보안 WindBoy 2012-12-10 2357
40 뜬구름 같던 클라우드를 KT에서 현실화 하고 있네 WindBoy 2012-10-15 2357
39 오라클 “늦게 배운 클라우드, 자신 있다” WindBoy 2012-07-24 2478
38 국정원과 방통위의 황당한 클라우드 이야기 WindBoy 2012-07-04 2480
37 코앞에 다가온 웹하드 등록제, 알고 있나요 WindBoy 2012-05-02 2777
36 아마존 클라우드에 대한 오해 5가지 WindBoy 2012-04-25 2848
35 아마존이 말하는 클라우드의 5대 조건 WindBoy 2012-04-25 2976
34 간단하게 알아본 클라우드로 스마트한 문서관리, 하나도 어렵지 않아요~ WindBoy 2012-02-20 5261
33 최적의 클라우드 컴퓨팅 플랫폼 찾기 WindBoy 2012-01-06 2963
32 클라우드 컴퓨팅 – 비즈니스 전략에 큰 영향을 미치는 플랫폼 WindBoy 2012-01-06 3030
» Amazon Web Services를 사용한 클라우드 컴퓨팅 Part 1~5 WindBoy 2012-01-06 3801
30 Amazon 클라우드에 Linux 애플리케이션 마이그레이션하기 WindBoy 2012-01-06 5305
29 Cultured Perl: Amazon S3의 스토리지 관리 WindBoy 2012-01-06 3939
28 Cultured Perl: Perl and the Amazon cloud Part1~5 WindBoy 2012-01-06 6337