ちょっと話題の記事

AWS CloudFrontのinvalidationにワイルドカードが使えるようになりました。

2015.05.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、せーのです。今日はCloudFrontを使っている方にちょっと便利になったアップデートをご紹介します。

invalidationがちょっと楽になった

CloudFrontで配信を行う場合、当然ながらキャッシュコントロールが重要なポイントとなります。スタイルシートやロゴ画像等、ほとんど触ることのないようなファイルはTTLを数ヶ月、1年と長めにとって置くことでCloudFront内に保管され、コストの節約になりますが、Webシステムなどでは定期的に変更するヘッダ画像等こまめにキャッシュを消さなくてはいけない運用も存在します。またポータルサイトを運営している方はユーザーの退会処理に伴いそのユーザに関わる全ての画像を消す必要が出てきます。アイコンはもちろん、SNSのようなサイトであればプライベートな画像も多いですから、きちんとポリシーを設けて確実にキャッシュを消していかないと権利的にもまずいことになりかねません。

そんな時にCloudFrontでは[invalidation]という機能を使って明示的にキャッシュを消していくことができます。ただ今まではinvalidationはオブジェクト一つづつにしか対応していませんでした。10や20ならまだなんとかなるかもしれませんがこれが1000、2000となるとその手間は大変なものでした。 今回のアップデートではCloudFrontのinvalidationにワイルドカード(*)が使えるようになりました。これで必要のないキャッシュオブジェクトを一気に消してしまうことができます。またCloudFrontのinvalidationにワイルドカードを使うのはコスト的にもお得です。invalidationは1パスあたり$0.005かかるのですが、ワイルドカードは[1パス]とみなされるので中に1000個のオブジェクトが入っていたとしても今までは$0.005 * 1000 = $5かかっていたところが$0.005のみで済みます(最初の1000件は無料)。うん、安いのはいいことだ。 でも無制限に消しまくれる、というわけではありません。今回のアップデートではinvalidationはひとつのディストリビューションにつき3000リクエストまで、という上限があります。3000オブジェクト、という組み合わせなら3000オブジェクトが消えるようなパスが一つ、でも100オブジェクトが消えるパスが30個、でもOKです。またワイルドカードを使ったinvalidationのパスは1ディストリビューションにつき15まで、という上限がありますので、リクエストを出すタイミングをうまく調整してください。

やってみた

それではやってみましょう。まずは画像をS3に入れてCloudFrontで配信します。S3に適当なバケットを作成し、フォルダを作成(今回は「image」という名前にしました)、フォルダを更に3つ作り、それぞれ3つずつ画像を入れました。

cfn_invalidation_update2

cfn_invalidation_update3

次にCloudFrontの設定です。画像を入れたS3のバケットをoriginに指定し、パスを「/image」とします。この時最後にスラッシュを入れるとパスが効かなくなるので注意して下さい。S3にCloudFrontからのみのアクセスを受け付けるようにバケットポリシーを新規に設定します。

cfn_invalidation_update4

これで設定は完了です。CloudFrontのステータスがDeployedになるのを待って接続テストを行います。まずはCloudFrontのオリジナルドメインでブラウザにアクセスしてみます。

cfn_invalidation_update1

画像が表示されました。ではひと通り画像を表示してキャッシュさせます。

cfn_invalidation_update7

cfn_invalidation_update8

ヘッダを表示してキャッシュされているかどうか確認してみましょう。

cfn_invalidation_update9

キャッシュされているようですね。CloudFrontの「Popular Objects」などからもキャッシュの状況は確認できます。

cfn_invalidation_update10

ではここでオリジナルの画像を削除してみます。

cfn_invalidation_update11

CloudFrontのキャッシュTTLのデフォルトは60分なので、オリジナルを削除したとしても60分は画像が出続けます。これが1年という設定だとリソース上は画像が削除されたのに1年間はブラウザから見続けられる、ということになります。

cfn_invalidation_update12

削除したファイル名と同じファイル名で別の画像をアップロードしてみます。

cfn_invalidation_update13

それでもキャッシュが効いている限りは前の画像が出続けます。

cfn_invalidation_update12

ではinvalidationをしてみましょう。CloudFrontより[Invalidations]のタブを選択し新規にInvalidationsを作成します。

cfn_invalidation_update14

パス例のところにも既にワイルドカードが使える事が書かれていますね。では1というフォルダの下のキャッシュを全て削除してみます。

cfn_invalidation_update16

[Invalidate]ボタンでInvalidationが開始されます。しばらく待ちます。

cfn_invalidation_update17

Invalidationが完了したら先ほどのパスをブラウザから見てみます。新しい画像に置き換わっているのが確認できます。

cfn_invalidation_update18

まとめ

いかがでしょうか。これでより自由なキャッシュの運用が可能になりました。あと社員がコンテンツになっている会社ってのは権利関係を全く気にしないで画像が使いまくれるので便利だなあ、とこの記事を書いて実感しました。

参考サイト