 |
|
난이도 : 초급 Prabhakar Chaganti, CTO, Ylastic, LLC
원문 게재일 : 2008 년 8 월 19 일 번역 게재일 : 2009 년 3 월 31 일 기본적인 Amazon SDB(SimpleDB) 개념에 대해 알아보고 SDB와 상호 작용하기
위한 오픈 소스 Python 라이브러리인 boto에서 제공하는 일부 기능을 살펴보십시오. 이 "Amazon
Web Services를 사용한 클라우드 컴퓨팅" 시리즈에서는 Amazon Web Services를 사용한 클라우드
컴퓨팅에 대해 설명합니다. 신뢰할 수 있으며 확장 가능한 애플리케이션을 만들고 빌드할 수 있는
Amazon Web Services의 뛰어난 기능을 살펴보십시오. 이 기사에서는 Amazon S3(Simple Storage
Service)에서 제공하는 확장성과 응답성이 뛰어난 서비스에 대해 설명합니다. S3와 통신하는 데
사용되는 도구에 대해 알아보고 코드 샘플을 사용하여 간단한 쉘을 실습해 볼 수 있습니다.
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 서비스를 활성화해야 한다.
-
사용자의 Amazon Web Services 계정에 로그인한다.
- S3 홈 페이지로 이동한다.
- 페이지 오른쪽에 있는 Sign Up For This Web Service를 클릭한다.
- 요청된 정보를 제공하고 등록 프로세스를 완료한다.
이 기사의 예제에서는 쿼리/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 계정에 대한 액세스를 고객에게 제공할 수 있다.
이러한
GUI 애플리케이션 중 하나를 S3와 상호 작용하는 데 사용할 수 있기는 하지만 S3와 통신하는
애플리케이션을 개발해야 하는 경우에는 크게 도움이 되지 않는다. 이 기사에서 사용하는 전체
소스 코드를 압축된 아카이브로 다운로드할 수 있으며, 이 아카이브에는
사용자의 작업 공간에 반입해서 바로 사용할 수 있는 Netbeans 프로젝트가 포함되어 있다.
S3에 연결하기
JetS3t에는 REST 또는 SOAP와 같은 특정 인터페이스를 구현한 클래스를 사용하여
확장해야 하는 org.jets3t.service.S3Service라는 추상 클래스가
있다. JetS3t는 S3에 연결하고 상호 작용하는 데 사용할 수 있는 다음 두 가지 구현을 제공한다.
-
org.jets3t.service.impl.rest.httpclient.RestS3Service는 REST 인터페이스를 통해 S3와 통신한다.
-
org.jets3t.service.impl.soap.axis.SoapS3Service는 Apache Axis 1.4를 사용하는 SOAP 인터페이스를 통해 S3와 통신한다.
JetS3t에서는 jets3t.properties 파일을 사용하여 S3와 통신하는 중에 사용되는
다양한 매개변수를 구성한다. 이 기사의 예제에서는 툴킷과 함께 제공되는 기본 jets3t.properties
파일을 사용한다. 매개변수에 대한 자세한 설명은 JetS3t Configuration
Guide에서 볼 수 있다.
이 기사에서는 RestS3Service를 사용하여 S3에 연결한다. Amazon Web Services
액세스 키를 AWSCredentials 오브젝트 형식으로 제공하여 새 RestS3Service
오브젝트를 만들 수 있다. 이 기사에서 설명하는 코드는 API를 보여 주기 위한 것일 뿐이므로 각
코드를 실행하려면 필요한 클래스를 모두 가져와야 한다. 다운로드 패키지에
있는 소스에서 필요한 클래스를 확인할 수 있다. 제공된 Netbeans 프로젝트를 작업 공간으로 가져오면
더욱 쉽게 전체 소스 코드에 액세스할 수 있다.
Listing 1. 새 RestS3Service 만들기
String awsAccessKey = ”Your AWS access key”;
String awsSecretKey = “Your AWS Secret key”;
// use your AWS keys to create a credentials object
AWSCredentials awsCredentials = new AWSCredentials(awsAccessKey, awsSecretKey);
// create the service object with our AWS credentials
S3Service s3Service = new RestS3Service(awsCredentials);
|
버켓 관리하기
버켓은 org.jets3t.service.model.BaseS3Object 클래스를
확장한 org.jets3t.service.model.S3Bucket으로 캡슐화된다. 이 클래스는
JetS3t 모델의 버켓과 오브젝트의 상위 클래스이다. 각 S3Bucket 오브젝트는
버켓의 이름과 지리적 위치, 버켓의 생성 날짜, 소유자 이름, 버켓과 연관된 메타데이터 등의 중요한
버켓 정보를 인쇄하는 데 사용할 수 있는 다양한 접근자 메소드와 toString()을
제공한다.
Listing 2. 버켓 표시하기
// list all buckets in the AWS account and print info for each bucket.
S3Bucket[] buckets = s3Service.listAllBuckets();
for (S3Bucket b : buckets) {
System.out.println(b);
}
|
고유한 버켓 이름을 제공하여 새 버켓을 만들 수 있다. 버켓의 네임스페이스는
모든 사용자 계정에서 공유하므로 고유 이름을 찾기가 쉽지 않을 수도 있다. 버켓과 버켓에
포함된 오브젝트를 저장할 실제 위치를 지정할 수도 있다.
Listing 3. 버켓 만들기
// create a US bucket and print its info
S3Bucket bucket = s3Service.createBucket(bucketName);
System.out.println("Created bucket - " + bucketName + " - " + bucket);
// create a EU bucket and print its info
S3Bucket bucket = s3Service.createBucket(bucketName, S3Bucket.LOCATION_EUROPE);
System.out.println("Created bucket - " + bucketName + " - " + bucket);
|
버켓에 있는 오브젝트를 모두 삭제해야만 버켓을 삭제할 수 있으며, 그렇지 않으면
예외가 발생한다. 사용하고 있는 RestS3Service 클래스는 단일 오브젝트를
처리하는 데 적합하다. 여러 오브젝트를 처리해야 하는 경우에는 처리 시간을 단축하기 위해 멀티스레드
방식을 사용하는 것이 좋다. 멀티스레드 방식을 지원하기 위해 JetS3t에서는 org.jets3t.service.multithread.S3ServiceSimpleMulti
클래스를 제공한다. 이 클래스를 사용하여 기존 s3Service 오브젝트를
랩핑하면 멀티프로세서의 성능을 최대한으로 활용할 수 있다. 이 기능은 버켓에 포함된 모든 오브젝트를
삭제하여 버켓을 지워야 할 때 유용하게 사용할 수 있다.
Listing 4. 버켓 삭제하기
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, “my bucket”);
// delete a bucket – it must be empty first
s3Service.deleteBucket(bucket);
// create a multi threaded version of the RestService
S3ServiceSimpleMulti s3ServiceMulti = new S3ServiceSimpleMulti(s3Service);
// get all the objects from bucket
S3Object[] objects = s3Service.listObjects(bucket);
// clear the bucket by deleting all its objects
s3ServiceMulti.deleteObjects(bucket, objects);
|
각 버켓에는 버켓에 대한 권한과 다른 사용자에게 제공된 액세스 레벨을 확인하는 ACL이
연관되어 있다. ACL을 검색한 후 ACL에서 제공하는 권한을 인쇄할 수 있다.
Listing 5. 버켓에 대한 ACL 검색
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, “my bucket”);
// get the ACL and print it
AccessControlList acl = s3Service.getBucketAcl(bucket);
System.out.println(acl);
|
새로 만든 버켓과 오브젝트에는 기본적으로 해당 항목을 소유자 전용으로 만드는
권한이 할당된다. 이러한 설정은 버켓에 대한 ACL을 변경한 후 버켓에 대한 읽기, 쓰기 또는 전체
제어 권한을 사용자 그룹에 부여하여 수정할 수 있다.
Listing 6. 버켓 및 해당 컨텐츠를 공용 항목으로 만들기
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, “my bucket”);
// get the ACL
AccessControlList acl = s3Service.getBucketAcl(bucket);
// give everyone read access
acl.grantPermission(GroupGrantee.ALL_USERS, Permission.PERMISSION_READ);
// save changes back to S3
bucket.setAcl(acl);
s3Service.putBucketAcl(bucket);
|
손쉽게 버켓에 대한 로깅을 활성화하고 현재 로깅 상태를 검색할 수 있다. 로깅이
활성화되면 해당 버켓의 각 파일에 대한 세부 액세스 로그가 S3에 저장된다. 로그에 사용된 스토리지
공간에 대한 비용이 사용자의 S3 계정에 부과된다.
Listing 7. S3 버켓에 대한 로깅
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, “my bucket”);
// is logging enabled?
S3BucketLoggingStatus loggingStatus = s3Service.getBucketLoggingStatus(bucketName);
System.out.println(loggingStatus);
// enable logging
S3BucketLoggingStatus newLoggingStatus = new S3BucketLoggingStatus();
// set a prefix for your log files
newLoggingStatus.setLogfilePrefix(logFilePrefix);
// set the target bucket name
newLoggingStatus.setTargetBucketName(bucketName);
// give the log_delivery group permissions to read and write from the bucket
AccessControlList acl = s3Service.getBucketAcl(bucket);
acl.grantPermission(GroupGrantee.LOG_DELIVERY, Permission.PERMISSION_WRITE);
acl.grantPermission(GroupGrantee.LOG_DELIVERY, Permission.PERMISSION_READ_ACP);
bucket.setAcl(acl);
// save the changed ACL for the bucket to S3
s3Service.putBucketAcl(bucket);
// save the changes to the bucket logging
s3Service.setBucketLoggingStatus(bucketName, newLoggingStatus, true);
System.out.println("The bucket logging status is now enabled.");
|
오브젝트 관리하기
버켓에 포함된 각 오브젝트는 org.jets3t.service.model.S3Object로
표현된다. 각 S3Bucket 오브젝트는 다음과 같은 오브젝트의 중요 정보를 인쇄하는 데
사용할 수 있는 toString()을 제공한다.
- 키 이름
- 포함하는 버켓의 이름
- 오브젝트를 마지막으로 수정한 날짜
- 오브젝트에 연관된 메타데이터
이 오브젝트는 메타데이터와 함께 오브젝트의 다양한 특성에 액세스할 수 있는 메소드도 제공한다.
Listing 8. 오브젝트 표시하기
// list objects in a bucket.
S3Object[] objects = s3Service.listObjects(bucket);
// print out the object details
if (objects.length == 0) {
System.out.println("No objects found");
} else {
for (S3Object o : objects) {
System.out.println(o);
}
}
|
일치시킬 접두부를 제공하여 검색된 오브젝트의 목록을 필터링할 수 있다.
Listing 9. 오브젝트 목록 필터링하기
// list objects matching a prefix.
S3Object[] filteredObjects = s3Service.listObjects(bucket, “myprefix”, null);
// print out the object details
if (filteredObjects.length == 0) {
System.out.println("No objects found");
} else {
for (S3Object o : filteredObjects) {
System.out.println(o);
}
}
|
각 오브젝트는 컨텐츠 유형, 수정된 날짜 등과 같은 연관된 메타데이터를 가질
수 있으며 애플리케이션 관련 사용자 정의 메타데이터를 오브젝트에 연관시킬 수도 있다.
Listing 10. 오브젝트 메타데이터 검색하기
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, bucketName);
// getobjects matching a prefix
S3Object[] filteredObjects = s3Service.listObjects(bucket, “myprefix”, null);
if (filteredObjects.length == 0) {
System.out.println("No matching objects found");
}else {
// get the metadata for multiple objects.
S3Object[] objectsWithHeadDetails = s3ServiceMulti.getObjectsHeads(bucket,
filteredObjects);
// print out the metadata
for (S3Object o : objectsWithHeadDetails) {
System.out.println(o);
}
}
|
새로 만들어진 각 오브젝트는 기본적으로 개인용 오브젝트이다. JetS3t를 사용하여
다른 사용자가 오브젝트 데이터를 다운로드하는 데 사용할 수 있는 서명된 URL을 생성할 수 있다. 이
URL은 일정 기간 동안만 유효하고 해당 기간 경과 후 자동으로 만료되도록 만들 수 있다. 이 경우
오브젝트는 여전히 개인용으로 유지되지만 짧은 기간 동안 오브젝트를 다운로드할 수 있도록 다른
사용자에게 URL을 제공할 수 있다.
Listing 11. 오브젝트 다운로드를 위한 서명된 URL 생성하기
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, bucketName);
// how long should this URL be valid?
int duration = Integer.parseInt(tokens.nextToken());
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MINUTE, duration);
Date expiryDate = cal.getTime();
// create the signed url
String url = S3Service.createSignedGetUrl(bucketName, objectKey,
awsCredentials, expiryDate);
System.out.println("You can use this public URL to access this file for the next "
+ duration + " min - " + url);
|
S3에서는 버켓에 있는 오브젝트당 최대 5GB의 공간이 허용된다. 오브젝트가
5GB를 초과하는 경우에는 오브젝트를 5GB 크기의 여러 파일로 분할한 후 분할된 모든 파일을
S3에 업로드해야 한다.
Listing 12. S3에 업로드하기
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, bucketName);
// create an object with the file data
File fileData = new File(“/my_file_to_upload”);
S3Object fileObject = new S3Object(bucket, fileData);
// put the data on S3
s3Service.putObject(bucket, fileObject);
System.out.println("Successfully uploaded object - " + fileObject);
|
JetS3t에서 제공하는 DownloadPackage 클래스를 사용하면
간편하게 S3 오브젝트의 데이터를 로컬 파일에 연관시켜서 자동으로 S3에 저장할 수 있다. 이 기능을
사용하면 S3에서 오브젝트를 쉽게 다운로드할 수 있다.
Listing 13. S3에서 다운로드하기
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, bucketName);
// get the object
S3Object fileObject = s3Service.getObject(bucket, fileName);
// associate a file with the object data
DownloadPackage[] downloadPackages = new DownloadPackage[1];
downloadPackages[0] = new DownloadPackage(fileObject,
new File(fileObject.getKey()));
// download objects to the associated files
s3ServiceMulti.downloadObjects(bucket, downloadPackages);
System.out.println("Successfully retrieved object to current directory");
|
이 섹션에서는 JetS3t 툴킷에서 제공하는 일부 기본 기능과 이러한 기능을 사용하여
S3와 상호 작용하는 방법에 대해 설명했다. S3 서비스 및 JetS3t 툴킷에 대한 자세한 정보는
참고자료에서 볼 수 있다.
S3 Shell
지금까지 간단한 코드를 사용한 수행한 S3 통신 기능을 명령행에서 실행할 수 있는
간단한 S3 Shell 프로그램을 생성하여 보다 유용하고 지속적인 형태로 변환할 수 있다. Amazon Web
Services 액세스 키와 비밀 키를 매개변수로 받은 후 콘솔 프롬프트를 리턴하는 간단한 Java 프로그램을
만든 다음 한 개 이상의 문자를 입력하여 원하는 결과를 확인할 수 있다. 예를 들어, b를
입력하면 버켓이 표시되고, om을 입력하면 특정 접두부가 일치하는 오브젝트가
표시된다. 이 프로그램을 실제로 사용해 보기를 권장한다.
이 쉘 프로그램의 main()에는 이 기사에서 사용한
코드로 구성된 구현이 채워져 있다. 이 기사에서는 내용이 너무 길어지기 때문에 S3 Shell용
코드를 제공하지 않는다. 다운로드를 통해 전체 S3 Shell 소스 코드와
해당 종속 파일을 다운로드할 수 있다. devworks-s3.jar 파일을 실행하면 S3 Shell이 실행된다.
Listing 14. S3 Shell 실행하기
java -jar devworks-s3.jar my_aws_access_key my_aws_secret_key
|
S3 Shell에서는 언제라도 h를 입력하여 지원되는 명령 목록을 확인할 수 있다.
그림 2. S3 Shell의 도움말
몇 가지 유용한 메소드가 S3 Shell에 추가되었다. S3 Shell을 사용자의 구체적인
환경에서 더욱 유용하게 사용하기 위해 다른 기능을 추가하여 쉘을 확장할 수 있다.
요약
이 기사에서는 Amazon S3 서비스의 일부 기본 개념에 대해 살펴보았다. JetS3t
툴킷은 S3와 상호 작용하는 데 사용할 수 있는 오픈 소스 라이브러리이다. 샘플 코드를 사용하여
간단한 S3 Shell을 생성하는 방법도 살펴보았으며 명령행을 통해 쉽고 간단하게 S3를 직접 사용해
보았다.
이 "Amazon Web Services를 사용한 클라우드 컴퓨팅"
시리즈의 Part 3에서는 Amazon EC2(Elastic Compute Cloud)를
사용하여 클라우드에서 가상 서버를 실행하는 방법에 대해 설명한다.
다운로드 하십시오 | 설명 | 이름 | 크기 | 다운로드 방식 |
|---|
| Sample code for this article | devworks-s3.zip | 2.93MB | HTTP |
|---|
참고자료 교육
제품 및 기술 얻기
-
다른 도구들과 JetS3t를 다운로드하자.
- IBM 평가판 제품을
다운로드하여 IBM® DB2®, Lotus®, Rational®, Tivoli® 및 WebSphere®의
애플리케이션 개발 도구 및 미들웨어 제품을 사용해 보자.
토론
필자소개  | 
|  | Prabhakar Chaganti는 사용자의 전체 AWS 클라우드 컴퓨팅 환경(EC2, S3, SQS 및 SimpleDB
포함)을 설계, 관리 및 모니터링하는 단일 통합 인터페이스를 만들고 있는 신생 업체 Ylastic의
CTO이다. 최근에 Xen Virtualization과 GWT Java AJAX Programming이라는 두 권의
책을 집필했으며, VMware Global Virtual Appliance Challenge에서 가장 혁신적인 가상 어플라이언스에
주어지는 커뮤니티 초이스 상을 수상하기도 했다. |
기사에 대한 평가
 |
| 이 문서 북마킹 하기
|
|