在 Amazon S3 上创建一个简单的公共文件存储库 存储博客
在亚马逊 S3 上创建简单的公共文件库
关键要点本篇文章介绍了如何在 Amazon S3 上创建一个简单的公共文件库,重点讲解了如何设置架构、部署和测试整个解决方案。通过使用 S3 和 CloudFront,这种方案不需要额外的网络服务器基础设施。
组织通常需要在网上存储和传输各种静态内容,例如数据集、档案和文件库。最终用户通常可以访问这些内容以进行研究和分析,或用于一般内容分发。然而,如何以用户友好且易于浏览的方式呈现这些内容往往是一个重大挑战,特别是在处理大体量数据、高流量或复杂文件结构时。
过去,组织通常需要设置 FTP 服务器或配置 Apache 的 DirectoryIndex 或 Nginx 的 Autoindex 等网络服务器功能来创建可浏览的目录列表。如今,越来越多的组织选择亚马逊简单存储服务 (S3)作为其静态网页内容的存储解决方案,并结合亚马逊 CloudFront提供高度可扩展、成本优化且无服务器的解决方案以发布内容。
在本文中,我将逐步讲解如何在 Amazon S3 存储桶中部署一个简单的基于网页的文件浏览器解决方案。该方案利用 S3 和 CloudFront 提供一个用户友好的界面,用于浏览存储桶的内容,消除了部署和维护额外网络服务器基础设施的需求。我还将介绍快速将数据移动到公共 S3 存储桶中的方法、使用您自己的域名自定义解决方案,以及调整外观以符合您组织的品牌要求。
设置简单公共文件库的解决方案概述与架构
该解决方案使用托管在 Amazon S3 上的静态网站,并由 CloudFront 提供支持。部署完成后,用户可以将希望在公共互联网发布的文件上传到一个特别配置的“公共文件” S3 通用存储桶。当用户访问文件浏览器应用程序的 URL 时,应用程序会列出 S3 存储桶的内容,并以传统的文件浏览器层次格式渲染结果。
最终用户从 CloudFront 和 Amazon S3 加载网页。页加载后,浏览器静默地从亚马逊 Cognito中检索临时凭证。浏览器使用 Cognito 中的凭证列出公共“文件” S3 存储桶中的文件。然后,文件列表在浏览器中以传统的文件浏览器/目录索引形式呈现。可选地,用户可以选择所列的文件之一,通过 CloudFront 和 Amazon S3 下载它。先决条件
在本教程中,您需要具备以下先决条件:
一个 AWS 账户 已安装并配置受托服务器无缝应用模型 (AWS SAM CLI) Python 311 版本已安装并在您的 PATH 变量中 选择支持所需服务的 AWS 区域。大多数 AWS 区域均已支持,但请参考可用性页面获取详细信息。 亚马逊 CloudFront包括 标准日志支持 亚马逊 S3 亚马逊 Cognito AWS CloudFormation AWS Lambda设置简单公共文件库的解决方案:逐步指南
该解决方案通过 AWS 无缝应用模型 (AWS SAM) 命令行界面 (CLI) 进行自动化部署。

