【问题标题】:Storing files in amazon s3 and giving public URLs to users在 amazon s3 中存储文件并向用户提供公共 URL
【发布时间】:2020-04-23 17:58:24
【问题描述】:

我的网站上有图片上传功能 - 我将图片直接上传到 s3 存储桶。我所做的是公开该存储桶,在我的网站上获取图像并使用来自 s3 存储桶的图像的公共链接将它们显示为 html img 标签。

我网站的用户会将这些图片(可能作为链接)用于他们的网站。我可以在这里看到几个问题:

  • 图片链接是指向 aws 的直接链接
  • 整个桶都是公开的
  • 会有很多不可预知的读取

在此处使用 cdn 是一个更好的主意(可能是 cloudfront)。但是如何将 cdn 集成到这个过程中?

我可以直接将图片上传到 cdn,而不将它们存储在 s3 中吗?如果我有 cdn,为什么还需要 s3?

有什么建议吗?非常感谢!

【问题讨论】:

  • S3 是存储,CDN 是前端,所以通常您需要存储才能拥有 CDN 支持(或前端)的东西。
  • 如果您已公开存储桶,那么是的,任何人都可以访问这些对象。如果您希望控制访问,请遵循以下建议:My S3 Bucket Policy only applies to some Objects
  • 这些对象应该可供任何人查看。我担心如果人们生成太多读取以及 URL 的成本(如果我更改我的 aws 帐户的区域并且所有图像 url 将突然具有不同的域?)

标签: php laravel amazon-web-services amazon-s3


【解决方案1】:

仍然需要 S3,因为 Cloudfront 使用 S3 作为其来源。 S3 仍然是数据存储,但 Cloudfront 在边缘缓存这些对象。

查看此walkthrough,了解如何添加 Cloudfront 发行版以缓存您的静态文件。

这将允许您将自己的 url 用于静态内容,并限制通过 Origin Access Identity 直接访问 S3

【讨论】:

    【解决方案2】:

    正如已经回答的那样,cloudfront 需要一个“来源”并且通常键入该来源是 S3,因此您不能只使用 cloudfront - 图像需要存在于某个地方。

    您可以采取的一项预防措施(如果您是,从您的问题中不清楚 - 您说链接是“直接到 aws”),是在您自己的域名下提供所有这些图像 - 直接来自 s3,或者使用cloudfront - 现在这样做将确保如果您确实需要切换存储图像的位置,您的客户将无需更改他们的链接,并且该过程对他们来说是无缝的。

    【讨论】:

    • 非常感谢!这是一个非常好的和有帮助的观点。所以我应该让一个休息端点接受文件名作为参数,并从 s3 返回内容作为响应,然后使用该端点作为绝对图像链接?这是一个好习惯吗?在这种情况下,我的服务器将充当图像的代理。
    • 我会使用绝对链接,只要它是直接从您自己的域提供的,我认为没有缺点。一个 api 休息端点增加了不必要的复杂性 imo。
    猜你喜欢
    • 2016-06-07
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 2021-09-08
    • 2018-04-04
    • 2014-01-28
    • 1970-01-01
    相关资源
    最近更新 更多