繁体   English   中英

S3 公共访问替代方案

[英]S3 Public Access Alternatives

我学习 AWS 已经有一段时间了,有一件事让我很困惑。

假设我拥有一个像 Instagram 这样的应用程序(哈哈,但仍然如此),我的用户在我的应用程序上上传了很多图片。 现在我通过任何方式将它们存储在 s3 存储桶中。 现在图像安全地存储在 S3 上,图像的 URL 存储在我的数据库中,以便我的用户可以轻松地从应用程序访问图像。

现在,为了在任何地方都可以访问图像 [移动应用程序、桌面应用程序和 Web 应用程序],我必须公开存储桶及其中的所有图像,以便任何应用程序都可以通过 URL 访问图像。但是 S3 推荐我们不要公开存储桶及其内容。

我尝试不公开存储桶,只是设置了 CORS 配置,例如

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>https://www.trailer2you.herokuapp.com</AllowedOrigin>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>DELETE</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
<CORSRule>
    <AllowedOrigin>https://www.t2ytest-private.herokuapp.com</AllowedOrigin>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>DELETE</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
<CORSRule>
    <AllowedOrigin>https://www.t2ybeta.herokuapp.com</AllowedOrigin>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>DELETE</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <ExposeHeader>Access-Control-Allow-Origin</ExposeHeader>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

但这也行不通。 所有应用程序都可以通过 URL 访问图像的唯一方法是通过如下策略公开存储桶及其所有内容

{
    "Id": "Policy1598785179613",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1598785170418",
            "Action": [
                "s3:GetObject"
            ],
            "Effect": "Allow",
            "Resource": "{my ARN}",
            "Principal": "*"
        }
    ]
}

但这是 S3 不鼓励我们做的事情。 有没有其他选择可以实现这样的目标。 肯定有一些东西,但我是云的新手,我无法在文档中找到合适的资源。 如果有人可以向我指出与此案例类似的文档,我将不胜感激。

Amazon S3 中的对象默认是私有的

有几种方法可以提供对存储桶的访问:

  • IAM 用户或 IAM 角色的权限(适用于员工和软件,但不适用于最终用户)
  • 使存储桶公开的存储桶策略(适用于 web 站点,但不适用于私有内容)
  • 预签名 URL ,提供对私有 object 的限时访问

听起来预签名 URL 最适合您的情况。 想象一个照片分享网站:

  • 用户向应用程序进行身份验证
  • 用户请求访问照片
  • 应用程序检查用户是否有权查看照片
  • 如果是这样,应用程序生成一个预签名的 URL,其有效期有限(例如 5 分钟)
  • 用户点击此链接,或链接嵌入 web 页面(例如作为<img>标签)
  • Amazon S3 通过验证预签名的 URL 是否正确签名以及时间段是否已过期来处理请求。 如果一切正常,它返回 object(文件)。 如果不行,则会显示“拒绝访问”
  • 用户 A 然后与用户 B 共享照片。应用程序在其数据库中更新此信息
  • 用户 B 然后可以通过相同的过程请求访问照片

有关详细信息,请参阅: Amazon S3 预签名 URL

为了补充@John 的回答,您还可以使用 CloudFront (CF) 通过Origin Access Identity (OAI) 使用存储桶中的图像服务器:

将 OAI 与 CF 结合使用,您可以让您的存储桶完全保密,并强制您的用户只能通过 CF 访问您的图像。 使用 CF 还可以加快下载速度,因为它是 AWS 的内容交付网络,比 S3 更接近最终用户。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM