【问题标题】:Edit ACLs of S3 files accessed via Cloudfront through PHP SDK通过 PHP SDK 编辑通过 Cloudfront 访问的 S3 文件的 ACL
【发布时间】:2012-09-17 22:47:47
【问题描述】:

我正在寻找一种解决方案来动态更新我的 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 分钟。有没有办法让它瞬间完成?

谢谢!

【问题讨论】:

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


    【解决方案1】:

    实际上,从查看您的源代码来看,您并没有使用 official AWS SDK for PHP 中的 S3 支持——您可能使用的是由第三方开发人员维护的 Undesigned S3 class。以防万一你不知道。 :)

    现在,回答你的问题:

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

    我个人看到 CloudFront 需要 3-15 分钟才能完成失效。如果您查看CloudFront edge locations 的列表,我目前统计了分布在北美、欧洲、亚太地区和南美的 36 个边缘站点。 CloudFront 必须遍历每个边缘站点,并确保为您要失效的对象清除缓存。

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

    目前?没有。

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

    【讨论】:

    • 谢谢,我同时也想通了,但我仍然觉得我们不能直接将 ACL 编辑到 Cloudfront,而无需发出失效。
    猜你喜欢
    • 2015-03-14
    • 2021-03-17
    • 1970-01-01
    • 2017-03-04
    • 2016-06-11
    • 2015-12-05
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多