AWS SAM CLI 是一款开源命令行工具,用于本地构建、测试、调试和部署使用 AWS SAM 模板 定义的无服务器应用程序。
下载源代码并在本地解压:AWS Samples publicfilebrowserforamazon S3。
构建和部署堆栈
在终端中,导航到下载代码库中的 /sam/ 目录。
运行以下命令以构建并打包项目以进行部署:
bash sam build
将 SAM 模板部署到您的账户。向导将引导您完成部署 SAM AWS CloudFormation 的过程。有关此过程的详细信息,请参阅 SAM 构建文档。a 运行以下命令:
bash sam deploy guided capabilities CAPABILITYNAMEDIAM
b 输入部署参数的值:
i Stack Name:选择一个唯一的 CloudFormation 堆栈名称。最终用户不会看到这个。 ii AWS Region:在先决条件部分中选择的支持的 AWS 区域。 iii SiteName:网站的公开可见标题,将显示在页面顶部和标题栏中。 iv FilesOpenTabMode:您希望浏览器在用户选择文件时,以以下接口值做出何种反应。为了获得一致的用户体验,推荐选择 In New Tab 而不是 In Same Tab。 v VisibleStorageClasses:要显示的存储类的逗号分隔列表。建议保持默认。 vi CrossOriginRestriction:浏览器安全设置,首次部署时设置为 ,然后查看步骤 6。
c 对于剩余项目选择默认输入,最后在部署前的提示为:
bash Deploy this changeset
等待部署完成。此过程大约需要五分钟,然后会出现最终提示:bash Successfully created/updated stack [STACKNAME] in [REGION]
部署完成后,请记下 Outputs 部分中的以下条目。a FileBrowserURL:这是公共 界面的 URL。需要在步骤 6 中使用。 b PublicFilesBucket:用于存放可供用户浏览的公共文件的 S3 存储桶的名称。 c WebInterfaceAppBucket:存储运行文件浏览器网页界面的代码的 S3 存储桶名称。
重要:重复步骤 3 和 4,保持所有值不变,除了 CrossOriginRestriction 参数,并输入步骤 5 中 FileBrowserURL 输出的值。例如:bash Parameter CrossOriginRestriction [] https//d111111abcdef8cloudfrontnet
现在,亚马逊 S3 公共文件浏览器的网络应用程序部署完成。AWS SAM CLI 使用 CloudFormation 来协调前端静态网站和公共文件存储 S3 存储桶的部署。
您还可以选择通过登录到 AWS 管理控制台,导航到 CloudFormation 服务,选择在之前的部署中选择的 CloudFormation 堆栈名称,并选择 Resources 选项卡来查看已部署的资源。
设置简单公共文件库的解决方案:测试解决方案
在此测试阶段,您将内容上传到作为此解决方案一部分配置的“公共文件” S3 存储桶。在上传后,您将浏览公共 URL,并验证上传的文件是否列出。
登录到 S3 控制台,导航到您的存储桶列表,并选择与步骤 5 中 PublicFilesBucket 输出值相匹配的 Amazon S3 存储桶。S3 存储桶名称应为 publicfilebrowserfiles[]。选择 Upload 按钮。选择您希望上传以测试解决方案的文件。默认情况下,S3 对象和资源是私有的。然而,此解决方案有一个特殊配置的存储桶,允许所有内容公开访问。您可以查看页面上的其他选项。默认选项适用于大多数用例,并包括为存储文件提供自动加密。在页面底部选择 Upload。
等待上传完成并显示成功状态。上传所需的时间取决于网络连接速度和测试文件的数据大小。
选择 Close 按钮以返回 S3 存储桶内容,并验证新文件是否出现。最后,访问亚马逊 S3 的公共文件浏览器网页界面,输入步骤 5 部署输出中的 FileBrowserURL 值。上传的文件将在 界面中列出。下一步
随着亚马逊 S3 公共文件浏览器解决方案的全面部署和测试,下一步是通过添加您自己的文件来定制该解决方案。您还可以将该解决方案移动到您的 DNS 域名,或修改用户界面。如果想进一步定制该解决方案,请参阅以下资源。
魔方加速器免费版如何快速将文件移动到 publicfilebrowserfiles[] 中?
从本地系统同步: 如何指南:使用 AWS CLI 批量上传文件到 Amazon S3使用 AWS CLI 的高层次 (s3) 命令使用 AWS DataSync 将数据同步到 Amazon S3对于大文件上传: 如何使用 AWS CLI 将大文件分块上传到 Amazon S3?如何优化上传大文件到 Amazon S3 时的性能?如果您的文件已经在其他 Amazon S3 存储桶中: 如何将对象从一个 Amazon S3 存储桶复制到另一个存储桶?对于拥有数百万个文件的大型 Amazon S3 存储桶,请考虑使用 S3 批量操作如何使用我自己的 DNS 域名 (例如 publicfilesexamplecom),而不是 CloudFront 名称?
如何配置 CloudFront 使用替代域名通过 HTTPS 提供我的内容?请注意,您需要在 Amazon S3 中更新 files 和 website S3 存储桶的 跨源资源共享 (CORS) 规则。参见:通过添加备用域名 (CNAME) 使用自定义 URL如何修改公共用户界面,如添加文本、改变样式或添加我的徽标?
公共网站文件位于 publicfilebrowserwebsite[] 存储桶中。这些文件可以下载、修改并重新上传,包含自定义内容。请注意,CloudFront 会缓存这些文件,因此在更新文件时,您必须创建失效以清除缓存。有关详细信息,请参见 如何从 CloudFront 删除缓存文件?如果您选择在之后的部署中更新源代码库的 /website/ 目录中的文件,则必须按照存储库的 READMEmd 文件中的说明更新 /sam/seeds3data/websitezip。安全的额外考虑
作为最佳实践,该解决方案启用以下功能:
Amazon CloudWatch 分发访问日志存储在 S3 存储桶中:publicfilebrowserlogging[]Amazon S3 存储桶访问日志静态网站和上传的图像 存储在 S3 存储桶中:publicfilebrowserlogging[]亚马逊 S3 版本控制此功能对所有 S3 存储桶启用,例如用于存储公共文件的主要 publicfilebrowserfiles[] 存储桶。这意味着写入 S3 存储桶的所有数据都将保留为“以前版本”,即使被覆盖或删除。您将发生用于存储对象先前版本的费用。如果您期望频繁替换或更新同名文件,则应根据生命周期配置配置 S3 存储桶以使不当前的对象版本过期。请参见 如何为非当前对象版本创建 Amazon S3 生命周期配置规则?为存储在 Amazon S3 中的所有对象启用默认加密默认 TLS 版本选项 (TLSv1)为简化部署,本解决方案使用默认 CloudFront 域和证书,将可用的 TLS 版本选项限制为 TLSv1。要使用其他受支持的 TLS 版本,请按照上面的说明使用自定义域名、新证书,并配置 CloudFront 分发上的 安全策略。清理
这是一个无服务器解决方案,因此成本直接与使用相关仅需几美分的月费用于存储网站源代码。当 不 使用时,维护此应用程序的持续成本在于存储在网站、公共文件和日志 S3 存储桶中的数据。此外,访问网站的用户也会产生费用,例如 CloudFront 数据传输和 Amazon S3 LIST/GET 请求费用。值得注意的是,Amazon S3 数据传输到 CloudFront 不收取费用。
为避免产生未来费用,请遵循以下说明以删除此解决方案创建的资源:
在控制台中,导航到 CloudFormation 并选择在本帖部署部分指定的堆栈名称。在控制台顶部选择删除,并在弹出确认框中再次选择删除以开始删除堆栈。此过程大约需要五分钟。如果网站和公共文件的 S3 存储桶中仍然存在内容,则可能会导致 CloudFormation 堆栈删除失败。您可以选择无论如何删除堆栈,从而保留这些资源,或手动清空这些 S3 存储桶,然后再尝试删除。清空并删除存储应用程序访问日志的日志 S3 存储桶。默认情况下,这些内容保