2017-04-24 255 views
1

我們應用程序中使用的圖像是從Amazon CloudFront渲染的。Amazon CloudFront無效API

修改現有圖像後,它不會立即反映圖像更改,因爲CloudFront需要24小時左右才能更新。

作爲解決方法,我計劃撥打CreateInvalidation以立即反映文件更改。

是否可以在沒有SDK的情況下使用此失效調用?

使用ColdFusion編程語言,似乎沒有SDK。

回答

0

您可以簡單地發出POST請求。上PHP例如從史蒂夫詹金斯

<?php 
/** 
* Super-simple AWS CloudFront Invalidation Script 
* Modified by Steve Jenkins <steve stevejenkins com> to invalidate a single file via URL. 
* 
* Steps: 
* 1. Set your AWS Access Key 
* 2. Set your AWS Secret Key 
* 3. Set your CloudFront Distribution ID (or pass one via the URL with &dist) 
* 4. Put cf-invalidate.php in a web accessible and password protected directory 
* 5. Run it via: http://example.com/protected_dir/cf-invalidate.php?filename=FILENAME 
* or http://example.com/cf-invalidate.php?filename=FILENAME&dist=DISTRIBUTION_ID 
* 
* The author disclaims copyright to this source code. 
* 
* Details on what's happening here are in the CloudFront docs: 
* http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/Invalidation.html 
* 
*/ 
$onefile = $_GET['filename']; // You must include ?filename=FILENAME in your URL or this won't work 
if (!isset($_GET['dist'])) { 
     $distribution = 'DISTRIBUTION_ID'; // Your CloudFront Distribution ID, or pass one via &dist= 
} else { 
     $distribution = $_GET['dist']; 
} 
$access_key = 'AWS_ACCESS_KEY'; // Your AWS Access Key goes here 
$secret_key = 'AWS_SECRET_KEY'; // Your AWS Secret Key goes here 
$epoch = date('U'); 
$xml = <<<EOD 
<InvalidationBatch> 
    <Path>{$onefile}</Path> 
    <CallerReference>{$distribution}{$epoch}</CallerReference> 
</InvalidationBatch> 
EOD; 
/** 
* You probably don't need to change anything below here. 
*/ 
$len = strlen($xml); 
$date = gmdate('D, d M Y G:i:s T'); 
$sig = base64_encode(
    hash_hmac('sha1', $date, $secret_key, true) 
); 
$msg = "POST /2010-11-01/distribution/{$distribution}/invalidation HTTP/1.0\r\n"; 
$msg .= "Host: cloudfront.amazonaws.com\r\n"; 
$msg .= "Date: {$date}\r\n"; 
$msg .= "Content-Type: text/xml; charset=UTF-8\r\n"; 
$msg .= "Authorization: AWS {$access_key}:{$sig}\r\n"; 
$msg .= "Content-Length: {$len}\r\n\r\n"; 
$msg .= $xml; 
$fp = fsockopen('ssl://cloudfront.amazonaws.com', 443, 
    $errno, $errstr, 30 
); 
if (!$fp) { 
    die("Connection failed: {$errno} {$errstr}\n"); 
} 
fwrite($fp, $msg); 
$resp = ''; 
while(! feof($fp)) { 
    $resp .= fgets($fp, 1024); 
} 
fclose($fp); 
print '<pre>'.$resp.'</pre>'; // Make the output more readable in your browser 
0

對於頻繁的修改,我認爲最好的方法是追加一個查詢字符串到圖像url(時間戳或對象的散列值)並配置Cloudfront轉發查詢字符串,這將始終返回最新的圖像時查詢字符串不同。

對於除SDK之外的不經常修改,您可以使用AWS CLI,這也將允許在構建時使緩存失效,並與您的CI/CD工具集成。

E.g

aws cloudfront create-invalidation --distribution-id S11A16G5KZMEQD \ 
    --paths /index.html /error.html