CloudFrontでマルチオリジンとCache Behavior設定してみた

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

はじめに

愛用の黒ぶちメガネのブランドは金子眼鏡の清水です。

CloudFrontにはオリジンを複数持ち、パスによって振り先を変えるマルチオリジン機能や、 パスによってキャッシュの動作を変えるCache Behavior機能があります。 具体的なイメージとして、AWS Black Belt Tech シリーズ 2016の資料を引用します。

この機能自体はわりと昔からあるものですが、 *1 今回このマルチオリジン、Cache Behaviorの機能を使用する機会がありましたので、 実際にManagement Consoleでの設定内容などをまとめてみたいと思います。

今回やってみた内容と構成

本エントリで実際にやってみたことは、以下の2つになります。

  1. マルチオリジンでのパスによるオリジンの振り分け設定
  2. 同一オリジンでパスによる異なるキャッシュ設定の振り分け

構成と、各オリジンサーバでのファイルの内容などは下記となります。

000

  • S3-Origin
    ファイルパス ファイルの中身
    /index.html "S3-Origin: /index.html" という文字列
    /multi-origin-behavior/index.html "S3-Origin: multi-origin-behavior/index.html" という文字列
  • ELB-Origin

    ファイルパス ファイルの中身
    /index.html "ELB-Origin: /index.html" という文字列
    /multi-origin-behavior/index.html "ELB-Origin: /multi-origin-behavior/index.html" という文字列
    /multi-origin-behavior/nocache/test_cookie.php キャッシュ確認用PHPのカウンターページ(後述)

オリジン側の準備

今回使ってみたオリジンは以下のように設定してあります。

S3の準備

「s3-origin-[適当な文字列]」という名称のバケットを作成します。静的ウェブサイトホスティングは設定していません。
各ファイルをアップロードする際に、誰でもアクセスできるようアクセス許可をpublic-readに設定しています。

ELB-EC2の準備

EC2(Amazon Linux)を1台起動、ApacheとPHPをインストールし起動します。
Security Groupは適切に設定し、また各ファイル(上記のファイル、ならびにELB Helath Check対象となるファイル)をアップロード、 アクセスできることを確認しておきます。
「ELB-Origin」という名称のELBを作成、Apacheが起動しているEC2をロードバランサー配下に追加して、In Serviceになることを確認します。

キャッシュ確認用のPHPのカウンターページ

キャッシュ設定の確認用に、植木さんのエントリで検証用に使用しているPHPのカウンターページtest_cookie.phpを使用させていただきました。こちらもELBまたはEC2経由でブラウザからアクセスして、ページをリロードすると数値がカウントされることを確認しておきます。

やってみた

それでは実際に、マルチオリジンとCache Behaviorの設定をやってみたいと思います。

ディストリビューションの作成

まずは、CloudFrontディストリビューションを作成します。 CloudFrontのManagement Consoleから、Create Distibution画面に進みます。

はじめは1つのオリジンしか登録できませんので、S3-Originを登録します。 また、Cache BehaviorもPath Patternが Default(*) の1つだけしか登録できないので、このまま先に進みます。

001

Default Root Objectをindex.htmlに、またわかりやすいようにCommentを設定しました。
Create Distributionボタンを押してでディストリビューションを作成します。

CloudFrontディストリビューションの作成には少し時間がかかりますが (Statusが In Progress から Complete に変われば設定反映完了)、 以下では設定をして、設定反映が確認できたところで確認、としています。

オリジンの追加

CloudFrontのディストリビューション一覧ページから、Distribution Settingのページに進みます。

OriginsタブからCreate Originのボタンをクリック、ELB-Originの情報を登録します。
Origin Domain Nameで対象ELBを選択、他の設定はそのまま、Createで作成します。

005

オリジンが2つの状態になりました。

006

つづいて本題のBehaviorの設定を行って行きます!

1. マルチオリジンでのパスによるオリジンの振り分け設定

まずはマルチオリジンでの振り分け設定ということで、以下の表のような振り分けを設定、確認してみたいと思います。

