這2天接觸了一下Amazon Web Services(AWS)中的Amazon Simple Storage Service,簡稱Amazon S3(下稱S3)。S3站點上用下面的語句描述了自己的作用:

Amazon S3 is storage for the Internet. It is designed to make web-scale computing easier for developers.

Amazon S3 provides a simple web services interface that can be used to store and retrieve any amount of data, at any time, from anywhere on the web. It gives any developer access to the same highly scalable, reliable, fast, inexpensive data storage infrastructure that Amazon uses to run its own global network of web sites. The service aims to maximize benefits of scale and to pass those benefits on to developers.
通過S3這個接口,您可以把Amazon的存儲服務當作一個硬盤,可以隨時隨地上傳,下載數據,不過您得付錢才可以使用,即使您只是準備測試一 下。S3首頁上有價格表。在S3注冊并付費獲取2個數:Access Key ID和Secret Access Key,才可以使用S3的服務,因為所有的操作都需要這2個數進行身份驗證。

一、基本概念:Buckets,Objects,Keys,Operations

注冊后,用戶通過名為bucket的容器來管理所有數據,這些數據稱之為對象(Object)。比如,一個名為20071211/logo- 320×240.gif的對象存放在livebaby這個bucket里,則可以通過URL:http: //s3.amazonaws.com/livebaby/20071211/logo-320×240.gif來訪問這個對象。bucket有3個基本 概念:1、不能刪除非空的bucket;2、bucket不能轉讓給其他用戶;3、每個用戶最多只能有100個buckets。簡單的說,bucket類 似硬盤分區中的第一層目錄。

這里還有一個key的概念,key是bucket中對象的唯一標識符,每個對象對應一個key。上例中,20071211/logo-320×240.gif稱為key。

每個對象都有一組鍵值對,稱為MetaData,分2種,系統metadata和 用戶metadata。S3不處理用戶metadata,只接收、存儲、返回給用戶,由用戶自己處理。REST下,系統metadata以x-amz-開 頭,用戶metadata以x-amz-meta-開頭。

Amazon提供2種API:Simple Object Access Protocol(SOAP)和Representational State Transfer(REST)來訪問AWS。這里一篇文章,其中簡單對比了一下2者的區別,區別后總結說:“ In fact, you can think of REST as a kind of data-access methodology whereas SOAP is a process-control methodology.”

通過SOAP和REST,最常用的操作(Operation)有這么幾個:

* 創建bucket;
* 上傳對象,上傳時必須指定一個key,同時還可以設置這個對象的訪問控制權限,默認是私有的;
* 下載對象,有HTTP 和 BitTorrent2種方式;
* 刪除對象;
* 列表對象;列表時,可以通過一個前綴(prefix)來過濾顯示不同的對象。

通過向AWS的服務端點(endpoint,http://s3.amazonaws.com/)發出PUT、GET、DELETE、HEAD等HTTP Requests,便可以操作S3上的數據。

如果通過web訪問S3服務來獲取數據(Object),則分頁、搜索等功能是比不可少的。而S3提供的4個參數,可以讓我們方便快捷的將數據取出來,這4個參數是基于key操作的。key的概念參見文章一。

1、prefix。比如http://bucket.s3.amazonaws.com/?prefix=123,則將key中以123開頭的列出來。

2、delimiter。比如http://bucket.s3.amazonaws.com/?delimiter=/,此時,S3可能會返回CommonPrefixes,將key中采用“/”分隔的列出來。

<Contents>
<Key>123/zzz.txt</Key>
<LastModified>2007-12-11T07:41:51.000Z</LastModified>
<ETag>”d725dfc2167445d1db23067de33ebd28″</ETag>
<Size>203</Size>
<StorageClass>STANDARD</StorageClass>
</Contents>
<Contents>
<Key>abc/ooo/yxx.txt</Key>
<LastModified>2007-12-12T05:34:35.000Z</LastModified>
<ETag>”4fdf8a4dd42bd4d24855eebd5c9b9434″</ETag>
<Size>41</Size>
<StorageClass>STANDARD</StorageClass>
</Contents>

用了“delimiter=/”返回,告訴你 有prefix為123/和abc/可用。

<CommonPrefixes>
<Prefix>123/</Prefix>
</CommonPrefixes>
<CommonPrefixes>
<Prefix>abc/</Prefix>
</CommonPrefixes>

這時輸入http://bucket.s3.amazonaws.com/?delimiter=/&prefix=123/則將prefix中有123/的全部列出來。

如果key有這樣的形式:ms_vb_5_src/sss.frm,ms_vb_6_src/ddd.frm,你可以把delimiter設為“_”來取數據。通過不同的delimiter和prefix可以非常靈活的獲取數據。

如果數據量很大,則可以用第三個和第四個參數

3、MaxKeys。這個告訴S3一次性返回多少數據,默認返回1000個。URL輸入http://bucket.s3.amazonaws.com/?delimiter=/&prefix=123/&max-keys=10,則返回:

<Name>bucket</Name>
<Prefix>123/</Prefix>
<Marker />
<NextMarker>123/10.txt</NextMarker>
<MaxKeys>10</MaxKeys>
<Delimiter>/</Delimiter>
<IsTruncated>true</IsTruncated>
<Contents>
<Key>123/1.txt</Key>
<LastModified>2007-12-12T06:02:33.000Z</LastModified>
<ETag>”9dd4e461268c8034f5c8564e155c67a6″</ETag>
<Size>1</Size>
<StorageClass>STANDARD</StorageClass>
</Contents>

里面IsTruncated為true,表示按照delimiter和prefix和max-keys取出的數據不止10個;余下的數據怎么取?就用到了NextMarker元素中數據。

4、Marker。 URL輸入http://bucket.s3.amazonaws.com/?delimiter=/&prefix=123/&max -keys=10&marker=123/10.txt,marker的值就是NextMarker元素中數據。這樣S3就返回了下10條數據。

<Name>bucket</Name>
<Prefix>123/</Prefix>
<Marker>123/10.txt</Marker>
<NextMarker>123/19.txt</NextMarker>
<MaxKeys>10</MaxKeys>
<Delimiter>/</Delimiter>
<IsTruncated>true</IsTruncated>
<Contents>
<Key>123/1.txt</Key>
<LastModified>2007-12-12T06:02:33.000Z</LastModified>
<ETag>”9dd4e461268c8034f5c8564e155c67a6″</ETag>
<Size>1</Size>
<StorageClass>STANDARD</StorageClass>
</Contents>

如果IsTruncated仍為true,則表示還有數據,我們把marker改為marker=123/19.txt便可以繼續取下10條數據;如果IsTruncated為false,則表示按照條件已經將數據全部取出來了。

S3文檔中,提供更為詳細的解釋。點擊查看:http://docs.amazonwebservices.com/AmazonS3/2006-03-01/