尽管云计算这一术语并不新鲜(Amazon在年就开始提供它的云服务)但从年起它才开始真正成为流行词这期间Google和Amazon的云服务逐渐获得了公众的关注 Google的App Engine使用户能够在Google基础设施上构建和托管 Web 应用程序
连同SAmazonWeb Services还包括Elastic Cloud Compute (EC)计算Web服务该服务可以在Amazon的基础设施上托管应用程序其他公司也开始蠢蠢欲动准备与Amazon和Google一决高下其中就包括 Microsoft?的 Azure甚至 Sun Microsystems(其云计算还没有正式推向市场)也想分一杯羹例如IBM最近宣布它将提供某些产品供开发人员在AmazonEC 环境中使用
AmazonSimple Storage Service (S)是一个公开的服务Web应用程序开发人员可以使用它存储数字资产包括图片视频音乐和文档S提供一个 RESTful API以编程方式实现与该服务的交互通过本文您将了解如何使用开源的JetSt库利用Amazon的S云服务存储和检索数据
面向开源的S云平台介绍
云是一个抽象的概念表示松散连接在一起的计算机组这些计算机共同执行某项任务或者服务就像是使用一个单独的实体完成一样此概念背后的架构也很抽象每个云提供者都可以根据各自情况随意设计它的产品软件即服务(Software as a ServiceSaaS)是一个与云相关的概念表示云向用户提供某种服务云模型可以降低用户成本因为他们无需购买软件和硬件也可以运行 — 服务提供者已经为用户提供了必要的组件
以Amazon的S产品为例顾名思义这是一个公开的服务使 Web 开发人员能够存储数字资产(如图片视频音乐和文档等)以便在应用程序中使用使用S时它就像一个位于 Internet 的机器有一个包含数字资产的硬盘驱动实际上它涉及到许多机器(位于各个地理位置)其中包含数字资产(或者数字资产的某些部分)Amazon还处理所有复杂的服务请求可以存储数据并检索数据您只需要付少量的费用(大约每月 美分 /GB)就可以在Amazon的服务器上存储数据 美元即可通过Amazon服务器传输数据
Amazon的S服务没有重复开发它公开了RESTful API使您能够使用任何支持 HTTP 通信的语言访问S JetSt项目是一个开源Java库可以抽象出使用S的RESTfulAPI的细节将API公开为常见的Java方法和类编写的代码越少越好难道不是吗?充分利用其他人的成果也是不错的在本文中您将看到JetSt使S和Java语言的工作变得更加简单从根本上提高了效率
S开源应用模式介绍
理论上S是一个全球存储区域网络(SAN)它表现为一个超大的硬盘您可以在其中存储和检索数字资产但是从技术上讲Amazon的架构有一些不同您通过S存储和检索的资产被称为对象对象存储在存储段(bucket)中您可以用硬盘进行类比对象就像是文件存储段就像是文件夹(或目录)与硬盘一样对象和存储段也可以通过统一资源标识符(Uniform Resource IdentifierURI)查找
例如在我的硬盘中我有一个名为 whitepaperpdf 的文件它位于主目录中名为 documents 的文件夹中相应的该pdf文件的URI为/home/aglover/documents/whitepaperpdf 在S中URI有一点不同首先存储段只能是顶级的 — 无法像嵌套硬盘中的文件夹(或目录)一样进行嵌套其次存储段必须遵循 Internet 命名法则;句点旁边没有斜槓名称不包括下划线等等最后由于存储段名称已经是Amazon域内的 () 公共URI的一部分存储段名称必须在所有S中是惟一的(好消息是每个帐户只能包含 个存储段因此不用担心别人占用了所有的好名字)
存储段在S中是URI的根也就是说存储段的名称将是指向S中某个对象的URI的一部分例如如果我有一个名为 agdocs 的存储段以及一个名为 whitepaperpdf 的对象URI将是
S还提供了指定存储段和对象的所有者和权限的能力就像对待硬件的文件和文件夹一样在S中定义对象或存储段时您可以指定一个访问控制策略注明谁可以访问您的S资产以及如何访问(例如读和写权限)相应地您可以通过许多方式提供对您的对象的访问使用RESTfulAPI只是其中一种
这里Amazon有一个神奇的DNS魔术用户不用担心S资产的 URL 通过 Domain Name System (DNS) 和 CNAME(canonical name的缩写)记录您可以将自定义程度更高的 URL 映射到S的 URL 这样一来您就隐藏了您(或您的应用程序)依赖S的事实!
开始使用开源S和JetSt
要开始使用S您需要一个帐户S不是免费的因此在创建帐户时您必须向Amazon提供一种支付手段(比如信用卡号码)不用担心不收初装费;您只需要为使用付费对于本文的示例只需要支付不到 美元的费用
在创建帐户的过程中您还需要创建凭据访问密钥和秘密密钥(就像用户名和密码)(您还可以获取 x 证书;但是只有在使用Amazon的 SOAPAPI时才需要使用该证书)和任何访问信息一样都必须保管好您的秘密密钥因为任何人使用您的凭据访问S时您都将为此付费因此每当创建存储段或对象时默认的行为是让所有内容都私有;您必须显式获取对外部世界的访问
有了访问密钥和秘密密钥您可以下载 JetSt并使用它通过RESTful API与S交互
使用编程手段通过 JetSt 登录S可以分为两步首先必须创建一个 AWSCredentials 对象然后将它传递到 SService 对象AWSCredentials 对象非常简单它将访问密钥和秘密密钥视为 StringSService 对象实际上是一个接口类型因为S同时提供RESTfulAPI和一个 SOAP APIJetSt 库可以提供两种实现类型RestSService 和 SoapSService就本文而言(包括大部分S事务)RESTfulAPI的简洁性让它成为一个很好的选择
创建一个连接的 RestSService 实例很简单如清单 所示
步骤 创建一个 JetSt 的 RestSService 实例
def awsAccessKey = blahblah
def awsSecretKey = blahblah
def awsCredentials = new AWSCredentials(awsAccessKey awsSecretKey)
def sService = new RestSService(awsCredentials)
现在可以执行一些有趣的操作了例如创建存储段添加一个影片然后获取一个有时间限制的URL 实际上这听起来像一个业务流程不是吗?这是一个与发布有限资产(比如影片)有关的业务流程
创建存储段
对于虚构的电影业务我将创建一个称为 bci 的存储段借助 JetSt该流程很简单通过 SService 类型您有几个选项我更喜欢使用 getOrCreateBucket 调用如清单 所示顾名思义调用该方法可能返回一个存储段实例(表示为 SBucket 类型的实例)或在S中创建代码段
S平台详细使用步骤简介
步骤 在S服务器上创建存储段
def bucket = sServicegetOrCreateBucket(bci)
不要被我这个简单的代码示例所蒙蔽JetSt 库的扩展性非常强例如您可以快速确定拥有多少存储段 —— 只需通过 listAllBuckets 调用请求一个S Service 实例即可该方法返回一个 SBucket 实例数组对于任何存储段实例您可以询问它的名称和创建日期更重要的是您可以通过JetSt 的 AccessControlList 类型控制与之相关的权限例如我可以获取 bci 存储段实例并允许任何人可以公开读取和编写如清单 所示
步骤 修改存储段的访问控制列表
def bucketacl = AccessControlListREST_CANNED_PUBLIC_READ_WRITE
当然通过 API您也可以随意删除存储段Amazon甚至允许您指定创建存储段的地理位置Amazon简化了存储实际数据的复杂性但是您可以告诉Amazon要将存储段(及其内部所有的对象)放在美国或欧洲(当前可用选项)
向存储段添加对象
使用JetSt 的API创建S对象就像操作存储段一样简单JetSt 库也很智能可以负责处理与S存储段内文件相关的内容类型例如我想向S上传一段影片nerfwarsmp以便用户能够在有限的时间内观看创建一个S对象与创建常见的 javaioFile 类型一样简单并能将SObject 类型与存储段关联如清单 所示
步骤 创建一个S对象
def sobj = new SObject(bucket new File(/path/to/nerfwarsmp))
使用文件和存储段初始化 SObject 之后要做的所有事情就是通过 putObject 方法上传如清单 所示
步骤 上传影片
sServiceputObject(bucket sobj)
使用清单 可以完成上传现在影片位于Amazon服务器了影片的键就是它的名称当然您可以根据需要重写该名称以调用其他对象实际上JetSt API(以及 AmazonSRESTful API)公开了许多信息供您创建对象时使用我们知道您还可以提供访问控制列表S中的任何对象都可以保存API允许您创建的其他元数据之后可以通过该元数据的SAPI(以及派生的 JetSt)查询任何对象
创建对象的URL
到现在为止我的S实例有一个包含影片的存储段实际上我的影片可以通过以下URI获取 但是只有我才能获取(在本例中我只能通过编程方式访问它因为与所有内容关联的默认访问控制被设置为拒绝任何未授权访问)我的目的是为选择的用户提供一种方式查看新影片(在有限的时间内)直到我开始收取访问费用(S也会提供帮助)
创建一个公共 URL 是S提供的一个便捷功能;实际上使用 S您可以创建一个公共 URL但只在一段时间内有效(例如 小时内)对于我刚刚存储在S服务器上的影片我将创建一个 小时内有效的 URL 然后我将向选定的用户提供该 URL以便他们下载并观看(假定他们在两天内下载)
处理带有效期的文件
要创建一个针对S对象的时间敏感型URL您可以使用 JetSt 的createSignedGetUrl 方法这是一个 SService 类型的静态方法该方法采用一个存储段名称一个对象键(在本例中是影片名还记得吗?)一些凭证(以 JetSt 的AWSCredentials 对象的形式)截止日期如果您了解所需的存储段和对象键则可以通过清单 中的 Groovy 代码快速获取 URL
步骤 创建一个时间敏感型URL
def now = new Date()
def url = SServicecreateSignedGetUrl(
bucketgetName() sobjkey awsCredentials now + )
使用 Groovy我可以通过 + 语法轻松指定一个 小时的限定日期得到的 URL 如下所示(只有一行)
Signature=rZvkGkms=
如果您的带宽和存储需求不稳定则S能提供很多帮助例如想想我演示的业务模型 — 影片在一年中特定的时间发布在传统的存储模型中您需要在某处机架上购买许多空间(或提供通向它的硬件和管道)很可能下载量很大但随后会相对降低但是您不能根据需要付费使用 S该模型将根据需要付费 — 公司仅在需要时为存储和带宽付费更重要的是S的安全特性可以帮助您进一步指定人们何时可以下载视频甚至可以指定谁可以下载
使用S实现这些需求非常容易在高水平上创建一个受限的影片公共下载需要 个步骤
登录S
创建存储段
向存储段添加所需的视频(或对象)
创建一个指向该视频的时间敏感型 URL
就是这样!
使用后记便利的按需付费模式
与传统存储模型相比S的随需付费模型有很多明显的优势例如在自己的硬盘上存储音乐收藏我必须预先花 美元购买一个 GB 的存储单元我没有GB 的数据可以存储因此我为自己不需要的空间花费了 美分 /GB(虽然很便宜)我还需要维护设备并支付电费如果我使用 Amazon我不需要预先为不重要的资产支付 美元我只需要支付 美分 /GB无需为管理和维护存储硬件付费
现在想想在整个企业范围内实现这些服务的好处以 Twitter 为例在S上为 万个用户帐户存储图片通过按照使用付费的方式Twitter 不需要花费大量资金购买硬件基础设施来存储和提供图片服务也不需要支出人力和部件成本来配置和维护图片
云的好处还不止这些您还可以实现低延迟和高可用性假设存储在Amazon云中的资产遍布全世界那么为各个位置提供内容的速度将会更快更重要的是由于您的资产分布在各种机器上您的数据在一些机器(或部分网络)瘫痪时也能保持高可用性
一言以蔽之AmazonS的好处很简单低成本高可用性安全除非您是一个 SAN 专家喜欢维护硬件资产来存储数据内容但是Amazon可能比您做的更好在资金紧张的时候为什么还要将自己的资金提前预支在硬件上呢(不要忘了硬件会随时间贬值)?