使用 AWS S3 与 Cloudfront

Posted

技术标签:

【中文标题】使用 AWS S3 与 Cloudfront【英文标题】:Use AWS S3 vs Cloudfront 【发布时间】:2014-10-14 20:42:57 【问题描述】:

由于 heroku 文件系统是短暂的,我计划将 AWS 用于我在 heroku 上的 django 项目的静态资产

我看到两篇相互冲突的文章,其中一篇建议使用 AWS S3。这个说要使用S3

https://devcenter.heroku.com/articles/s3

虽然下面的另一个说,S3 有缺点并使用 Cloudfront CDN 代替

https://devcenter.heroku.com/articles/using-amazon-cloudfront-cdn

许多开发人员使用 Amazon 的 S3 服务来提供静态服务 先前已手动或由某些人上传的资产 构建过程的形式。虽然这可行,但不建议这样做 S3 被设计为文件存储服务,而不是为了优化交付 正在加载的文件。因此,从 S3 提供静态资产并不是 推荐。

【问题讨论】:

【参考方案1】:

Amazon CloudFront 是一个内容分发网络 (CDN),它与 ​​S3 等其他 Amazon Web 服务相集成,使我们能够以低延迟、高数据传输速度将内容分发给最终用户。

CloudFront 使您的静态文件可从世界各地的数据中心(称为边缘站点)获取。当访问者从您的网站请求文件时,他或她会被无形地重定向到最近边缘位置的文件副本(现在 AWS 在全球拥有大约 35 个边缘位置),这比访问者从位于特定区域的 S3 存储桶访问了内容。

因此,如果您的用户群分布在世界各地,那么使用 CloudFront 是一个更好的选择,否则如果您的用户是本地化的,那么使用 CloudFront 与使用 S3 并没有太大区别(但在这种情况下,您需要为您的S3 存储桶:美国东部、美国西部、亚太地区、欧洲、南美等)

Comparative features of Amazon S3 and CloudFront

【讨论】:

CloudFront 的另一个好处是 CloudFront 允许您为 CloudFront 分配设置不同的域别名。即:您可以有 domain1.example.com、domain2.example.com 和 domain3.example.com指向相同的 CloudFront 分配,允许并行下载【参考方案2】:

我的建议是在 Whitenoise 之上使用 CloudFront。您将直接从 Heroku 应用程序提供静态资产,但一旦您达到规模,CloudFront 作为 CDN 将接管。

Whitenoise 从根本上简化了构建过程和使用复杂的缓存标头的需要。

阅读http://whitenoise.evans.io/en/latest/ 了解完整宣言。

(请注意,Whitenoise 仅与与您的应用捆绑的静态资产相关,而不与用户上传的文件相关,这些文件仍需要 S3 才能正确存储。但您仍然希望使用 CF。)

【讨论】:

我知道 Heroku 文档推荐 Whitenoise,但他们也建议 Repo 大小应 devcenter.heroku.com/articles/git#repository-size),这会改变您的建议吗?【参考方案3】:

实际上,您应该同时使用两者。

CloudFront 仅充当 CDN,这基本上意味着它将资源缓存在世界各地的边缘站点。为了使其工作,它必须首先从源位置下载这些资源,只要它们过期或尚不存在。

CloudFront 分配可以具有两种可能的源类型之一。 S3 或 EC2。在您的情况下,您应该将资产存储在 S3 中并将存储桶连接到 CloudFront 分配。使用 CloudFront 链接实际提供资产,使用 S3 进行存储。

这将确保最佳性能,以及正确且可扩展的负载处理。

希望这会有所帮助,如果您需要 cmets 部分的其他信息,请告诉我。

【讨论】:

以上是关于使用 AWS S3 与 Cloudfront的主要内容,如果未能解决你的问题,请参考以下文章

AWS EMR性能HDFS与S3

AWS上EC2与S3通过私有链接通信(同区)

Javascript AWS SDK S3上传方法与正文流生成空文件

AWS S3 同步与 JS/节点开发工具包

无法将 s3 与来自 aws lambda 的 ec2 文件夹同步

AWS S3 createPresignedPost 与 getSignedUrl。我应该使用哪一个从客户端上传各种文件?