我学习AWS已经有一段时间了,有一件事让我感到困惑。
假设我拥有一个像Instagram这样的应用程序(Lol,但仍然如此),我的用户在我的应用程序上上传了很多图片。现在,我通过任何方式将它们保存在s3桶中。现在,图像被安全地存储在S3上,图像的URL存储在我的DB上,这样我的用户就可以轻松地从应用程序访问图像。
现在,为了使图像可以随时随地访问,移动应用程序、桌面应用程序和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阻止我们做的事情。还有其他办法来实现这样的目标吗?肯定有一些东西,但我对云很陌生,我无法在文档中找到合适的资源。如果有人能向我指出一份类似于本案的文件,我将不胜感激。
发布于 2020-08-30 11:26:03
默认情况下,亚马逊S3中的对象是私有的。
有几种方法可以提供对桶的访问:
这听起来像是一个预先签名的URL是最好的情况。想象一下一个分享照片的网站:
<img>标记)。有关更多详细信息,请参见:亚马逊S3预签名网址
发布于 2020-08-30 11:39:29
为了补充@John的答案,您还可以使用CloudFront (CF)通过Origin (OAI)使用存储桶中的图像:
将OAI与CF结合使用,您可以将桶保持为完全私有的,并强制用户仅通过CF访问映像。使用CF还可以加快下载速度,因为它是AWS的内容交付网络,比S3更接近最终用户。
https://stackoverflow.com/questions/63656811
复制相似问题