首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >S3公共接入方案

S3公共接入方案
EN

Stack Overflow用户
提问于 2020-08-30 11:10:20
回答 2查看 879关注 0票数 0

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

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

现在,为了使图像可以随时随地访问,移动应用程序、桌面应用程序和Web应用程序,我必须公开存储桶和它内部的所有图像,以便任何应用程序都可以通过URL访问图像。但是S3建议我们不要把桶和它的内容公开。

我试着不公开这个桶,只是设置了一个CORS配置,如

代码语言:javascript
复制
<?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访问图像的唯一方法是通过如下策略将存储桶及其所有内容公开

代码语言:javascript
复制
{
    "Id": "Policy1598785179613",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1598785170418",
            "Action": [
                "s3:GetObject"
            ],
            "Effect": "Allow",
            "Resource": "{my ARN}",
            "Principal": "*"
        }
    ]
}

但这正是S3阻止我们做的事情。还有其他办法来实现这样的目标吗?肯定有一些东西,但我对云很陌生,我无法在文档中找到合适的资源。如果有人能向我指出一份类似于本案的文件,我将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-30 11:26:03

默认情况下,亚马逊S3中的对象是私有的

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

  • 对IAM用户或IAM角色的权限(对工作人员和软件有利,但对最终用户不利)
  • 一个桶策略,它使桶公开(对网站有利,但对私有内容不利)
  • 预签名的URL,它提供对私有对象的有限访问。

这听起来像是一个预先签名的URL是最好的情况。想象一下一个分享照片的网站:

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

有关更多详细信息,请参见:亚马逊S3预签名网址

票数 5
EN

Stack Overflow用户

发布于 2020-08-30 11:39:29

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63656811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档