Amazon Simple Storage Service (S3) 是一个公开的服务,Web 应用程序开发人员可以使用它存储数字资产,包括图片、视频、音乐和文档。 S3 提供一个 RESTful API 以编程方式实现与该服务的交互。通过本文,您将了解如何使用开源的 JetS3t 库利用 Amazon 的 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 个存储段,因此不用担心别人占用了所有的好名字)。

DNS 魔术

不用担心 S3 资产的 URL 。通过 Domain Name System (DNS) 和 CNAME(canonical name的缩写)记录,您可以将自定义程度更高的 URL 映射到 S3 的 URL 。这样一来,您就隐藏了您(或您的应用程序)依赖 S3 的事实!

存储段在 S3 中是 URI 的根。也就是说,存储段的名称将是指向 S3 中某个对象的 URI 的一部分。例如,如果我有一个名为 agdocs 的存储段以及一个名为 whitepaper.pdf 的对象,URI 将是:http://agdocs.s3.amazonaws.com/whitepaper.pdf 。

S3 还提供了指定存储段和对象的所有者和权限的能力,就像对待硬件的文件和文件夹一样。在 S3 中定义对象或存储段时,您可以指定一个访问控制策略,注明谁可以访问您的 S3 资产以及如何访问(例如,读和写权限)。相应地,您可以通过许多方式提供对您的对象的访问,使用 RESTful API 只是其中一种。

开始使用 S3 和 JetS3t

要开始使用 S3,您需要一个帐户。 S3 不是免费的,因此在创建帐户时您必须向 Amazon 提供一种支付手段(比如信用卡号码)。不用担心 — 不收初装费;您只需要为使用付费。对于本文的示例,只需要支付不到 1 美元的费用。

在创建帐户的过程中,您还需要创建凭据:访问密钥和秘密密钥(就像用户名和密码)。(您还可以获取 x.509 证书;但是,只有在使用 Amazon 的 SOAP API 时才需要使用该证书)。和任何访问信息一样,都必须保管好您的秘密密钥。因为任何人使用您的凭据访问 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 中创建代码段。

清单 2. 在 S3 服务器上创建存储段

def bucket = s3Service.getOrCreateBucket("bc50i")

不要被我这个简单的代码示例所蒙蔽。 JetS3t 库的扩展性非常强。例如,您可以快速确定拥有多少存储段 —— 只需通过 listAllBuckets 调用请求一个 S3Service 实例即可。该方法返回一个 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(以及 Amazon S3 RESTful API)公开了许多信息,供您创建对象时使用。我们知道,您还可以提供访问控制列表。 S3 中的任何对象都可以保存 API 允许您创建的其他元数据。之后可以通过该元数据的 S3 API(以及派生的 JetS3t)查询任何对象。

创建对象的 URL

到现在为止,我的 S3 实例有一个包含影片的存储段。实际上,我的影片可以通过以下 URI 获取:http://bc50i.s3.amazonaws.com/nerfwars2.mp4 。但是,只有我才能获取。(在本例中,我只能通过编程方式访问它,因为与所有内容关联的默认访问控制被设置为拒绝任何未授权访问)。我的目的是为选择的用户提供一种方式查看新影片(在有限的时间内),直到我开始收取访问费用(S3 也会提供帮助)。

