2017-04-24 235 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