Using Open Data with Amazon S3
目标
1.创建 Amazon S3 存储桶。
2.将对象上传到 Amazon S3。
3.创建存储桶策略来设置存储桶的权限。
4.为存储桶创建跨源资源共享 (CORS) 配置策略。
5.为静态网站托管配置存储桶。
6.使用 JavaScript 在静态网页上显示存储桶的内容。
要打开实验,请选择 Open Console(打开控制台)。
本实验中使用的服务 Amazon Simple Storage Service (Amazon S3) Amazon Simple Storage Service (Amazon S3) 是云中安全、可靠且高度可扩展的对象存储,通常用于备份和存储、应用程序或媒体托管、高流量网站托管或软件分发。
要充分利用 Amazon S3,你需要了解几个简单的概念: Amazon S3 将数据以对象的形式存储在存储桶中。对象由文件和描述该文件的任何元数据(可选)组成。 要在 Amazon S3 中存储对象,你需要将其上传到存储桶。上传对象时,你可以设置对象和任何元数据的权限。 存储桶是存储对象的容器。你可以有一个或多个存储桶。对于每个存储桶,你可以: 控制对存储桶的访问权限,定义谁可以在存储桶中创建、删除和列出对象。 查看存储桶及其对象的访问日志。 选择 Amazon S3 存储存储桶及其内容所在的地理区域。 你可以创建文件夹以将存储桶中的对象分组。你还可以嵌套文件夹(在文件夹中创建文件夹)。如果你用过 Amazon S3 API 或其他实用程序,则可以参阅使用文件夹在 Amazon S3 控制台中组织对象,学习一些有关如何对文件夹应用其他分组惯例的重要知识。 在 Amazon S3 上发布数据 假设你有个数据集,想要对外共享。如果你没有 Web 服务器,会如何共享?如果数据集非常小,你可以通过电子邮件发送给他人或通过文件共享服务使其可用。但如果有许多数据,则你需要使用更复杂的方式。 幸运的是,Amazon S3 提供了一种非常灵活的解决方案,可以随时在 Web 上的任何位置存储和检索任意数量的数据。Amazon S3 就像用于存储数据的 Web 服务器,但不需要你维护 Web 服务器或为其付费。在 Amazon S3 上存储数据时,你只需支付数据存储以及任何请求和数据传输的费用。 Amazon S3 上提供的数据文件可以通过简单的 HTTP 终端节点进行访问,这使人们能够以编程方式轻松访问。在 Amazon S3 上发布数据还便于使用 Amazon Web Services 的计算和数据分析产品(如 Amazon EC2 或 Amazon Redshift)进行分析。
我现在向你展示一种使用 Amazon S3 使任何人都能通过 Web 浏览器访问数据的方法。
本实验中未使用的 AWS 服务 本实验中使用的 AWS 服务功能仅限于实验所需的功能。如果访问其他服务或执行本实验指南中未描述的操作,可能会出现错误。
任务 1:创建 Amazon S3 存储桶
Amazon S3 中的每个对象都存储在存储桶中。
在本任务中,你将在 Amazon S3 中创建存储桶来存储数据和网站。
Region(区域):从下拉菜单中选择 US East (N. Virginia) us-east-1(美国东部 (弗吉尼亚北部) us-east-1)。
在 AWS 管理控制台顶部的搜索栏中,搜索并选择 S3。
选择 Create bucket(创建存储桶),然后进行以下配置:
Bucket name(存储桶名称):在文本框中输入 websiteNUMBER。 使用随机数字替换 NUMBER。 将存储桶的名称复制到文本编辑器中。 在 Object Ownership(对象所有权)部分,进行以下配置: ACLs enabled(ACL 已启用) Object writer(对象写入器) 选择 Create bucket(创建存储桶)。 注意:每个 Amazon S3 存储桶必须具有唯一的名称。
Amazon S3 创建存储桶后,控制台将在存储桶列表中显示存储桶名称。
任务 2:上传文件
现在,你可以将文件上传到存储桶。在本任务中,你将上传一组示例文件。
下载以下文件:sample-files.zip(https://us-west-2-tcprod.s3.us-west-2.amazonaws.com/courses/spl-60/v2.2.10.prod-d961811d/scripts/sample-files.zip)
找到你下载的 sample-files.zip 文件,然后解压。这将创建一个包含多个文件的文件夹。
在 Amazon S3 控制台中,选择你在上一任务中创建的 websiteNUMBER 存储桶的链接。
选择 Upload(上传)。
选择 Add files(添加文件)。
此时将显示一个文件选择对话框。 浏览到通过 zip 格式文件创建的 sample-files 文件夹。
选中所有文件,然后选择 Open(打开)(适用于 Windows)或 Open(打开)(适用于 Mac)。
选择 Upload(上传)。
页面底部的状态栏会显示上传进度。验证文件上传成功。
任务 3:授予对存储桶的访问权限
现在,文件已作为对象上传到 Amazon S3 存储桶中。使用“对象”一词是因为文件存储在文件系统中,但 Amazon S3 实际上是对象存储系统。虽然它的行为类似于计算机上的文件系统,但实际上它具有更多的功能。
默认情况下,存储在 Amazon S3 中的对象是私有的。
有关对象的信息将出现在屏幕上,包括: Etag:MD5 校验和,可用于确认对象是否已正确上传。 Storage class(存储类):表示存储对象的持久性和成本。 Server side encryption(服务器端加密):对象存储在 Amazon S3 上时是否加密。 Size(大小):存储的对象的大小。 Object URL(对象 URL):指向互联网上对象的链接。请注意,该 URL 包含存储桶的名称。
打开 websiteNUMBER - S3 bucket(websiteNUMBER – S3 存储桶)的浏览器标签页。
在页面顶部,选择 Buckets(存储桶)返回到存储桶列表。
选择 websiteNUMBER 存储桶的链接,查看其详细信息。
选择 Permissions(权限)选项卡。
导航到 Block public access (bucket settings)(屏蔽公共访问权限 (存储桶设置))部分,选择 Edit(编辑)。
取消选中 Block all public access(阻止所有公开访问)选项,然后将所有其他选项保留未选中状态。
安全:请注意,各个选项均保持未选中状态。取消选中所有公开访问选项时,你随后必须根据你的情况和安全目标选择各个选项。在生产环境中,建议尽可能设置最低允许权限。
选择 Save changes(保存更改)。
此时将打开一个对话框,要求你确认更改。在文本框中输入 confirm,然后选择 Confirm(确认)。
导航到 Bucket policy(存储桶策略)部分,然后选择 Edit(编辑)。
此时将打开 Bucket policy editor(存储桶策略编辑器)面板,你可以在相应字段中输入存储桶的策略。
复制编辑:将以下策略复制并粘贴到 Bucket policy editor(存储桶策略编辑器)中(但尚未保存):
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::BUCKET/*"
}
]
}
在该策略中,将 BUCKET 替换为存储桶的名称。将 /* 保留在存储桶名称之后! 注:* 是通配符,因此在存储桶名称末尾添加 /* 会将此策略应用于存储桶中的所有对象。 通过添加特定文件夹的路径,你可以将策略限制到该文件夹,而不是公开整个存储桶。例如:“arn:aws:s3:::BUCKET/FOLDER/” 该策略允许任何人(由委托人“”表示)从存储桶下载对象 (GetObject)。 选择 Save changes(保存更改)保存新的存储桶策略。 提醒:如果你在保存时收到错误消息,这可能是因为与存储桶名称不匹配。确保 Resource(资源)行中的存储桶名称与你之前创建的存储桶的名称(显示在窗口顶部)匹配。
你现在可以测试对象是否可以访问。
将 Object URL(对象 URL)链接复制到剪贴板。
打开一个新的浏览器标签页,粘贴 Object URL(对象 URL)链接,然后按 Enter 键。
你将打开文件
返回到打开 websiteNUMBER - S3 bucket(websiteNUMBER – S3 存储桶)页面的浏览器标签页。
任务 4:配置静态网站托管
Amazon S3 还能够为静态网站托管配置存储桶,这让你可以执行以下操作: 定义在用户访问网站但未指定特定 HTML 页面时应显示的默认页面。 定义在用户导航到不存在的页面时显示的错误页面。 定义将用户转到其他位置的其他页面的重定向。
在本任务中,你将激活静态网站托管并将其配置为使用上传中包含的 index.html 和 error.html 页面。
选择页面顶部的 Properties(属性)选项卡。
向下滚动至 Static website hosting(静态网站托管)部分,然后选择 Edit(编辑)。
在 Edit static website hosting(编辑静态网站托管)页面上,选择 Enable(启用),然后进行以下配置:
Index document(索引文档):在文本框中输入 index.html。(你必须输入这些值,即使它们已经显示为提示。) Error document(错误文档):在文本框中输入 error.html。 选择 Save changes(保存更改)。
再次导航到 Static website hosting(静态网站托管)部分,复制 Bucket website endpoint(存储桶网站终端节点)链接。
注意:这是指向新网站的链接。它应如下所示:
http://website-XXX.s3-website-us-west-2.amazonaws.com 打开一个新的浏览器标签页,粘贴 Bucket website endpoint(存储桶网站终端节点)链接,然后按 Enter 键。 index.html 页面将在新标签页中打开。
提醒:你还将在该页面上看到错误消息。这没关系!你还要进行一些配置。
预期输出:
在错误消息窗口中,选择 OK(确定)。 接着,测试 error.html 页面。
在浏览器的地址栏中,在先前 URL 的末尾键入额外的字符以转到不存在的页面。 例如:
http://website-XXX.s3-website-us-west-2.amazonaws.com/wrong 注意:error.html 页面将显示一条消息 We’re sorry…(抱歉…)。此错误页面也称为 404 页面,因为错误 404 表示未找到页面。
预期输出:
你现在需要完成最后几个网站配置步骤!
任务完成:你已成功在 S3 存储桶上配置静态网站托管。
任务 5:启用跨源资源共享
你还能以编程方式访问 Amazon S3 存储桶。这允许存储桶中的对象在 Web 页面中显示,而用户甚至不知道这些对象来自 Amazon S3。
为了演示这一概念,你上传的 index.html 页面将使用 JavaScript 动态读取存储桶的内容并向访客显示对象列表。为此,你必须启用跨源资源共享 (CORS)。浏览器通常会阻止 JavaScript 允许请求读取存储桶的内容,但通过 CORS,你可以将存储桶配置为明确允许 JavaScript 执行此操作。
在本任务中,你将定义 CORS 配置以允许对存储桶进行跨源请求。CORS 配置是 XML 文档,其中包含可标识允许访问存储桶的源的规则、它支持对每个源执行的操作(HTTP 方法)以及其他特定于操作的信息。
注意:跨源资源共享 (CORS) 为在一个域中加载的客户端 Web 应用程序定义了一种与另一个域中的资源进行交互的方法。借助 CORS 支持,你可以使用 Amazon S3 构建丰富的客户端 Web 应用程序,并有选择地允许跨源访问 Amazon S3 资源。
将 We’re Sorry…(抱歉…)浏览器标签页保持打开状态。你很快还会用到它。
切换回打开 websiteNUMBER - S3 bucket(websiteNUMBER – S3 存储桶)页面的浏览器标签页。
向上滚动到页面顶部,然后选择 Permissions(权限)选项卡。
导航到 Cross-origin resource sharing (CORS)(跨源资源共享 (CORS))部分,然后选择 Edit(编辑)。
复制编辑:复制以下策略,然后将其粘贴到编辑器中:
[
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"GET"
],
"AllowedOrigins": [
"*"
],
"MaxAgeSeconds": 3000
}
]
安全:这是非常基本和宽松的 CORS 配置,但 Amazon S3 支持广泛的配置选项。建议你始终尽可能使用最宽松的策略。
选择 Save changes(保存更改)。 还差最后一个步骤,即允许以编程方式列出存储桶。
导航到 Access control list (ACL)(访问控制列表 (ACL))部分,然后选择 Edit(编辑)。
对于 Everyone (public access)(所有人 (公有访问权限)),选择 List(列出)。
导航到页面底部,然后选择 I understand the effects of these changes on my objects and buckets(我了解这些更改对我的对象和存储桶的影响)。
选择 Save changes(保存更改)。
提醒:Access control list (ACL)(访问控制列表 (ACL))部分将会出现一条警告:AWS doesn’t recommend granting access to the Everyone grantee(AWS 不建议授予每个被授与者访问权限)。这在意料之中,因为你有意添加了公开访问权限。
你现在可以测试应用程序!
返回到 Web 浏览器中的 Error - 404 Not Found(错误 – 404 未找到)标签页,然后选择 try visiting our home page(尝试访问我们的主页)链接以返回到应用程序。 注意:如果你找不到该标签页,请选择 Properties(属性)选项卡的 Static website hosting(静态网站托管)部分中显示的 Bucket website endpoint(存储桶网站终端节点)URL。
预期输出:
注意:该页面包含应用程序的文档,页面底部列出了存储在 Amazon S3 存储桶中的对象。
任务完成:你已成功为 S3 存储桶启用跨源资源共享 (CORS)。
了解网站
你可以随时查看 index.html 文件的源代码。这是静态 HTML 文件,但是可以通过使用多个 JavaScript 插件和自定义 JavaScript 来显示 HTML 表中 Amazon S3 存储桶的内容,使其变为动态文件。JavaScript 包含了有助于你了解应用程序的注释。
虽然本实验不要求你了解如何编写 JavaScript、HTML 或 CSS,但下面列出了 index.html 文件有趣的几个方面。 The AWS SDK for JavaScript index.html 页面在浏览器中使用 AWS SDK for JavaScript 来动态查询 S3 存储桶的内容。 JavaScript SDK 允许轻松地在 S3 存储桶中列出对象。该代码会执行以下操作:
链接到 AWS JavaScript SDK。
使用默认的 AWS 区域 us-west-2 配置 SDK。
创建并初始化 Amazon S3 对象。
通过 Amazon S3 对象,对 Amazon S3 进行未经身份验证的 listObjects 调用。
聚合生成的对象列表。
在有更多结果时按需反复调用 listObjects。 为了简单起见,该代码在查询存储桶时不会要求提供凭证,而是会对 Amazon S3 API 进行未经身份验证的调用。也就是说,这仅适用于公开可读的存储桶。因此,你需要设置存储桶的权限,以允许任何人列出存储桶的内容。
上述最后一点需要注意,因为 listObjects 每次仅会返回 1,000 个对象。因此,JavaScript 代码将持续查询存储桶,以查看是否有更多对象要检索。该代码已在包含 10,000 多个对象的存储桶上进行测试,没有遇到任何问题,但如果你尝试显示包含大量对象(例如,超过一百万个对象)的存储桶的内容,则可能会使浏览器超载。
JavaScript 每次只查询某个存储桶级别的对象。也就是说,它仅查找存储桶根目录中的对象,但不查找文件夹中的对象,除非你选择文件夹。
其他功能 index.html 页面的运作依赖于以下这些库:
JQuery这是一种常见的 JavaScript 库,用于创建基于浏览器的应用程序
Bootstrap用于 CSS 样式
Font Awesome用于矢量图标
DataTables用于表组织、筛选和排序
Bootbox用于弹出对话框和提醒,与 Bootstrap 配合使用
Moment用于时间格式(例如“2 天前”、“去年”)