图 1 展示了默认的访问控制。返回的 XML 文档(相应地显示在我的浏览器中)告诉我对当前资产的访问被拒绝(http://bc50i.s3.amazonaws.com/nerfwars2.mp4)。

创建一个公共 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%3D

现在,通过该 URL,可以在浏览器中获得图 2 所示的内容:

图 2. 用于下载的 URL

这个过程是不是很简单?通过几行代码,我在云中创建了一个安全资产,该资产只能通过特殊的 URL 下载。

利用 S3 完成时间敏感型下载

如果您的带宽和存储需求不稳定,则 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 云中的资产遍布全世界,那么为各个位置提供内容的速度将会更快。更重要的是,由于您的资产分布在各种机器上,您的数据在一些机器(或部分网络)瘫痪时也能保持高可用性。

一言以蔽之,Amazon S3 的好处很简单:低成本、高可用性、安全。除非您是一个 SAN 专家,喜欢维护硬件资产来存储数据内容,但是 Amazon 可能比您做的更好。在资金紧张的时候,为什么还要将自己的资金提前预支在硬件上呢(不要忘了,硬件会随时间贬值)?

更多关于云的知识和产品请到纵横数据官网上了解www.zoneidc.com

马逊s3云存储接口_使用 Amazon S3 云服务轻松实现存储相关推荐

  1. 亚马逊 ec2 连接不上_在Amazon EC2上设置WordPress

    亚马逊 ec2 连接不上 The general consensus of opinion, is that self hosting a WordPress blog is the best way ...

  2. 亚马逊 ec2 连接不上_在Amazon EC2上轻松进行蓝绿色部署

    亚马逊 ec2 连接不上 Amazon EC2容器服务(ECS)是Amazon用于运行和编排Docker容器的解决方案. 它提供了一个接口,用于定义和部署可在EC2实例集群上运行的Docker容器. ...

  3. 马逊s3云存储接口_当对象存储“湖”有了强一致性

    从 2006年第一个云服务对象存储服务 Amazon S3 发布直到 2020年12月1日之前,S3 对象操作都是遵循 "最终一致性"原则,对象存储服务本身就是一个复杂的分布式系统 ...

  4. 亚马逊关键词搜索API接口(item_search-按关键字搜索亚马逊商品接口),亚马逊API接口

    亚马逊关键词搜索API接口(item_search-按关键字搜索亚马逊商品接口),亚马逊API接口可以获取到整个页面上看的到的数据,包括:商品ID,商品标题,商品图片,优惠价,价格,价格范围,销量,卖 ...

  5. 亚马逊商品详情API接口-(item_get-获得AMAZON商品详情接口),亚马逊详情API接口

    一.亚马逊商品详情API接口-(item_get-获得AMAZON商品详情接口),亚马逊详情API接口可以获取到商品价格,商品库存,商品销量,商品ID,商品图片,商品sku属性,sku详情,sku图片 ...

  6. 亚马逊账户锁定无法登陆_如何删除您的亚马逊账户

    亚马逊账户锁定无法登陆 Deleting your Amazon account is the only way to completely erase your purchase history. ...

  7. 关于amazon亚马逊SP-API申请注册,amazon亚马逊SPAPI开发人员资料注册,amazon亚马逊Selling Partner API申请注册详细指导

    关于amazon亚马逊SPAPI开发人员资料注册,amazon亚马逊开发人员资料申请注册,amazon亚马逊销售合作伙伴 API申请注册,amazon亚马逊SP-API申请注册,amazon亚马逊Se ...

  8. 马逊s3云存储接口_利用 S3tests 测试 S3 接口兼容性

    女主宣言 在对象存储迭代研发.测试过程中,为了方便.准确验证 S3 接口协议兼容性,本文作者对Ceph官方采用的兼容性测试工具s3-tests进行了调研,并对其配置以及使用做出了详细介绍,相信对于s3 ...

  9. 亚马逊 各国站点 链接_使用Amazon S3和HTTPS的简单站点托管

    亚马逊 各国站点 链接 by Georgia Nola 乔治亚·诺拉(Georgia Nola) 使用Amazon S3和HTTPS的简单站点托管 (Simple site hosting with ...

最新文章

  1. 如何给DataGrid添加自动增长列
  2. linux排除多个文件,linux – 通过排除其父文件夹为多个目录创建单个tar文件
  3. PyQt:如何给界面自定义背景?
  4. ssh 公钥登录远程主机
  5. 【学习笔记】操作系统之哲学原理
  6. Nginx技术研究系列7-Azure环境中Nginx高可用性和部署架构设计
  7. java设计模式 订阅模式_Java中的复合设计模式
  8. 第 2-4 课:克隆和序列化 + 面试题
  9. java quartz spring_JavaLib-quartz | 基于Spring Boot Quartz开发的定时任务
  10. elipse安装php
  11. 雷军恭喜苏炳添全运会夺冠:你是小米精神的最好代言
  12. LeetCode之有效的字母异位词
  13. Sparsity and Some Basics of L1 Regularization
  14. 怎么用计算机输出手机的密码,手机连接wifi后怎么看密码?手机连接wifi后看密码的方法-太平洋IT百科...
  15. 复制百度文库内容chrome插件
  16. 网页中插入视频的代码小技巧
  17. Java微信小微商户进件,已经解决接口暂无权限,稍后再试的问题
  18. 惠普服务器sd卡作用,HP服务器如何操作设置
  19. 部署ISA2006标准版防火墙
  20. Android 10.0强制所有app横屏显示

热门文章

  1. 飞桨第六课 2020.4.5
  2. CodeForces 982F. The Meeting Place Cannot Be Changed
  3. php随机获取文件夹,php从文件夹随机读取文件的方法
  4. export default用法vue_Vue组件通信—provide/inject
  5. 【如何利用idea提交本地代码到git远程仓库,史上最详细教程,建议收藏!】
  6. Tensorflow——[AttributeError:module tensorflow no attribute app]解决方案
  7. Nearest Interesting Number
  8. linux内核管理pagecache的一丢丢知识整理
  9. 【练习】2021下半年数据结构刷题笔记和总结 (一)(图和动态规划)
  10. Windows平台九点提升权限终极技巧