まっしろけっけ

めもてきなやーつ

AWS CloudFront で Cache を Purge する(PHP/Ruby編)

はじめに

最近 CloudFront を使い始めたんですよね。以前は別の CDN を使っていたのですが

たまに Cache Purge したいよねってなることはあるわけでその処理を PHPRuby で書いたのでメモ
数年ぶりに PHP を書いたのですが...

ついでに AWS console からの方法も書いておく

Cache Purge するアカウントに cloudfront:CreateInvalidation の権限が必要なので注意

前提

既に CloudFront の Distribution は作成済み

PHP

まずは aws-sdk を追加

$ 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

aws-sdk の gem の追加から

$ 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 と表示されているはず。

f:id:shiro-16:20200522111914p:plain

完了すると Completed になる。

もちろんこの画面からも cache purge 出来る。

画像の Create Invalidation をクリックすると paths を入れるフォームが表示されるので入力して Invalidate を押すだけ。

最後に

caller_reference はユニークである必要があるので並列で呼び出すとかの場合はマイクロ秒単位にするとかもしくは別の方法で生成するなどした方が良いかと。

cache purge はお金がかかるからお気をつけを(無料枠もあります)

docs.aws.amazon.com