亚马逊开店pdf
编者注: Amazon S3(简单存储服务)是Amazon Web Services提供的Web服务。 Amazon S3通过Web服务接口(REST,SOAP和BitTorrent)提供存储。
亚马逊并未公开S3设计的细节,尽管它显然使用对象存储架构来管理数据。 据亚马逊称,S3的设计旨在以商品成本提供可扩展性,高可用性和低延迟。
S3旨在在给定的一年中提供99.999999999%的耐用性和99.99%的对象可用性,尽管没有有关耐用性的服务级别协议。 (来源: 维基百科 )
现在,我们提供了全面的指南,以便您可以开发自己的基于Amazon S3的应用程序。 我们涵盖了广泛的主题,从设置和配置到API使用和定价。 有了本指南,您将能够在最短的时间内启动并运行自己的项目。 请享用!
介绍
尽管亚马逊的网上商店多年来增长,但对可伸缩的IT基础架构的需求日益迫切。 这使亚马逊可以创建自己的基于服务的基础架构。 在寻找新的商业模式时,亚马逊是最早向客户提供自己的业务构建服务的先驱之一。
因此,Amazon S3是一项存储服务,旨在存储“随时随地在网络上的任何数量的数据”。 它提供了易于使用的Web服务界面,应用程序开发人员可以将其用于不同的用例。 项目可以将其网页以及应用程序所需的工件存储在Amazon S3上。 除此之外,应用程序可以在S3中存储使用数据。 亚马逊还将存储服务集成到其他服务中,因此也可以将S3中存储的数据用于分析调查或面部识别。
资料模型
在Amazon S3内部存储数据的基本单位是“对象”。 对象由丰富了元数据的实际数据组成。 元数据是一组名称-值对,它们提供有关对象的其他信息。 在默认信息(如上次修改日期)旁边,此信息还提供标准的HTTP元数据(如Content-Type)。 还可以提供用户定义的元数据,例如用于创建此对象的应用程序。
对象按存储桶组织。 您可以将存储桶视为共享相同名称空间的对象的集合。 存储桶也用于访问控制,使用情况报告和转移费用。 例如,图像文件geek.jpg
位于在桶javacodegeeks
有URL http://javacodegeeks.s3.amazonaws.com/photos/geek.jpg
。
当存储桶跨越命名空间时,存储桶中的每个对象都有唯一的键。 因此,“ Web服务终端节点+存储桶+密钥+版本”的组合标识了Amazon S3中的一个对象。 在javacodegeeks
作为存储桶之前的示例中, s3.amazonaws.com
是Web服务端点,而photos/geek.jpg
是密钥。 该版本是可选的,可以省略。
尽管Amazon声明您可以从世界任何地方访问数据,但是对于许多应用程序而言,了解数据所在的位置至关重要。 因此,您可以选择存储桶所在的区域。 这有助于最终用户优化延迟时间并满足法规要求。 当前提供以下区域:
- 美国东部(弗吉尼亚北部)
- 美国东部(俄亥俄州)
- 美国西部(加利福尼亚北部)
- 美国西部(俄勒冈州)
- 加拿大(中部)
- 亚太地区(孟买)
- 亚太地区(首尔)
- 亚太地区(新加坡)
- 亚太地区(悉尼)
- 亚太地区(东京)
- 欧盟(法兰克福)
- 欧盟(爱尔兰)
- 欧盟(伦敦)
- 南美洲(圣保罗)
存储桶中密钥的更新是原子的。 这意味着该操作要么成功并且所有数据都被写入,要么不成功并且没有数据被写入。 该操作的原子性保证了在出现问题时不会遗留任何损坏的数据。 由于写入密钥的数据是在Amazon的计算机上分布的,因此成功的写入操作也意味着该数据已在Amazon集群中复制,并且可以防止集群中的计算机发生故障。
但是由于有关新数据的信息必须分布在整个群集上,因此修改后的操作可能不会反映更新。 例如,在将新对象添加到存储桶之后,存储桶内容的列表可能不会返回新对象。 发生这种情况的另一种方法是,删除对象后,该对象仍被列为存储桶的成员。 另一种情况是数据被更新并在更新后直接读取。 在这种情况下,该进程可能仍会读取旧数据。
Amazon S3不支持对象锁定。 这意味着,如果您的应用程序需要保护现有对象免受其他进程的修改,则必须在自己的应用程序中实现此功能。 随后对不同对象(也称为事务)的更新也是如此。 由于Amazon S3不提供任何种类的交易行为,例如,将数据从一个密钥移动到另一个密钥可能会导致以下状态:成功在新位置创建了数据,但随后删除旧密钥失败。
如果该数据易于复制,例如缩略图,则可以使用Amazon S3的“减少冗余存储”(RRS)选项。 RRS降低了存储成本,但同时没有将数据复制到没有该选项的情况下那样多的不同存储设备。 启用RRS后,预期的数据丢失率为每年对象的0.01%,这可以接受,具体取决于具体的用例。
用法
蜜蜂
Amazon S3为开发人员提供了两种不同的API:REST接口和SOAP接口。 虽然不赞成使用HTTP上的SOAP,但仍支持HTTPS上的SOAP。 但是新功能可能无法通过SOAP获得,因此Amazon建议使用REST接口。 通过REST,应用程序使用标准的HTTP请求(例如GET,PUT等)来下载或上传数据。 亚马逊甚至在数据检索期间将对象的元数据放入HTTP标头中。
建立
现在,我们已经了解了Amazon S3的概念,我们可以开始构建第一个应用程序。 作为构建系统,我们使用3.x或更高版本的Apache Maven 。
这使我们能够直接从原型创建项目:
mvn archetype:generate -DgroupId=com.javacodegeeks -DartifactId=amazon-s3 -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
这将创建以下目录结构:
amazon-s3
|-- pom.xml
`-- src
第一步,我们在项目的根目录中编辑pom.xml文件,并添加以下依赖项:
<properties>
<aws-sdk.version>1.11.86</aws-sdk.version>
<google-guava.version>19.0</google-guava.version>
<junit.version>4.12</junit.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-core</artifactId>
<version>${aws-sdk.version}</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
<version>${aws-sdk.version}</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${google-guava.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
</dependencies>
如您所见,我们添加了Amazon提供的两个工件aws-java-sdk-core
和aws-java-sdk-s3
。 它们包含AWS的核心功能以及与S3服务进行通信的Java类。 此外,我们添加了Google的Guava库和junit库,以进行单元测试。
添加了必要的依赖关系之后,我们添加了一个build
部分,该部分定义了我们的类文件的目标版本,并使用maven-assembly-plugin
构建了一个包含所有依赖关系的jar。 这样,我们以后可以通过仅在类路径上提供一个jar来简单地启动应用程序( java -cp target\amazon-s3-1.0-SNAPSHOT-jar-with-dependencies.jar ...
):
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.javacodegeeks.App</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
现在,您可以调用该构建并创建一个仅输出“ Hello World!”的简单jar应用程序:
>mvn package
>java -jar target/amazon-s3-1.0-SNAPSHOT-jar-with-dependencies.jar
Hello World!
现在,我们的Java应用程序已设置完毕,我们可以创建一个AWS账户。 如果您已经拥有一个AWS账户,则可以跳过以下步骤,直接登录到AWS控制台。 要创建一个新的AWS账户,请将浏览器指向以下URL: https : //aws.amazon.com/s3 ,然后单击“注册”:
填写您的电子邮件地址,然后单击“使用我们的安全服务器登录”。 这将带您进入下一页,在此页面中,您必须输入名称,重新输入电子邮件地址并输入密码。
在下一页上,您将必须提供联系信息:
要完成注册过程,以下页面将要求您提供付款信息,验证您的身份并要求支持计划。 最后,您可以确认所有输入并创建一个AWS账户。
认证方式
注册了Amazon S3之后,现在该创建一个专用用户了。 可以通过AWS控制台搜索“ IAM”(这是“身份和访问管理”的简称)来完成。 这将带您到以下屏幕:
单击“添加用户”,可以输入用户名及其访问类型:
由于我们将要创建的用户仅应与S3 API进行交互,因此我们不需要选中“ AWS管理控制台访问”选项,而只需选中“编程访问”选项。 在以下屏幕上,我们将用户添加到名为“ s3group”的新组中。 通过单击“创建组”并提供组的名称以及选择权限集“ AmazonS3FullAccess”来完成此操作:
在下一页上,您可以查看更改并保存。 在此页面上,您还将看到新用户的访问密钥和秘密密钥。
Amazon S3 SDK可以从在OS用户主目录中创建的配置文件读取您帐户的凭证,该文件位于以下位置:
- 在Linux,OS X或Unix上
~/.aws/credentials
- Windows上的
C:\Users\USERNAME\.aws\credentials
该文件包含以下格式的访问密钥ID和秘密访问密钥:
[default]
aws_access_key_id = <your_access_key_id>
aws_secret_access_key = <your_secret_access_key>
为了进行测试,将凭据作为环境变量提供也很方便。 在Linux,OS X和Unix上,可以通过以下方式设置它们:
export AWS_ACCESS_KEY_ID=<your_access_key_id>
export AWS_SECRET_ACCESS_KEY=<your_secret_access_key>
在Windows系统上,可以这样进行:
set AWS_ACCESS_KEY_ID=<your_access_key_id>
set AWS_SECRET_ACCESS_KEY=<your_secret_access_key>
Java SDK甚至支持通过系统属性来设置访问密钥ID和秘密访问密钥:
java -Daws.accessKeyId=<your_access_key_id> -Daws.secretKey=<your_secret_access_key> -jar <your.jar>
如果您有多个访问密钥,则可以将它们存储在配置文件的不同部分中:
[default]
aws_access_key_id=<your_access_key_id>
aws_secret_access_key=<your_secret_access_key>
[profile2]
aws_access_key_id=<your_access_key_id>
aws_secret_access_key=<your_secret_access_key>
在这种情况下,你选择配置文件来告诉它的名字被用来