0

S3 ファイルの ACL を動的に更新し、Cloudfront に即座に伝播するソリューションを探しています。

これまでのところ、S3 で ACL を更新できますが、ファイルをプライベートに設定した場合でも、Cloudfront 経由でパブリックにアクセスでき、その逆も可能です。

そのために S3 PHP SDK を使用しています: Set file as public

$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分かかる場合があることも読みました。瞬時にできる方法はありませんか?

ありがとう!

4

1 に答える 1

0

実際、ソースコードを見ると、公式の AWS SDK for PHPで S3 サポートを使用していません。サードパーティの開発者によって管理されているUndesigned S3 クラスを使用している可能性があります。あなたが知らなかった場合に備えて。:)

さて、あなたの質問に:

CloudFront はキャッシュであるため、そのキャッシュをクリアするまで、S3 で行った変更をすぐには取得しません。そうです、最初のステップは S3 オブジェクトに変更を加えることであり、2 つ目は CloudFront に無効化リクエストを発行してキャッシュをクリアするように指示することです。

個人的には、CloudFront が無効化を完了するのに 3 ~ 15 分かかるのを見てきました。CloudFront エッジ ロケーションのリストを見ると、現在 36 のエッジ ロケーションが北米、ヨーロッパ、アジア/パシフィック、南アメリカに広がっています。CloudFront は、すべてのエッジ ロケーションに移動し、無効化するオブジェクトのキャッシュがクリアされていることを確認する必要があります。

瞬時にできる方法はありませんか?

現在のところ?いいえ。

ただし、できるだけ速く動くことは確かです。:)

于 2012-10-05T06:33:35.860 に答える