Precedence Path Pattern Origin Cache
0 multi-origin-behavior/* ELB-Origin 指定なし(=24時間キャッシュ)
1 Default (*) S3-Origin 指定なし(=24時間キャッシュ)

まず設定前ですが、S3-Originしか設定されていません。 http://d1234567890123.cloudfront.net/multi-origin-behavior/ へアクセスすると、S3-Originのファイルが返ります。

018

ディストリビューション設定のBehaviorsのタブから、Create Behaviorを押します。 Path Patternでmulti-origin-behavior/*を入力して、 OriginにELBーOriginを選択します。

007

他の設定はそのままで、ページ下部のCreateでBehaviorを作成<します。

Behaviorsタブに戻ると、以下のように設定されました。 008

CloudFrontディストリビューションの設定反映を待ち、ブラウザでアクセスして確認してみます。

009

ELB-Originの方に振り分けられました!

またこの時、multi-origin-behaviorのパスを外すと、もちろんS3-Originに振り分けられます。

010

マルチオリジンで、パスによって異なるオリジンに振り分けていることが確認できました。

2. 同一オリジンでパスによる異なるキャッシュ設定への振り分け

次に、同一オリジンでパスによって異なるキャッシュ設定への振り分けを行ってみます。 具体的には、ELB-Originについてmulti-origin-behavior/nocache/* という振り分けルールについては、キャッシュさせないようにしてみます。

Precedence Path Pattern Origin Cache
0 multi-origin-behavior/nocache/* ELB-Origin キャッシュさせない
1 multi-origin-behavior/* ELB-Origin 指定なし(=24時間キャッシュ)
2 Default (*) S3-Origin 指定なし(=24時間キャッシュ)

こちらもディストリビューション設定から、Behaviorを作成します。

キャッシュさせない設定については、先ほどの植木さんのエントリキャッシュさせないCloudFrontディストリビューションを設定してみた(CloudFormationテンプレート付) を参考に、以下の設定をしています。

  • Allowed HTTP Methodsをすべてに(GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE)
  • Forward HeadersをAllに
  • Object CachingでMinimum TTL, Maximum TTL, Default TTLをすべて0(秒)に
  • Forward CookiesをAllに
  • Forward Query StringsをYesに

011

Behaviorを作成したあと、順位(Precedence)がはこのようになっていました。

012

はじめに意図したもの(表で示したもの)と少し異なります。この場合、 multi-origin-behavior/nocache/test_cookie.phpへのアクセスは Precedence 0 の Path Pattern にマッチして、デフォルトのキャッシュあり(=キャッシュ指定なしなのでデフォルトの24時間キャッシュ)の設定に振り分けられてしまいます。

実際にこの状態でアクセスしてみると、ブラウザをリロードしてもカウントアップされませんでした。(キャッシュされているためですね。)

Precedenceを変えるには、変更したいPath Patternの行を選択します(チェックボックスをon)。
その後、Move Up(またはMove Down)ボタンでPrecedenceを操作します。最後に、Saveボタンを押します。

014

設定反映まで待ちますが、同時にmulti-origin-behavior/nocache/test_cookie.php へのアクセスはキャッシュされているので、Invalidationも実施しておきます。

015

設定が反映されたら、multi-origin-behavior/nocache/test_cookie.php へもう一度アクセスしてみます。
ブラウザで開いてリロードすると、、値が変更されました!

017

ということで、同じオリジンでキャッシュ動作だけ異なる振り分けも確認できました。

まとめ

CloudFrontのマルチオリジン、Cahce Behavior機能について設定方法などまとめてみました。

ドメインを一つに固定して異なるオリジンに振り分けたい時、 またオリジンが一つだけの場合でもディレクトリ単位でキャッシュの設定を変えたい時、 などに是非活用してみてください。

私自身、この機能をなんとなく知っていながら、長らく使ったことがありませんでしたが、やり方さえ知ってしまえばさくっと使える感じでした。 ただCloudFrontの設定反映にはどうしても時間がかかりますので、Path Patternなどは事前に検討、確認の上、設定すると時間の節約になるかと思います! (今回のエントリ用にわりと行き当たりで設定していたら、なかなか設定反映時間待ちになってしまっていました。。。反省。。。)

脚注

  1. 軽く探してみたところ、こちらの2012/06/11付の資料には[New]ということで記載がありました。おおよそ2012年前半リリースの機能でしょうか。。http://www.slideshare.net/ar_maniacs/awsmeister-cloudfront20120611slideshare-13350408