michimani.net

CloudFront で Cache Policy と Origin Request Policy が使えるようになったみたいなので調べてみた

2020-07-23

Amazon 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

TTL settings

Cache-Control および Expires ヘッダをもとに動作するキャッシュ時間を、次の 3 つの値で設定します。

Cache key contents

キャッシュキーとして含む値を設定します。下記の項目について設定します。

また、クライアント (ビューア) が compressed object をサポートしている場合にそれらをキャッシュするかを設定します。


以上が Cache Policy で設定できる項目です。これまで各 behavior で設定していたものと同じですね。

Understanding origin request policies

Origin Request Policy では、オリジンへのリクエスト時に送信する情報を制御します。 Origin Request Policy は自分で作成することもできますし、 Cache Policy と同様にあらかじめ用意されている Managed Origin Request Policy を利用することもできます。

Origin Request Policy で設定できるのは次の項目です。

Info

Origin request contens

オリジンに対して送信する情報を、下記の項目で設定します。


以上が Origin Request Policy で設定できる項目です。こちらも、これまで各 behavior で設定していたものと同様です。

AWS CLI での操作

Cache Policy および Origin Request Policy については、 AWS SDK や AWS CLI を使って操作することができます。例えば、それぞれを作成する場合は、 cloudfront create-cache-policycreate-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-policiescloudfront 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 を管理することができます。

CloudFront cache policy list
CloudFront origin request policy list

それぞれの作成画面は次のようになっています。

Cache Policy の作成画面

CloudFront create cache policy

Origin Request Policy の作成画面

CloudFront create origin request policy

ポリシーの利用方法

作成、またはあらかじめ用意されているマネージドな Cache Policy および Origin Request Policy は、各 behavior の設定にて、利用するかどうかを設定します。

AWS CLI の場合

AWS CLI の場合、 cloudfront create-distribution コマンドで作成しますが、 skeleton を確認してみると DefaultCacheBehavior の中に CachePolicyIdOriginRequestPolicyId という属性が追加されていました。

{
  "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 を選択すると、どのポリシーを利用するか設定することができます。

CloudFront setting 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