Amazon S3 策略 + Liip Imagine 缓存解析器

Amazon S3 Policy + Liip Imagine Cache Resolver

我已经使用 Liip Imagine 捆绑包设置了 Amazon S3 缓存解析器,但在为存储桶设置正确权限以防止浏览器中列出目录内容时遇到问题。

我的场景:

该站点在 S3 上有相当多的图像资产 - 一些是手动上传的,还有许多是使用 Vich 上传包通过 CMS 上传的。我使用 Imagine bundle 根据 config.yml 文件中定义的过滤器(用于缩略图和预览之类的东西)解析缓存图像,然后将这些图像存储在以过滤器命名的我的 S3 存储桶中的单独目录中。简而言之,将原始文件上传到 S3 -> 自动解析存储在 S3 上的缓存文件。效果很好。

问题

我能够在第一次请求时解析缓存文件的唯一方法是对存储桶具有完全开放的 public 权限。这不好,因为当您执行此操作时,S3 会以 XML 文件的方式公开 "bucket explorer",该文件列出了整个存储桶内容(或至少前 1000 条记录)。我需要所有文件都是 public,但我无法在任何给定时间获得它们的列表,因为我们遇到过在新产品发布之前嗅探该客户站点的人的问题。我至少不想要一个文件名列表。

我试过的

我已尝试将存储桶 ACL 中的几种设置组合与以下存储桶策略相结合:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::[MY_BUCKET]/*"
        }
    ]
}

我发现缓存文件将无法解析,除非 public 访问权限下的 "Everyone" 组被授予 "List objects" 权限。一旦我关闭该权限(禁止在浏览器中查看 XML 文件),就无法再从上传中解析未缓存的文件。

我还尝试了什么

我还尝试将存储桶配置为网站,并根据我在此处找到的一些建议,在根目录中上传了一个默认的 index.html 文件。这没有任何作用。也许我错过了什么。

我还尝试确保缓存解析文件夹在 S3 中 public,并且在存储桶中关闭了列表对象权限。这也没有用。

错误

删除列表对象权限后,在尝试解析时会产生以下错误

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>

桶结构是这样的

[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 的配置信息,但我对此没有任何问题,所以认为没有必要。

最终我只需要能够让解析器做它的事情并阻止浏览器访问存储桶内容。

我想通了。它需要在 IAM 级别调整策略,将资源节点从:

更改为
...
"Resource":[
    "arn:aws:s3:::[MY_BUCKET]/*"
]

至:

....
"Resource":[
    "arn:aws:s3:::*"
]