[英]Edit ACLs of S3 files accessed via Cloudfront through PHP SDK
我正在尋找一種解決方案來動態更新我的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: 強制CloudFront分發/文件更新
我沒有嘗試過,但是在我嘗試之前,我想知道這是正確的解決方案。 我還讀到更新可能需要15分鍾。 沒有任何方法可以使其瞬間完成嗎?
謝謝!
實際上,從查看源代碼開始,您並沒有在PHP的官方AWS開發工具包中使用S3支持-您可能正在使用Undesigned S3類 , 該類由第三方開發人員維護。 以防萬一你不知道。 :)
現在,對您的問題:
由於CloudFront是緩存 ,因此在清除該緩存之前,它不會立即提取您在S3中所做的更改。 因此,是的,第一步是對S3對象進行更改,第二步是向CloudFront發出無效請求,指示其清除緩存。
我個人已經看到CloudFront需要3到15分鍾的時間才能完成失效。 如果您查看CloudFront邊緣位置列表,那么我目前算出了分布在北美,歐洲,亞太地區和南美的36個邊緣位置。 CloudFront必須遍歷每個邊緣位置,並確保為要失效的對象清除緩存。
沒有任何方法可以使其瞬間完成嗎?
現在? 沒有。
我敢肯定,它以最快的速度,因為它可以移動,但。 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.