-
-
Save stevejenkins/1199777 to your computer and use it in GitHub Desktop.
How to invalidate a single item via URL in AWS CloudFront
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Noice!