通过PHP SDK编辑通过Cloudfront访问的S3文件的ACL

时间:2012-09-26 10:20:37

标签: php sdk amazon-s3 acl amazon-cloudfront

我正在寻找一种解决方案来动态更新我的S3文件ACL,并立即传播到Cloudfront。

到目前为止,我可以在S3上更新ACL,但是如果我将文件设置为私有,它仍然可以通过Cloudfront公开访问,反之亦然。

我正在使用S3 PHP SDK来执行此操作: 将文件设置为公共

$s3 = new S3($awsAccessKey, $awsSecretKey);
if (($acp = S3::getAccessControlPolicy($bucket, $uri)) !== false) {
   $acp["acl"][] = array(
        "type" => "Group", "uri" => "http://acs.amazonaws.com/groups/global/AllUsers",  "permission" => "READ"
   );
   if (S3::setAccessControlPolicy($bucket, $uri, $acp)) {
      echo "true";
   }
}

将文件设为私有

$s3 = new S3($awsAccessKey, $awsSecretKey);
if (($acp = S3::getAccessControlPolicy($bucket, $uri)) !== false) {
  foreach($acp['acl'] as $key => $val) {
    if(isset($val['uri']) && 
        $val['uri'] == 'http://acs.amazonaws.com/groups/global/AllUsers')
        unset($acp['acl'][$key]);        
  }
  if (S3::setAccessControlPolicy($bucket, $uri, $acp)) {
    echo "true";
  }
}

我已经阅读过更新文件,您必须向Cloudfront发送无效请求: Force CloudFront distribution/file update

我没有尝试过,但在此之前,我想知道这是正确的解决方案。我还读到可能需要15分钟来更新。有没有办法让它瞬间完成?

谢谢!

1 个答案:

答案 0 :(得分:0)

实际上,通过查看源代码,您没有在official AWS SDK for PHP中使用S3支持 - 您可能正在使用由第三方开发人员维护的Undesigned S3 class。以防你不知道。 :)

现在,问你的问题:

由于CloudFront是缓存,因此在您清除缓存之前,它不会立即获取您在S3中所做的更改。所以是的,第一步是对S3对象进行更改,第二步是向CloudFront发出无效请求,指示它清除缓存。

我个人认为CloudFront需要3到15分钟才能完成失效。如果你查看CloudFront edge locations列表,我目前在北美,欧洲,亚洲/太平洋和南美洲有36个边缘地点。 CloudFront必须遍历每个边缘位置,并确保为您无效的对象清除缓存。

  

有没有办法让它瞬间完成?

目前?否。

但是,我确信它会尽可能快地移动。 :)