AWS CloudFront で Cache を Purge する(PHP/Ruby編)
はじめに
最近 CloudFront を使い始めたんですよね。以前は別の CDN を使っていたのですが
たまに Cache Purge したいよねってなることはあるわけでその処理を PHP と Ruby で書いたのでメモ
数年ぶりに PHP を書いたのですが...
ついでに AWS console からの方法も書いておく
Cache Purge するアカウントに cloudfront:CreateInvalidation の権限が必要なので注意
前提
既に CloudFront の Distribution は作成済み
PHP 編
$ composer require aws/aws-sdk-php
後は PHP から使ってあげるだけ
use \Aws\CloudFront\CloudFrontClient as AwsCFClient; $client = AwsCFClient([ 'region' => /* region を入れるのだが CloudFront では region の概念がないのでどこでも良いっぽい*/, 'version' => '2016-01-28', 'credentials' => [ 'key' => /* AWS_ACCESS_KEY_ID を入れる*/, 'secret' => /* AWS_SECRET_ACCESS_KEY を入れる*/ ] ]); $paths = ["/hoge", "/test"]; // purge したい cache の path $result = $client->createInvalidation([ 'DistributionId' => /* ここに作成済みの Distribution id を入れる*/, 'InvalidationBatch' => [ 'CallerReference' => time(), 'Paths' => [ 'Quantity' => count($paths), 'Items' => $paths ] ] ]);
Ruby 編
$ vi Gemfile + gem 'aws-sdk' $ bundle install # or $ gem install aws-sdk
後は Ruby から使ってあげる
client = Aws::CloudFront::Client.new( region: REGION, access_key_id: AWS_ACCESS_KEY_ID, secret_access_key: AWS_SECRET_ACCESS_KEY ) res = client.create_invalidation({ distribution_id: distribution_id, invalidation_batch: { paths: { quantity: paths.count, items: paths }, caller_reference: Time.now.to_i.to_s } }) res&.invalidation&.status == 'InProgress'
console で確認
指定した Distribution の詳細を開き Invalidations の tab を開くと In Progress と表示されているはず。
完了すると Completed になる。
もちろんこの画面からも cache purge 出来る。
画像の Create Invalidation をクリックすると paths を入れるフォームが表示されるので入力して Invalidate を押すだけ。
最後に
caller_reference はユニークである必要があるので並列で呼び出すとかの場合はマイクロ秒単位にするとかもしくは別の方法で生成するなどした方が良いかと。
cache purge はお金がかかるからお気をつけを(無料枠もあります)