CloudFrontのエッジサーバ上にキャッシュされているオブジェクトを更新する
こんにちは。フレクトの大橋です。
私たちが運営しているベターホームレシピ(http://bhmb.jp)では、画像などの静的コンテンツ
の配信にCloudFrontを使っています。
CloudFrontはAmazonが用意しているS3上のオブジェクトを高速に配信する仕組みです。
CloudFrontを使うと、S3のオブジェクトがエンドユーザに対して近くに配置されている
サーバ(エッジサーバ)から配信されるようになり、高速のコンテンツの配信ができます。アメリカ西海岸にあるS3の画像が日本国内のエッジサーバにキャッシュされて、高速に配信できたりします。CDN(Contents Delivery Network)の一種です。
CloudFrontのエッジサーバはオブジェクトへのアクセスがあったときに、もしエッジサーバ上に
オブジェクトがあれば、それを配信し、なければ、S3にアクセスしにいき、
配信します。S3から取得したオブジェクトはエッジサーバ上にキャッシュされます。
キャッシュされる時間はS3のメタデータ(HTTPヘッダなど)にTTLを設定すれば制御できます。
以前は24時間が最短でしたが、現在は1時間を最短にできます。
Expireヘッダに1時間後の時間を設定するなどすれば、1時間ごとにエッジサーバのオブジェクトは
更新されるようになるはずです。詳しくは以下を参考にしてください。
http://aws.typepad.com/aws/2010/04/amazon-cloudfront-object-ttl-slashed.html
■ キャッシュが1時間単位だとけっこう面倒
さて、前置きが長くなりましたが、ベターホームレシピではデザイナが
直接S3にアップして静的コンテンツを確認したりします。(もちろん、開発用環境からやりますが)
しかし、以下のような問題によくぶつかっていました。
・静的コンテンツ(画像、CSS)などを更新しても、HTML内はCloudFrontのURLを
指しているので、1時間以上待たないと更新が確認できない。
・デザイナがExpireヘッダなどいちいち意識するのはとても面倒
うちのデザイナは技術力もあるため、S3を直接触るような運用になっている事情もあるのですが、
何かとこのキャッシュのタイミングは面倒な作業が発生していました。
そのため、
「CloudFront上のコンテンツをゴリゴリ編集できるようにしたい、もうキャッシュ切れを待つのは面倒」
という不満がチーム内(デザイナだけですが)にただよっていました。
■ CloudFrontのInvalidation機能
そうしたら、最近以下のような記事を見つけました。
英語の苦手な私は早速スルーしようと思いましたが、ちょっとだけ読んでみると、
どうやら、CloudFront上のエッジサーバのキャッシュを無効にできる機能が
CloudFront API上に実装されたようです。
http://aws.typepad.com/aws/2010/08/new-cloudfront-feature-invalidation.html
用途としては
・まれに実施するCSSやJavaScriptの更新
→ ただし、1時間とか1日待つのは面倒ですよね
・間違ってエンコードしたビデオファイルをキャッシュから削除
などなどがあがっています。
■ CloudBuddy PersonalでInvalidation機能の使う
「APIが用意されているので、そちらでどうぞ。」
http://developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=213
と言いたいところですが、現実的にはうちのデザイナはそこまでは
やってくれませんし、そんなことを要求したら喧嘩になりそうなのでやめておきます。
以下の2つのツールが現状は対応しているようです。
・CloudBuddy Personal
・CloudBerry Explorer
前者で実施してみました。
まずは CloudBuddy Personalをインストールします。
http://m1.mycloudbuddy.com/downloads.html
メールアドレスなど入力が必要ですが、画面に出てくる指示のままに
進めます。
ダウンロード、インストール後、S3のアクセスキー、秘密キーなどを
入力して、CloudBuddy Personalのエクスプローラ画面を開いてください。
CloudFrontに対応したバケットを選択し、右クリックを押して
以下のように「Object Invalidate」を押してください。
次の画面で、「Distribution」のURLとInvalidateしたいオブジェクトを選択し、
「Create New Invalidation」を押します。
そうすると、たぶん、5分から10分くらいでキャッシュが無効になっているはずです。
リアルタイムじゃないのでご注意ください。
Invalidationする前に、該当のオブジェクトを更新するなりしておくと
ちゃんと確認できます。
CloudBuddy Personalのエクスプローラの右上のCloudFrontボタンから
たどれるCloudFront Consoleでも、Invalidation Listで無効にしたキャッシュオブジェクトの
リストが以下のように確認できます。
はい、このエントリは若干長いですが、CloudFront上のキャッシュオブジェクトの更新は
けっこう簡単です。そして、実際に使うときも技術的なことはほとんど考えなくてよいです。
まだ開発者の私しか試していないので、来週、うちのデザイナに試してもらおうと
思います。きっとこれまでの不満を解消できることでしょう。
フレクトではCloudFrontやS3を使ってデザイナと一緒にコンテンツ運用の
「よりよい仕組み」を作っていけるエンジニアを募集しています。
興味のある方は以下からどうぞ。
http://www.flect.co.jp/recruit/index.html
コメント