儘管雲計算這一術語並不新鮮(Amazon在2006年就開始提供它的雲服務),但從2008年起它才開始真正成為流行詞,這期間,Google和 Amazon的雲服務逐漸獲得了公眾的關注。 Google的App Engine使使用者能夠在Google基礎設施上構建和託管 Web 應用程式。
連同S3,AmazonWeb Services還包括Elastic Cloud Compute (EC2)計算Web服務,該服務可以在Amazon的基礎設施上託管應用程式。 其他公司也開始蠢蠢欲動,準備與Amazon和Google一決高下,其 中就包括 Microsoft®的 Azure,甚至 Sun Microsystems(其雲計算還沒有正式推向市場)也想分一杯羹。 例如IBM最近宣佈,它將提供某些產品供開發人員在AmazonEC2 環境中使用。
AmazonSimple Storage Service (S3)是一個公開的服務,Web應用程式開發人員可以使用它存儲數位資產,包括圖片、視頻、音樂和文檔。 S3提供一個 RESTful API以程式設計方式實現與該服務的交互。 通過本文,您將瞭解如何使用開源的JetS3t庫利用Amazon的S3雲服務存儲和檢索資料。
面向開源的S3雲平臺介紹
雲是一個抽象的概念,表示鬆散連接在一起的電腦群組,這些電腦共同執行某項任務或者服務,就像是使用一個單獨的實體完成一樣。 此概念背後的架 構也很抽象:每個雲提供者都可以根據各自情況隨意設計它的產品。 軟體即服務(Software as a Service,SaaS)是一個與雲相關的概念,表示雲向使用者提供某種服務。 雲模型可以降低使用者成本,因為他們無需購買軟體和硬體也可以運行 — 服務提供者已經為使用者提供了必要的元件。
以Amazon的S3產品為例。 顧名思義,這是一個公開的服務,使 Web 開發人員能夠存儲數位資產(如圖片、視頻、音樂和文檔等),以便在應用程式中使用。 使用S3時,它就像一個位於 Internet 的機器,有一個包含數位資產的硬碟驅動。 實際上,它涉及到許多機器(位於各個地理位置),其中包含數位資產(或者數位資產的某些部分)。 Amazon還處 理所有複雜的服務請求,可以存儲資料並檢索資料。 您只需要付少量的費用(大約每月 15 美分 /GB)就可以在Amazon的伺服器上存儲資料,1 美元即可通過Amazon伺服器傳輸資料。
Amazon的S3服務沒有重複開發,它公開了RESTful API,使您能夠使用任何支援 HTTP 通信的語言訪問S3。 JetS3t專案是一個開源JAVA庫,可以抽象出使用S3的RESTful API的細節,將API公開為常見的JAVA方法和類。 編寫的代碼越少越 好,難道不是嗎?充分利用其他人的成果也是不錯的。 在本文中您將看到,JetS3t使S3和JAVA語言的工作變得更加簡單,從根本上提高了效率。
S3開源應用模式介紹
理論上,S3是一個全球存放區域網路(SAN),它表現為一個超大的硬碟,您可以在其中存儲和檢索數位資產。 但是,從技術上講,Amazon的 架構有一些不同。 您通過S3存儲和檢索的資產被稱為物件。 物件存儲在存儲段(bucket)中。 您可以用硬碟進行類比:物件就像是檔,存儲段就像是檔 夾(或目錄)。 與硬碟一樣,物件和存儲段也可以通過統一資源識別項(Uniform Resource Identifier,URI)查找。
例如,在我的硬碟中,我有一個名為 whitepaper.pdf 的檔,它位於主目錄中名為 documents 的資料夾中。 相應的,該pdf檔的URI為/home/aglover/documents/whitepaper.pdf 。 在S3中,URI有一點不同。 首先,存儲段只能是頂級的 — 無法像嵌套硬碟中的資料夾(或目錄)一樣進行嵌套。 其次,存儲段必須遵循 Internet 命名法則;句點旁邊沒有斜杠,名稱不包括底線等等。 最後,由於存儲段名稱已經是Amazon域內的 (s3.amazonaws.com) 公共URI的一部分,存儲段名稱必須在所有S3中是惟一的。 (好消息是每個帳戶只能包含 100 個存儲段,因此不用擔心別人佔用了所有的好名字)。
存儲段在S3中是URI的根。 也就是說,存儲段的名稱將是指向S3中某個物件的URI的一部分。 例如,如果我有一個名為 agdocs 的存儲段以及一個名為 whitepaper.pdf 的物件,URI將是:HTTP://agdocs.s3.amazonaws.com/whitepaper.pdf 。
S3還提供了指定存儲段和物件的擁有者和許可權的能力,就像對待硬體的檔和資料夾一樣。 在S3中定義物件或存儲段時,您可以指定一個存取控制策 略,注明誰可以訪問您的S3資產以及如何訪問(例如,讀和寫許可權)。 相應地,您可以通過許多方式提供對您的物件的訪問,使用RESTful API只是其 中一種。
這裡Amazon有一個神奇的DNS魔術,使用者不用擔心S3資產的 URL 。 通過 Domain Name System (DNS) 和 CNAME(canonical name的縮寫)記錄,您可以將自訂程度更高的 URL 對應到S3的 URL 。 這樣一來,您就隱藏了您(或您的應用程式)依賴S3的事實!
開始使用開源S3和JetS3t
要開始使用S3,您需要一個帳戶。 S3不是免費的,因此在創建帳戶時您必須向Amazon提供一種支付手段(比如信用卡號碼)。 不用擔心:不收 初裝費;您只需要為使用付費。 對於本文的示例,只需要支付不到 1 美元的費用。
在創建帳戶的過程中,您還需要創建憑據:訪問金鑰和秘密金鑰(就像使用者名和密碼)。 (您還可以獲取 x.509 證書;但是,只有在使用Amazon的 SOAPAPI時才需要使用該證書)。 和任何訪問資訊一樣,都必須保管好您的秘密金鑰。 因為任何人使用您的憑據訪問S3時,您都將為此付費。 因此,每當創 建存儲段或物件時,預設的行為是讓所有內容都私有;您必須顯式獲取對外部世界的訪問。
有了訪問金鑰和秘密金鑰,您可以下載 JetS3t並使用它通過RESTful API與S3交互。
使用程式設計手段通過 JetS3t 登錄S3可以分為兩步。 首先,必須創建一個 AWSCredentials 物件,然後將它傳遞到 S3Service 物件。 AWSCredentials 物件非常簡單。 它將訪問金鑰和秘密金鑰視為 String。 S3Service 物件實際上是一個介面類別型。 因為S3同時提供RESTful API和一個 SOAP API,JetS3t 庫可以提供兩種實現類型:RestS3Service 和 SoapS3Service。 就本文而言(包括大部分S3事務),RESTful API的簡潔性讓它成為一個很好的選擇。
創建一個連接的 RestS3Service 實例很簡單,如清單 1 所示:
步驟 1. 創建一個 JetS3t 的 RestS3Service 實例
def awsAccessKey = 「blahblah」
def awsSecretKey = 「blah-blah」
def awsCredentials = new AWSCredentials(awsAccessKey, awsSecretKey)
def s3Service = new RestS3Service(awsCredentials)
現在可以執行一些有趣的操作了:例如,創建存儲段、添加一個影片,然後獲取一個有時間限制的URL 。 實際上,這聽起來像一個業務流程,不是嗎?這是一個與發佈有限資產(比如影片)有關的業務流程。
創建存儲段
對於虛構的電影業務,我將創建一個稱為 bc50i 的存儲段。 借助 JetS3t,該流程很簡單。 通過 S3Service 類型,您有幾個選項。 我更喜歡使用 getOrCreateBucket 調用,如清單 2 所示。 顧名思義,調用該方法可能返回一個存儲段實例(表示為 S3Bucket 類型的實例)或在S3中創建程式碼片段。
S3平臺詳細使用步驟簡介
步驟 2. 在S3伺服器上創建存儲段
def bucket = s3Service.getOrCreateBucket(」bc50i」)
不要被我這個簡單的代碼示例所蒙蔽。 JetS3t 庫的擴充性非常強。 例如,您可以快速確定擁有多少存儲段 —— 只需通過 listAllBuckets 調用請求一個S3 Service 實例即可。 該方法返回一個 S3Bucket 實例陣列。 對於任何存儲段實例,您可以詢問它的名稱和創建日期。 更重要的是,您可以通過JetS3t 的 AccessControlList 類型控制與之相關的許可權。 例如,我可以獲取 bc50i 存儲段實例,並允許任何人可以公開讀取和編寫,如清單 3 所示:
步驟 3. 修改存儲段的存取控制清單
def bucket.acl = AccessControlList.REST_CANNED_PUBLIC_READ_WRITE
當然,通過 API,您也可以隨意刪除存儲段。 Amazon甚至允許您指定創建存儲段的地理位置。 Amazon簡化了存儲實際資料的複雜性,但是您可以告訴 Amazon要將存儲段(及其內部所有的物件)放在美國或歐洲(當前可用選項)。
向存儲段添加物件
使用JetS3t 的API創建S3物件就像操作存儲段一樣簡單。 JetS3t 庫也很智慧,可以負責處理與S3存儲段內檔相關的內容類型。 例如,我想向S3上傳一段影片nerfwars2.mp4,以便使用者能夠在有限的時間內觀 看。 創建一個S3物件與創建常見的 java.io.File 類型一樣簡單,並能將S3Object 類型與存儲段關聯,如清單 4 所示:
步驟 4. 創建一個S3物件
def s3obj = new S3Object(bucket, new File(」/path/to/nerfwars2.mp4″))
使用檔和存儲段初始化 S3Object 之後,要做的所有事情就是通過 putObject 方法上傳,如清單 5 所示:
步驟 5. 上傳影片
s3Service.putObject(bucket, s3obj)
使用清單 5 可以完成上傳。 現在影片位於Amazon伺服器了,影片的鍵就是它的名稱。 當然,您可以根據需要重寫該名稱以調用其他物件。 實際上,JetS3t API(以及 AmazonS3RESTful API)公開了許多資訊,供您創建物件時使用。 我們知道,您還可以提供存取控制清單。 S3中的任何物件都可以保存API允許您創建的其他中繼資料。 之後可以 通過該中繼資料的S3API(以及派生的 JetS3t)查詢任何物件。
創建物件的URL
到現在為止,我的S3實例有一個包含影片的存儲段。 實際上,我的影片可以通過以下URI獲取:HTTP://bc50i.s3.amazonaws.com/nerfwars2.mp4 。 但是,僅自己才能獲取。 (在本例中,我只能通過程式設計方式訪問它,因為與所有內容關聯的預設存取控制被設置為拒絕任何未授權訪問)。 我的目的是為選擇的用 戶提供一種方式查看新影片(在有限的時間內),直到我開始收取訪問費用(S3也會提供説明)。
創建一個公共 URL 是S3提供的一個便捷功能;實際上,使用 S3,您可以創建一個公共 URL,但只在一段時間內有效(例如,24 小時內)。 對於我剛剛存儲在S3伺服器上的影片,我將創建一個 48 小時內有效的 URL 。 然後我將向選定的使用者提供該 URL,以便他們下載並觀看(假定他們在兩天內下載)。
處理帶有效期的檔
要創建一個針對S3物件的時間敏感型URL,您可以使用 JetS3t 的createSignedGetUrl 方法,這是一個 S3Service 類型的靜態方法。 該方法採用一個存儲段名稱、一個物件鍵(在本例中是影片名,還記得嗎?)、一些憑證(以 JetS3t 的AWSCredentials 物件的形式)、截止日期。 如果您瞭解所需的存儲段和物件鍵,則可以通過清單 6 中的 Groovy 代碼快速獲取 URL:
步驟 6. 創建一個時間敏感型URL
def now = new Date()
def url = S3Service.createSignedGetUrl(
bucket.getName(), s3obj.key, awsCredentials, now + 2)
使用 Groovy,我可以通過 + 2 語法輕鬆指定一個 48 小時的限定日期。 得到的 URL 如下所示(只有一行):
HTTPs://bc50i.s3.amazonaws.com/nerfwars2.mp4?AWSAccessKeyId=1asd06A5MR2&Expires=1234738280&Signature=rZvk8Gkms=
如果您的頻寬和存儲需求不穩定,則S3能提供很多説明。 例如,想想我演示的業務模型 — 影片在一年中特定的時間發佈。 在傳統的存儲模型中,您需要在某處機架上購買許多空間(或提供通向它的硬體和管道),很可能下載量很大,但隨後會相對降低。 但是,您不能根據需要付費。 使用 S3,該模型將根據需要付費 — 公司僅在需要時為存儲和頻寬付費。 更重要的是,S3的安全特性可以説明您進一步指定人們何時可以下載視頻,甚至可以指定誰可以下載。
使用S3實現這些需求非常容易。 在高水準上,創建一個受限的影片公共下載需要 4 個步驟:
1.登錄S3。
2.創建存儲段。
3.向存儲段添加所需的視頻(或物件)。
4.創建一個指向該視頻的時間敏感型 URL 。
就是這樣!
使用後記:便利的按需付費模式
與傳統存儲模型相比,S3的隨需付費模型有很多明顯的優勢。 例如,在自己的硬碟上存儲音樂收藏,我必須預先花 130 美元購買一個 500GB 的存儲單元。 我沒有500GB 的資料可以存儲,因此我為自己不需要的空間花費了 25 美分 /GB(雖然很便宜)。 我還需要維護設備並支付電費。 如果我使用 Amazon,我不需要預先為不重要的資產支付 130 美元。 我只需要支付 10 美分 /GB,無需為管理和維護存儲硬體付費。
現在想想在整個企業範圍內實現這些服務的好處。 以 Twitter 為例,在S3上為100 萬個使用者帳戶存儲圖片。 通過按照使用付費的方式,Twitter 不需要花費大量資金購買硬體基礎設施來存儲和提供圖片服務,也不需要支出人力和部件成本來配置和維護圖片。
雲的好處還不止這些。 您還可以實現低延遲和高可用性。 假設存儲在Amazon雲中的資產遍佈全世界,那麼為各個位置提供內容的速度將會更快。 更 重要的是,由於您的資產分佈在各種機器上,您的資料在一些機器(或部分網路)癱瘓時也能保持高可用性。
一言以蔽之,AmazonS3的好處很簡單:低成本、高可用性、安全。 除非您是一個 SAN 專家,喜歡維護硬體資產來存儲資料內容,但是Amazon可能比您做的更好。 在資金緊張的時候,為什麼還要將自己的資金提前預支在硬體上呢(不要忘了,硬 件會隨時間貶值)?