[アップデート] Amazon CloudFront でアプリケーション向けのマネージドキャッシュポリシーが追加されました
こんにちは、森田です。
以下のアップデートでアプリケーション向けのマネージドキャッシュポリシーが2つ追加されました。
追加されたキャッシュポリシーについて
今回追加されたキャッシュポリシーについては、オリジンサーバーが Cache-Control ヘッダーを返すようなアプリケーションでの利用が想定されています。
従来のマネージドキャッシュポリシーでは、アプリケーション向けのポリシーは提供されておらず、ヘッダーやCookie、クエリ文字列を考慮したキャッシュを行いたい場合は、個別でカスタムキャッシュポリシーを作成する必要がありました。
追加された2つのポリシーについては、TTL等は同じですが、キャッシュキーにクエリ文字列 含めるかが異なっています。
UseOriginCacheControlHeaders
キャッシュキーに利用される情報
- Header
- Host
- Origin
- X-HTTP-Method-Override
- X-HTTP-Method
- X-Method-Override
- Cookie
UseOriginCacheControlHeaders-QueryStrings
キャッシュキーに利用される情報
- Header
- Host
- Origin
- X-HTTP-Method-Override
- X-HTTP-Method
- X-Method-Override
- Cookie
- クエリ文字列
やってみた
実際に追加されたポリシーを使って、CloudFrontを作成し、動作を確認してみたいと思います。
CloudFrontのオリジンには、EC2(ドメイン名付与)を利用します。
EC2では、以下のような簡易的なサーバを起動します。
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.after_request
def after_request(response):
response.headers['Cache-Control'] = "max-age=10"
return response
@app.route("/", methods=["GET"])
def header_func():
header = dict(request.headers)
return jsonify(header)
@app.route("/query", methods=["GET"])
def query_func():
req = dict(request.args)
return jsonify(req)
app.run(host="0.0.0.0", port=80, debug=True)
CloudFront の設定
パスに応じてキャッシュポリシーを分けたいため以下のように設定します。
パス | 割り当てるキャッシュポリシー |
---|---|
/query | UseOriginCacheControlHeaders-QueryStrings |
/ | UseOriginCacheControlHeaders |
動作確認
UseOriginCacheControlHeaders
Cookieを固定
以下スクリプトで Cookie を固定として curl を実行してみます。
get.sh
#!/bin/bash
while true; do
x_cache=$(curl -s -I "https://ディストリビューションドメイン名" -H "Cookie: count=100" | grep -i "x-cache" | awk '{print $2}')
echo "$(date '+%Y-%m-%d %H:%M:%S') - X-Cache: $x_cache"
sleep 1
done
% bash get.sh
2024-07-09 21:40:12 - X-Cache: Miss
2024-07-09 21:40:13 - X-Cache: Hit
2024-07-09 21:40:15 - X-Cache: Hit
2024-07-09 21:40:16 - X-Cache: Hit
2024-07-09 21:40:17 - X-Cache: Hit
2024-07-09 21:40:18 - X-Cache: Hit
2024-07-09 21:40:20 - X-Cache: Hit
2024-07-09 21:40:21 - X-Cache: Hit
2024-07-09 21:40:22 - X-Cache: Miss
2024-07-09 21:40:24 - X-Cache: Hit
2024-07-09 21:40:25 - X-Cache: Hit
2024-07-09 21:40:26 - X-Cache: Hit
2024-07-09 21:40:27 - X-Cache: Hit
2024-07-09 21:40:28 - X-Cache: Hit
2024-07-09 21:40:30 - X-Cache: Hit
2024-07-09 21:40:31 - X-Cache: Hit
2024-07-09 21:40:33 - X-Cache: Miss
2024-07-09 21:40:34 - X-Cache: Hit
期待通り10秒間はキャッシュの利用ができているようです。
Cookieを可変
今度は、以下スクリプトで Cookie を可変にして curl を実行してみます。
count.sh
#!/bin/bash
count=0
while true; do
count=$((count+1))
x_cache=$(curl -s -I "https://ディストリビューションドメイン名" -H "Cookie: count=$count" | grep -i "x-cache" | awk '{print $2}')
echo "Count: $count - X-Cache: $x_cache"
sleep 1
done
% bash count.sh
Count: 1 - X-Cache: Miss
Count: 2 - X-Cache: Miss
Count: 3 - X-Cache: Miss
Count: 4 - X-Cache: Miss
Count: 5 - X-Cache: Miss
Count: 6 - X-Cache: Miss
Count: 7 - X-Cache: Miss
Count: 8 - X-Cache: Miss
Count: 9 - X-Cache: Miss
Count: 10 - X-Cache: Miss
Cookie が都度変更となるため、キャッシュキーも変更となり、全てキャッシュの利用は行っていない結果となりました。
UseOriginCacheControlHeaders-QueryStrings
クエリ文字列を固定
以下スクリプトでクエリ文字列を固定として curl を実行してみます。
get.sh
#!/bin/bash
while true; do
x_cache=$(curl -s -I "https://ディストリビューションドメイン名/query?count=100" | grep -i "x-cache" | awk '{print $2}')
echo "$(date '+%Y-%m-%d %H:%M:%S') - X-Cache: $x_cache"
sleep 1
done
% bash get.sh
2024-07-09 21:49:41 - X-Cache: Miss
2024-07-09 21:49:42 - X-Cache: Hit
2024-07-09 21:49:43 - X-Cache: Hit
2024-07-09 21:49:44 - X-Cache: Hit
2024-07-09 21:49:46 - X-Cache: Hit
2024-07-09 21:49:47 - X-Cache: Hit
2024-07-09 21:49:48 - X-Cache: Hit
2024-07-09 21:49:49 - X-Cache: Hit
2024-07-09 21:49:50 - X-Cache: Hit
2024-07-09 21:49:51 - X-Cache: Miss
2024-07-09 21:49:52 - X-Cache: Hit
クエリ文字列を固定としているため、キャッシュキーも固定となり、期待通り10秒間はキャッシュの利用ができているようです。
クエリ文字列を可変
今度は、以下スクリプトでクエリ文字列を可変にして curl を実行してみます。
count.sh
#!/bin/bash
count=0
while true; do
count=$((count+1))
x_cache=$(curl -s -I "https://ディストリビューションドメイン名/query?count=$count" | grep -i "x-cache" | awk '{print $2}')
echo "Count: $count - X-Cache: $x_cache"
sleep 1
done
% bash count.sh
Count: 1 - X-Cache: Miss
Count: 2 - X-Cache: Miss
Count: 3 - X-Cache: Miss
Count: 4 - X-Cache: Miss
Count: 5 - X-Cache: Miss
Count: 6 - X-Cache: Miss
Count: 7 - X-Cache: Miss
Count: 8 - X-Cache: Miss
Count: 9 - X-Cache: Miss
Count: 10 - X-Cache: Miss
Count: 11 - X-Cache: Miss
Count: 12 - X-Cache: Miss
こちらも期待通り、全てキャッシュの利用は行っていないことが確認できました。
さいごに
今回追加されたマネージドキャッシュポリシーを利用することで、 Cookie やクエリ文字列を基準にキャッシュの制御ができるようになります。
例えば、Cookieやクエリ文字列ごとに配信するコンテンツが異なるECサイトやCMSなどの用途でベースラインとして利用すると良いでしょう。