特定のパスごとにALBのルーティングとCloudFrontのキャッシュ設定を振り分けてみる

特定のパスに対してルーティングとキャッシュ設定を変えるため、ALBのルールとCloudFrontのbehaviorを変更してみました。
2020.10.27

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

こんにちは、コンサル部の鈴木(純)です。

特定のパスごとにALBのルーティングとCloudFrontのキャッシュ有無を振り分けることができるか確認する機会があったので共有します。

やりたいこと

元々は以下のようなCloudFront→ALB→EC2という以下の図のような構成。

ここに以下の条件でルーティングを追加します。

  • 同じCloudFront、ALBのルートで別EC2を追加
  • 特定のパスのみ追加したEC2へルーティング
  • 追加したEC2はCloudFrontでキャッシュはしない

調べてみると、ALBではパスベースのルーティングができるようで、追加するEC2へ振り分けることは問題なさそうでした。

キャッシュについてもCloudFront側でbehaviorのパスをルーティングするパスで設定すれば問題なさそうと分かったので実際に設定してきます。

やってみる

今回はhogehoge.com/sample-bへのアクセスを追加したEC2へと振り分けたいので、以下二つを設定します。

  • ALBのパスベースルーティングの設定
  • CloudFrontのbehavior設定

以上2つを設定したあと、EC2内に配置したそれぞれのパスへブラウザからアクセス可能か、キャッシュが正しく設定できているかを確認します。

ALBのパスベースルーティング

ルーティング先となるターゲットグループは事前に作成しておきましょう。私はweb-dev-tg-bというターゲットグループを作成しました。

ロードバランサーから対象のALBを選択して、リスナータブににある「ルールの表示/編集をクリック」します。

「+」のタブをクリックすると、ルーティング先の追加ができるので「ルールの挿入」をクリックしましょう。ルーティングの条件とアクションを追加することができるようになるので、以下の通りに設定します。

  • 条件の追加: パス… = /sample-b/*
  • アクションの追加: 転送先… = web-dev-tg-b

条件の追加には今回パスベースでルーティングを分ける為「パス…」を選択して、振り分けたいsample-b以下をアスタリスクで指定しました。

ルールの追加についての詳細は公式ドキュメントをご参照下さい。

Application Load Balancer のリスナー

それぞれ入力が完了したら保存して完了です。

CloudFrontのbehavior設定

CloudFront側では、sample-b以下のパスは全てキャッシュしない設定をしていきましょう。

設定したいディストリビューションを開いて、behaviorタブから「Create Behavior」をクリックします。現在はDefaultで設定したALBをオリジンしたbehaviorのみが設定されており、TTLは検証なので30秒にしています。

新規作成のbehaviorはパスパターンに「sample-b/*」を設定してオリジンにはDefaultと同じALBを指定します。こちらのパスの場合はキャッシュを行わないため、TTLは全て0で設定して「Create」してください。

確認してみる

それぞれのEC2に簡単なindex.htmlwを配置して確認してみます。

  • ターゲットグループAにはsample-aのパスにindex.htmlを配置
  • ターゲットグループBにはsample-bのパスにindex.htmlを配置

ブラウザからの確認

https://hogehoge.cloudfront.net/sample-a/ にアクセス。sample-aに配置したindex.htmlが無事表示されました。

https://hogehoge.cloudfront.net/sample-b/ にアクセス。こちらもsample-bに無事アクセスすることができました。

キャッシュ動作の確認

ブラウザからパスベースで対象のEC2を振り分けることができたので、キャッシュの動作についても確認します。

sample-aのパスに対してcurlコマンドで確認してみましょう。

$ curl -I https://hogehoge.cloudfront.net/sample-a/

HTTP/2 200
content-type: text/html; charset=UTF-8
content-length: 85
date: Tue, 27 Oct 2020 02:42:09 GMT
server: Apache/2.4.46 ()
last-modified: Tue, 27 Oct 2020 02:27:13 GMT
etag: "55-5b29dc8dbe8a7"
accept-ranges: bytes
x-cache: Miss from cloudfront
via: 1.1 61052a2a490f114ce27494c97f141f73.cloudfront.net (CloudFront)
x-amz-cf-pop: NRT20-C3
x-amz-cf-id: h4aXhv-FKKKz5I1FqaMPrFC7EaAJuoepLjQgKDAh13kbiB-FV6mkmQ==

一度目はx-cache: Miss from cloudfront とキャッシュがヒットしていないことが分かります。もう一度実行してみましょう。

$ curl -I https://hogehoge.cloudfront.net/sample-a/

HTTP/2 200
content-type: text/html; charset=UTF-8
content-length: 85
date: Tue, 27 Oct 2020 02:42:09 GMT
server: Apache/2.4.46 ()
last-modified: Tue, 27 Oct 2020 02:27:13 GMT
etag: "55-5b29dc8dbe8a7"
accept-ranges: bytes
x-cache: Hit from cloudfront
via: 1.1 61052a2a490f114ce27494c97f141f73.cloudfront.net (CloudFront)
x-amz-cf-pop: NRT20-C3
x-amz-cf-id: p3J9lXXsC1e-FCuS1MX7tlomHtnlJniGt1vdp0ZJNWemUKHafnYlIg==
age: 17

無事 x-cache: Hit from cloudfront とキャッシュが適用されていることを確認できました。

それでは次に新しく追加したsample-bのパスのキャッシュを確認します。

$ curl -I https://hogehoge.cloudfront.net/sample-b/

HTTP/2 200
content-type: text/html; charset=UTF-8
content-length: 85
date: Tue, 27 Oct 2020 04:09:48 GMT
server: Apache/2.4.46 ()
last-modified: Tue, 27 Oct 2020 02:33:08 GMT
etag: "55-5b29dde04fb63"
accept-ranges: bytes
x-cache: Miss from cloudfront
via: 1.1 9d2638a0e022a0b88610f478244ec392.cloudfront.net (CloudFront)
x-amz-cf-pop: NRT20-C3
x-amz-cf-id: bvZchZiO6PJ3qK1cqM4Lxp2N7HeIa3Y714c2paCMasbNbzLxu-wE7Q==

一度目はsample-aと同様に x-cache: Miss from cloudfront とキャッシュがヒットしていません。

$ curl -I https://hogehoge.cloudfront.net/sample-b/

HTTP/2 200
content-type: text/html; charset=UTF-8
content-length: 85
date: Tue, 27 Oct 2020 04:09:52 GMT
server: Apache/2.4.46 ()
last-modified: Tue, 27 Oct 2020 02:33:08 GMT
etag: "55-5b29dde04fb63"
accept-ranges: bytes
x-cache: Miss from cloudfront
via: 1.1 f5ab62ba718df4106a712091fd2bbd40.cloudfront.net (CloudFront)
x-amz-cf-pop: NRT20-C3
x-amz-cf-id: v5Bpc-OX3fDS9uhKcRAqslfrx9qf4dnos7oQl_W8KcAl3gImWLGbbw==

もう一度実行しても x-cache: Miss from cloudfront とキャッシュがされていないことが確認できました。

まとめ

今回はCloudFrontのキャッシュと併せてALBのパスベースルーティングを設定してみました。

特定のパスに対してルーティングとキャッシュ設定を変えたい場合があれば参考にしてみてください。