株式会社クイックのWebサービス開発blog

HAPPYなサービスプランナー・エンジニア・デザイナーのブログです。

【Akamai CDN】API Cache Purge

初めまして!!
稀にインフラ&アプリエンジニアっぽい事もやってる
ヘルプデスク担当のてるりんです。

今回はAPIを使ったAkamaiCDNキャッシュパージについて語りたいと思います。
ヘルプデスク担当が何故この領域手を着けたの?と言う点はお気になさらず(^▽^;)

弊社で運用しているサイトの画像配信には大きくAWS Cloud Frontの他、
Akamai CDNの2つを利用しています。

CDNキャッシュネタあるあるで、
「画像を差し替えたけど反映されない!キャッシュ消して!」
と、サイト運用している方から依頼されるケースが弊社ではあります。

これだと依頼するのも手間だし効率悪いですよね。
運用者がアップし、その流れで自身でキャッシュ削除できた方が楽だし効率もいいですよね。

非エンジニアの方に
「管理画面からキャッシュ削除してもいいよ!」
と言った場合、

「キャッシュ以外にも色々機能あって怖くて管理画面触りたくないない…。」

と、当然こう言われるので、APIも公開されてるし
「だったら非エンジニアでも触れるキャッシュパージするツール作っちゃえ!」
という事で、PHPで雑に作ってみました。

Cloud Frontに限らずのAWSのソリューション絡みの情報は日本語、
英語問わず幾らでも情報出てくるのですが、
Akamaiのソリューションに関しては意外と情報少ないので、
(情報あるにはあるが調べるのに時間掛かった)どなたかの参考になればと思い、
APIを使ったキャッシュ削除の手順とサンプルコード公開します。

前提

PHP(今回動かした環境は5.5系)が動作するWebサーバ。
※弊社の環境はCentOS6.x系 + PHP5.5系(確認してませんが7.x系でも恐らく動くはず) + Apache2.2系の環境。

事前準備

Akamaiの管理画面(Luna Control Center)からAPI Tokenを発行します。
  1. Luna Control Centerへログインし、「設定」→「Manage APIs」を開きます。 f:id:aimstogeek:20180227193233j:plain

  2. 「New API Client for Me」をクリックします。 f:id:aimstogeek:20180301093634j:plain

  3. 「次に」をクリックします。 f:id:aimstogeek:20180227193827j:plain

  4. Client Nameを入力し、チェックを「OPEN CCU/Fast Purge APIs」に、
    Access Levelを「READ-WRITE」に変更します。 f:id:aimstogeek:20180228170841j:plain

  5. 「Allow purge by CP Code」にチェックを入れます。
    「Selected CP Codes」(対象ドメイン)を選択、
    キャッシュパージ対象のドメイン名を選択し、「提出」をクリックします。 f:id:aimstogeek:20180227195642j:plain

  6. 「New Creadential」をクリックし、API Tokenを発行します。
    発行したAPI Tokenは後程利用するのでDownloadするか、
    テキストにコピペしておいて下さい。
    f:id:aimstogeek:20180227200106j:plain

実装

PHPの動くWebサーバ上で以下を実行して下さい。

GitからAkamaiOPEN-edgegrid-phpをダウンロードします。

$ git clone https://github.com/akamai/akamai-gen-edgerc.git

composerでモジュールのインストールをします。

$ cd AkamaiOPEN-edgegrid-php
$ composer install

事前準備で発行したAPI Tokenをアプリケーションのルートに設置します。 ファイル名を「.edgerc」とします。

$ cat /var/www/html/xxxx/AkamaiOPEN-edgegrid-php/.edgerc

[default]
client_secret = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
host = akab-xxxxxxxxxxxxxxxxxxxxxxxx.purge.akamaiapis.net
access_token = akab-xxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxx
client_token = akab-xxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxx

プログラムを設置します。

)
$ cat /var/www/html/xxxx/AkamaiOPEN-edgegrid-php/fast_purge.php
サンプルコード(fast_purge.php)
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=SHIFT_JIS">
</head>
<body>
<font size=6><b>Akamai Cache fast purge</b></font>
<br>
DomainName
<form id="form1" name="form1" method="POST" action="fast_purge.php">
    <select name="domainname" id="pref">
        <option value="selected"="selected"/></option>
        <optgroup label="hogehoge.com系">
        <option value="www.hogehoge.com" />www.hogehoge.com</option>
        <option value="huge.hogehoge.com" />hugehogehoge.com</option>
        </optgroup>
        <optgroup label="mogemoge.com系">
        <option value="www.mogemoge.com" />www.mogemoge.com</option>
        <option value="test.mogemoge.com" />test.mogemoge.com</option>
        </optgroup>
    </select><br>
    TargetPath(ドメイン以下のパスを入力)<br>
    <textarea name="cachepath" style="width:600px;height:180px;" cols="50" rows="5"></textarea><br />
    <input type="submit" value=" OK " />
</form>
<hr>

<?php
require_once 'vendor/autoload.php';

if($_POST["domainname"] <> ""){
    print("Select Domain: " . $_POST["domainname"] . "<br>");
}else{
    print "FQDNを選択して下さい。<br>";
}

if($_POST["cachepath"] <> ""){
    $target = $_POST["cachepath"];
    print(nl2br($target) . "<br>");
}else{
    print "キャッシュパスを入力して下さい。<br>";
    echo "</body>";
    echo "</html>";
}

$cachepath = preg_replace("/\r\n/s", ",", $_POST["cachepath"]);
$auth = \Akamai\Open\EdgeGrid\Authentication::createFromEdgeRcFile('default', './.edgerc');
$auth->setHttpMethod('POST');
$auth->setPath('/ccu/v3/delete/url/production');

$body = json_encode(
    array(
        'hostname' => $_POST["domainname"],
        'objects' => [
                       $cachepath
                     ]
    )
);

$auth->setBody($body);
$context = array(
    'http' => array(
        'header' => array(
            'Authorization: ' . $auth->createAuthHeader(),
            'Content-Type: application/json',
            'Content-Length: ' . strlen($body),
        ),
        'method' => 'POST',
        'content' => $body
    )
);

if($_POST["cachepath"] != ""){
    $context = stream_context_create($context);
    $response = json_decode(file_get_contents('https://' . $auth->getHost() . $auth->getPath(), null, $context));
    echo "<br><font size=5><b>Result</b></font><br>";

    print("PurgeID:\t " . "$response->purgeId" . "<br>");
    print("SupportID:\t " . "$response->supportId" . "<br>");
    print("HttpStatus:\t " . "$response->httpStatus" . "<br>");
    print("Detail:\t " . "$response->detail" . "<br>");
}else{
    exit;
}

echo "</body>";
echo "</html>";

?>

設置した「fast_purge.php」をWebサーバで公開し、ブラウザからアクセスします。

注意

  • サンプルコードは必要最低限のみ記載でブラウザバック、
    リロード対策は特にしていないので、必要に応じて対策して下さい。

  • コードのクオリティに関する突っ込みは禁止で(´;ω;`)

使い方

例)
以下の3ファイルのキャッシュを削除する場合を例とします。

https://www.hogehoge.com/image/test/1.jpg
https://www.hogehoge.com/image/test/2.jpg
https://www.hogehoge.com/image/test/3.jpg
  1. fast_purge.phpへアクセスします。

  2. ドロップリストから対象ドメインを選択、
    削除対象ファイルのパスをテキストボックスに入力し、「OK」をクイックします。 f:id:aimstogeek:20180227204331j:plain

  3. Result欄のHttpStatusが「201」で表示されていればキャッシュパージ成功です! f:id:aimstogeek:20180227204955j:plain

参考

github.com

つぶやき

AkamaiCDNを使っていて
APIでキャッシュ削除したい!」
と言う方の参考に少しでもなればうれしいです♪
ではでは~(´・ω・`)

\\『明日のはたらくを創る』仲間を募集中!! // 919.jp