CloudFront で Cache Policy と Origin Request Policy が使えるようになったみたいなので調べてみた
2020-07-23Amazon CloudFront の新機能として、 Cache Policy と Origin Request Policy というものが使えるようになりました。まだ日本語ドキュメントが準備されていないみたいなのですが、英語のドキュメントを元に、どのようなものなのか確認してみたいと思います。
目次
概要
今朝 (現地時間だと 7/22) の AWS Recent Annoucements (What’s New) で、次のような記事がありました。
この記事では、次のように書かれています。
Further, you can configure the cache key and origin request settings independently as account-level policies that can be easily applied across multiple distributions.
つまりどういうことかというと、これまでは 各 distribution の 各 behavior でキャッシュの時間やオリジンへのヘッダ、 Cookie の伝達などを設定していましたが、それらをアカウントレベルで管理できる ポリシー を作成できるということみたいです。
Cache Policy と Origin Request Policy
その ポリシー とはどんなものなのでしょうか。ここからは公式のドキュメントを見ながら確認していきます。
Understanding cache policies
Cache Policy では、キャッシュキーとして含まれる値 (クエリ文字列、 HTTP ヘッダ、 Cookie) の制御と、キャッシュ時間 (Default、 Minimum、 Maximum) を設定できます。Cache Policy は自分で作成することもできますが、あらかじめ用意されている Managed Cache Policy を利用することもできます。
Cache Policy で設定できるのは次の項目です。
Info
- Name : Cache Policy の名前です。
- Comment : Cache Policy に対するコメントです。
TTL settings
Cache-Control
および Expires
ヘッダをもとに動作するキャッシュ時間を、次の 3 つの値で設定します。
- Minimum TTL
- Maximum TTL
- Default TTL
Cache key contents
キャッシュキーとして含む値を設定します。下記の項目について設定します。
- Headers
- None
- Whitelist
- Cookies
- All
- None
- Whitelist
- All-Except
- Query string
- All
- None
- Whitelist
- All-Except
また、クライアント (ビューア) が compressed object をサポートしている場合にそれらをキャッシュするかを設定します。
- Cache compressed objects (uses Accept-Encoding header)
以上が Cache Policy で設定できる項目です。これまで各 behavior で設定していたものと同じですね。
Understanding origin request policies
Origin Request Policy では、オリジンへのリクエスト時に送信する情報を制御します。 Origin Request Policy は自分で作成することもできますし、 Cache Policy と同様にあらかじめ用意されている Managed Origin Request Policy を利用することもできます。
Origin Request Policy で設定できるのは次の項目です。
Info
- Name : Origin Request Policy の名前です。
- Comment : Origin Request Policy に対するコメントです。
Origin request contens
オリジンに対して送信する情報を、下記の項目で設定します。
- Headers
- None
- Whitelist
- All viewer headers and whitelisted
CloudFront-*
headers - All viewer headers
- Cookies
- All
- None
- Whitelist
- Query strings
- All
- None
- Whitelist
以上が Origin Request Policy で設定できる項目です。こちらも、これまで各 behavior で設定していたものと同様です。
AWS CLI での操作
Cache Policy および Origin Request Policy については、 AWS SDK や AWS CLI を使って操作することができます。例えば、それぞれを作成する場合は、 cloudfront create-cache-policy
、 create-origin-request-policy
コマンドを使います。なお、 AWS CLI のバージョンについては、この記事を書いている時点で最新の 2.0.33
および 1.18.103
で使えるようです。
$ aws --version
aws-cli/2.0.33 Python/3.7.4 Darwin/19.5.0 botocore/2.0.0dev3
$ (aws-cli-v1) $ aws --version
aws-cli/1.18.103 Python/3.7.7 Darwin/19.5.0 botocore/1.17.26
Cache Policy の作成
$ aws cloudfront create-cache-policy help
...
SYNOPSIS
create-cache-policy
--cache-policy-config <value>
[--cli-input-json | --cli-input-yaml]
[--generate-cli-skeleton <value>]
[--cli-auto-prompt <value>]
...
$ aws cloudfront create-cache-policy --generate-cli-skeleton
{
"CachePolicyConfig": {
"Comment": "",
"Name": "",
"DefaultTTL": 0,
"MaxTTL": 0,
"MinTTL": 0,
"ParametersInCacheKeyAndForwardedToOrigin": {
"EnableAcceptEncodingGzip": true,
"HeadersConfig": {
"HeaderBehavior": "whitelist",
"Headers": {
"Quantity": 0,
"Items": [
""
]
}
},
"CookiesConfig": {
"CookieBehavior": "all",
"Cookies": {
"Quantity": 0,
"Items": [
""
]
}
},
"QueryStringsConfig": {
"QueryStringBehavior": "allExcept",
"QueryStrings": {
"Quantity": 0,
"Items": [
""
]
}
}
}
}
}
Origin Request Policy の作成
$ aws cloudfront create-origin-request-policy help
...
SYNOPSIS
create-origin-request-policy
--origin-request-policy-config <value>
[--cli-input-json <value>]
[--generate-cli-skeleton <value>]
...
$ aws cloudfront create-origin-request-policy --generate-cli-skeleton
{
"OriginRequestPolicyConfig": {
"Comment": "",
"Name": "",
"HeadersConfig": {
"HeaderBehavior": "whitelist",
"Headers": {
"Quantity": 0,
"Items": [
""
]
}
},
"CookiesConfig": {
"CookieBehavior": "all",
"Cookies": {
"Quantity": 0,
"Items": [
""
]
}
},
"QueryStringsConfig": {
"QueryStringBehavior": "all",
"QueryStrings": {
"Quantity": 0,
"Items": [
""
]
}
}
}
}
ちなみに、既にマネージドなポリシーはそれぞれに存在しているので、 cloudfront list-cache-policies
、 cloudfront list-origin-request-policies
を実行するとそれらの情報を取得することができます。
$ aws cloudfront list-cache-policies
{
"CachePolicyList": {
"MaxItems": 100,
"Quantity": 4,
"Items": [
{
"Type": "managed",
"CachePolicy": {
"Id": "658327ea-f89d-4fab-a63d-7e88639e58f6",
"LastModifiedTime": "1970-01-01T00:00:00Z",
"CachePolicyConfig": {
"Comment": "Default policy when CF compression is enabled",
"Name": "Managed-CachingOptimized",
"DefaultTTL": 86400,
"MaxTTL": 31536000,
"MinTTL": 1,
"ParametersInCacheKeyAndForwardedToOrigin": {
"EnableAcceptEncodingGzip": true,
"HeadersConfig": {
"HeaderBehavior": "none"
},
"CookiesConfig": {
"CookieBehavior": "none"
},
"QueryStringsConfig": {
"QueryStringBehavior": "none"
}
}
}
}
},
{
"Type": "managed",
"CachePolicy": {
"Id": "4135ea2d-6df8-44a3-9df3-4b5a84be39ad",
"LastModifiedTime": "1970-01-01T00:00:00Z",
"CachePolicyConfig": {
"Comment": "Policy with caching disabled",
"Name": "Managed-CachingDisabled",
"DefaultTTL": 0,
"MaxTTL": 0,
"MinTTL": 0,
"ParametersInCacheKeyAndForwardedToOrigin": {
"EnableAcceptEncodingGzip": false,
"HeadersConfig": {
"HeaderBehavior": "none"
},
"CookiesConfig": {
"CookieBehavior": "none"
},
"QueryStringsConfig": {
"QueryStringBehavior": "none"
}
}
}
}
},
{
"Type": "managed",
"CachePolicy": {
"Id": "b2884449-e4de-46a7-ac36-70bc7f1ddd6d",
"LastModifiedTime": "1970-01-01T00:00:00Z",
"CachePolicyConfig": {
"Comment": "Default policy when compression is disabled",
"Name": "Managed-CachingOptimizedForUncompressedObjects",
"DefaultTTL": 86400,
"MaxTTL": 31536000,
"MinTTL": 1,
"ParametersInCacheKeyAndForwardedToOrigin": {
"EnableAcceptEncodingGzip": false,
"HeadersConfig": {
"HeaderBehavior": "none"
},
"CookiesConfig": {
"CookieBehavior": "none"
},
"QueryStringsConfig": {
"QueryStringBehavior": "none"
}
}
}
}
},
{
"Type": "managed",
"CachePolicy": {
"Id": "08627262-05a9-4f76-9ded-b50ca2e3a84f",
"LastModifiedTime": "1970-01-01T00:00:00Z",
"CachePolicyConfig": {
"Comment": "Policy for Elemental MediaPackage Origin",
"Name": "Managed-Elemental-MediaPackage",
"DefaultTTL": 86400,
"MaxTTL": 31536000,
"MinTTL": 0,
"ParametersInCacheKeyAndForwardedToOrigin": {
"EnableAcceptEncodingGzip": true,
"HeadersConfig": {
"HeaderBehavior": "whitelist",
"Headers": {
"Quantity": 1,
"Items": [
"origin"
]
}
},
"CookiesConfig": {
"CookieBehavior": "none"
},
"QueryStringsConfig": {
"QueryStringBehavior": "whitelist",
"QueryStrings": {
"Quantity": 4,
"Items": [
"aws.manifestfilter",
"start",
"end",
"m"
]
}
}
}
}
}
}
]
}
}
マネジメントコンソールでの操作
CloudFront のダッシュボードを開くと、サイドメニューに Policies というメニューが増えています。そこで、 Cache Policy および Origin Request Policy を管理することができます。
それぞれの作成画面は次のようになっています。
Cache Policy の作成画面
Origin Request Policy の作成画面
ポリシーの利用方法
作成、またはあらかじめ用意されているマネージドな Cache Policy および Origin Request Policy は、各 behavior の設定にて、利用するかどうかを設定します。
AWS CLI の場合
AWS CLI の場合、 cloudfront create-distribution
コマンドで作成しますが、 skeleton
を確認してみると DefaultCacheBehavior
の中に CachePolicyId
と OriginRequestPolicyId
という属性が追加されていました。
{
"DefaultCacheBehavior": {
"TargetOriginId": "",
"TrustedSigners": {
"Enabled": true,
"Quantity": 0,
"Items": [
""
]
},
"ViewerProtocolPolicy": "https-only",
"AllowedMethods": {
"Quantity": 0,
"Items": [
"POST"
],
"CachedMethods": {
"Quantity": 0,
"Items": [
"POST"
]
}
},
"SmoothStreaming": true,
"Compress": true,
"LambdaFunctionAssociations": {
"Quantity": 0,
"Items": [
{
"LambdaFunctionARN": "",
"EventType": "origin-response",
"IncludeBody": true
}
]
},
"FieldLevelEncryptionId": "",
"CachePolicyId": "",
"OriginRequestPolicyId": "",
"ForwardedValues": {
"QueryString": true,
"Cookies": {
"Forward": "whitelist",
"WhitelistedNames": {
"Quantity": 0,
"Items": [
""
]
}
},
"Headers": {
"Quantity": 0,
"Items": [
""
]
},
"QueryStringCacheKeys": {
"Quantity": 0,
"Items": [
""
]
}
},
"MinTTL": 0,
"DefaultTTL": 0,
"MaxTTL": 0
},
}
マネジメントコンソールの場合
マネジメントコンソールの場合は、 behabior の設定画面で Cache and origin request settings という項目が追加されているので、そこで Use a cache policy and origin request policy を選択すると、どのポリシーを利用するか設定することができます。
Use legacy cache settings を選択した場合は、これまで通り各 behavior で設定をします。
料金
各ポリシーの管理、利用には追加の料金は発生しません。発生するのは、これまで通り CloudFront の各種料金のみです。
There is no additional fee for using this feature. Regular CloudFront charges apply.
まとめ
Amazon CloudFront の新機能、 Cache Policy と Origin Request Policy について調べてみた話でした。
キャッシュおよびオリジンへのリクエストについて、これまでは各 behavior で個別に設定する必要があり、たとえ同じ設定を当てたいとしてもすべてを個別に変更する必要がありました。今回の Cache Policy と Origin Request Policy を使うことで、異なる behavior でも設定を統一したいという場合に、その管理が簡単になりそうです。
それぞれにマネージドなポリシーもあらかじめ用意されているため、特にこだわりがない場合にはそれらを利用することで CloudFront の設定自体がより簡単になるのかなと思いました。CloudFront 自体の仕様については以前に簡単にまとめた記事があるので、よかったら参考にしてみてください。
comments powered by Disqus