Cloud CDNはキャッシュのパージが辛い
Google Cloud大好きなんですけどね、Cloud CDNだけ辛いんです。何が辛いかってキャッシュのパージ(無効化)が辛いんです。
パージのリクエストが1分間に1回しかできない
無効化の頻度には制限があります。1 分間に実行できる無効化は 1 回だけです。ただし、無効化する対象のサイズに制限はありません。
/images/fred.png
の無効化は 1 回と計算されます。/images/*
の無効化も 1 回と計算されます。
キャッシュ無効化の制限事項
動的なページをキャッシュしておき、データが更新されたらキャッシュを自動パージするみたいなことは現実的ではありません。
パスを指定するときのワイルドカードの制限がキツイ
*
は、/
に続く最後の文字として使用できますが、それ以外の場所では使用できません。
キャッシュ無効化のパスパターン
つまり/posts/*
とすることで/posts/
から始まるパスのキャッシュは全てパージできるが、/*/posts
みたいなことはできないということです。パスのパターンが多いサイトで「このURLのキャッシュは消したいが、こっちは残したい」みたいなことをやりたくなったときに、このワイルドカードの制限が効いてきます。
1回/1分間の制限もあるため、複数回に分けてパージのリクエストを行うのも困難です。
必要なものだけを無効にしてください。無効にする対象が多すぎると、それまでキャッシュで処理されていたリクエストの急増によりインスタンスやバケットが影響を受ける可能性があります。
ドキュメントにはこう書かれていますが、これがキツいんですわ。
CDNにページをキャッシュさせているような場合、リリース時にこの制約が辛かったりします。例えば、以下のようなWebサイトがあるとします。
- 静的ページである
/about
、/contact
の2つのページのhtmlをCDNにキャッシュしている - jsやcssなどの静的ファイルを
/static/*
から配信して全てCDNにキャッシュしている
リリース時に/about
と/contact
のキャッシュは消したいが、/static
以下の静的ファイルはリリース後もキャッシュを残したいとします。
しかし、Cloud CDNでは/about
、/contact
を(1リクエストで)同時にパージするには/*
を指定するしかありません。しかし/*
だと静的ファイルも全てパージ対象になってしまいます。
パージが遅い
パージをリクエストしてから実際にキャッシュが消えるのにだいたい2〜3分くらいかかります。キャッシュの無効化の対象が数ページであっても、だいたい1分以上はかかります。
本当にキャッシュのパージ以外はまったく不満はないんですけど、これが辛くてCDNをFastlyに乗り換えたいなと思っている次第です。