我已经使用Liip Imagine软件包设置了一个Amazon S3缓存解析器,并且在存储桶上设置了正确的权限以防止在浏览器中列出目录内容时出现问题 .
My Scenario:
该网站在S3上有相当多的图像资源 - 一些手动上传,许多也使用Vich上传软件包通过CMS上传 . 我使用Imagine包来解析基于config.yml文件中定义的过滤器的缓存图像(用于缩略图和预览),然后将其存储在以过滤器命名的S3存储桶中的单独目录中 . 所以简而言之,将原始内容上传到S3 - >自动解析存储在S3上的缓存文件 . 效果很好 .
The Problem
我第一次请求时能够解析缓存文件的唯一方法是在存储桶上拥有广泛的公开权限 . 这样做并不好,因为当您执行此操作时,S3会以XML文件的方式公开“bucket explorer”,该文件列出整个存储桶内容(或至少前1000个记录) . 我需要将所有文件公开,但我不能在任何给定时间列出它们,因为我们在新产品发布之前遇到了嗅探此客户端站点的问题 . 我至少不想要一个文件名列表 .
What I've Tried
我在存储区ACL中尝试了几种设置组合,并结合以下存储桶策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AddPerm",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::[MY_BUCKET]/*"
}
]
}
我发现除非公共访问下的“Everyone”组被赋予“List objects”权限,否则缓存的文件将无法解析 . 只要我关闭该权限(禁止在浏览器中查看XML文件),就无法再从上传中解析未缓存的文件 .
What else I've tried
我还尝试将存储桶配置为网站,并根据我在此处找到的一些建议在根目录中上传了默认的 index.html
文件 . 这没什么 . 也许我错过了一些东西 .
我还尝试确保缓存解析文件夹在S3中是公共的,其中列表中的“对象”权限已关闭 . 这也不起作用 .
The Error
删除列表对象权限后,在进行解析尝试时会产生以下错误
Error executing "CreateBucket" on "https://[MY_BUCKET].s3.amazonaws.com/";
AWS HTTP error: Client error: `PUT https://[MY_BUCKET].s3.amazonaws.com/`
resulted in a `403 Forbidden` response:
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code>
<Message>Access Denied</Message><RequestId>94D939 (truncated...)
AccessDenied (client): Access Denied - <?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message>
<RequestId>[HIDDEN]</RequestId>
<HostId>[HIDDEN]</HostId>
</Error>
Bucket Structure is like this
[MY_BUCKET]
-thumbnails // <-- where thumbnails are resolved
-previews // <-- where previews are resolved
-uploads // <-- primary uploads parent dir
--products // <-- where products are uploaded
--other // <-- where other files are uploaded
--images // <-- where images are manually uploaded
我的假设是解析器需要读取目录的内容以确定文件是否已被解析 .
如果有必要,我可以提供symfony的配置信息,但我没有遇到问题所以不认为有必要 .
最终我只需要能够让解析器完成它的工作并阻止浏览器访问存储桶内容 .
1 回答
我想出来了 . 它需要在 IAM 级别对策略进行调整,从而更改资源节点:
至: