S3 公共访问替代方案

Sri*_*m R 1 amazon-s3 amazon-web-services

我学习 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>
Run Code Online (Sandbox Code Playgroud)

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

{
    "Id": "Policy1598785179613",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1598785170418",
            "Action": [
                "s3:GetObject"
            ],
            "Effect": "Allow",
            "Resource": "{my ARN}",
            "Principal": "*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*ein 6

默认情况下, Amazon S3 中的对象是私有的。

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

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

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

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

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