Fragments of Works

仕事で便利!と思ったことや、もろもろの忘備録。さて。さてさてさて。

Amazon CloudFrontのキャッシュファイルを削除する

CloudFrontなんかをなんか使っています

Amazon CloudFrontはいわすと知れたコンテンツ配信サービス。Contents Delivery Networkってやつ。オリジナルファイルをAmazon S3などのストレージサーバー(オリジンサーバー)に格納すると、そこからデータを持ってきて、最良のパフォーマンスで配信できるようにしてくれる。まあなんか、いくつかのエッジロケーションを持ってて、ユーザーが最もストレスなくデータのやり取りができるところに自動的にルーティングしてくれたり、いい感じにやってくれる。リクエスト数がハンパないコンテンツ運用に便利!ってことらしい。転送量に応じて課金される。

詳しくはこちら。
Amazon CloudFront

私が運用しているサイトはAmazon S3とCloudFrontを組み合わせて使っていて、S3にオリジナルファイルをのっけると、CloudFrontが勝手にファイルを持ってってくれて、配信readyな感じになる。

キャッシュは24時間保持される

ところが、このオリジンサーバーを見てファイルをキャッシュする期間(失効期間というらしい)がデフォルトでは24時間に設定されている。

参照:
Q: Amazon CloudFront はどのぐらいの期間ファイルをエッジロケーションに保管しますか?

もちろんこれはファイルをアップするときに「キャッシュコンロールヘッダー」なるものを設定して「失効期間」を決めてあげると、任意にコントロールできるらしい(やったことないけど)。たとえば、「失効期間1時間ね」ってしておくと、1時間経ったら失効しちゃうので、おもむろにオリジンサーバーを見に行って、バージョン変わってたらファイルを再びとってくる。

しかしながら、デフォルトの失効期間が24時間なために、あまり予備知識なく使っていると「あんれー?ファイル更新したのに、いつまで経っても反映されないの、なんで?」ってことになる。設定をいじってない限り「はい、前のバージョンをアップしてから、ほぼ1日後です」ってことになるんだけど、それでは困る!というケースも多々ある。特に更新が頻繁に行われるサイトの場合「今すぐに!」ってこともあるかも(そういう性質のサイトがこのサービスを利用するのは正しいか否かという問いは、おいといて)。

今すぐに!キャッシュを削除したい

でこの「失効期間」前に、CloudFrontのキャッシュを削除してしまって、すぐオリジンサーバーを見に行ってほしい場合は、Cyberduckというあひるさんにお願いする。高機能FTPアプリ。Mac OS X用です。

Cyberduck

このあひるさんで「Object Invalidation」をするといいらいしいことが書いてある。

http://trac.cyberduck.ch/wiki/help/en/howto/cloudfront#ObjectInvalidation

Invalidation is one way to remove a distribution object from an edge server cache before the expiration setting on the object's header. Invalidation clears the object from the edge server cache, and a subsequent request for the object will cause CloudFront to return to the origin to fetch the latest version of the object.

Use the Invalidate option File → Info → Distribution (CDN) to invalidate files from edge locations.

このあひるさんでS3に接続して、キャッシュファイルを削除したいファイルを選び、command+Iで「情報を見る」を実行。上部のタブで「ディストリビューション(CDN)」を選択。転送方法を「Website Configuration(HTTP)CDN」にした上で、右下の「Invalidation」ボタンを押す。これでしばらくするとinvalidations in process→invalidations completedになる。Invalidationしたら接続切って待ってた。これでdistribution cacheが削除されて、最新バージョンをすぐに見に行ってもらえるようになる。

f:id:nsoto:20120229130445j:plain

私はとりあえずこれでできたっぽいです。あともっと単純に素直にやるのであれば、バージョンが変わったのなら「ファイル名」を変えてしまうことです。