AWS PHP SDK v3 で Amazon CloudFront のキャッシュをパージする

コンクリートファイブジャパン 菱川です。
今回は、Amazon が提供するCDNサービス「CloudFront」でキャッシュされているオブジェクトを、PHP SDK v3 を使って無効化する方法をご紹介します。v3 になってまた書き方が変わりましたので、その忘備録も兼ねてます。
CloudFront では、エッジキャッシュ上のオブジェクトを無効化するバッチをAPI経由で作成することができます。オブジェクトを無効にするには、個々のオブジェクトのパスまたは * ワイルドカードで終わるパスのいずれかを指定します。ワイルドカードが使用できるようになったことで、API 経由での無効化がやりやすくなりました。
参考資料:
- オブジェクトの無効化(ウェブディストリビューションのみ) - Amazon CloudFront 開発者ガイド
- 無効化の送信 - Amazon CloudFront API リファレンス
- AWS PHP SDK v3 の Amazon CloudFront ドキュメント
まず最初に、クライアントのインスタンスを作成します。リージョンとアクセスキーが必要です。また、v3 から API のバージョン指定が必須になりました。
また、ここハマりポイントなのですが、CloudFront はリージョン指定に us-east-1 しか受け付けません。無くても怒られるので、忘れてると時間を無駄にします。。脱力。。
$client = new \Aws\CloudFront\CloudFrontClient([
'region' => 'us-east-1', // これ以外は受け付けない
'version' => '2016-01-28', // バージョン指定は v3 で必須になった
'credentials' => [
'key' => $access_key,
'secret' => $access_secret,
],
]);
クライアントに接続できたら、無効化バッチを作成しましょう。バッチの作成には、ディストリビューションIDと、無効化するオブジェクトを指定するパスの指定が必要です。CallerReference が必須なのですが、タイムスタンプでいいですよとドキュメントに書いてあります。二重送信を防ぐためにユニークな値が必要だそうです。
// 無効化するオブジェクトをパスで指定
$paths = [
'/*',
];
/** @var \Aws\Result $result */
$result = $client->createInvalidation([
'DistributionId' => $distribution_id,
'InvalidationBatch' => [
'Paths' => [
'Quantity' => count($paths),
'Items' => $paths,
],
'CallerReference' => time(),
],
]);
バッチがうまく作成できたかどうかは、コンソールから確認してもいいのですが、SDK 経由でも確認できます。
/** @var \Aws\Result $result */
$result = $client->listInvalidations([
'DistributionId' => $distribution_id
]);
$items = $result->search('InvalidationList.Items'));
コンソールから確認したところ。