{CloudFront}キャッシュキーの管理

 

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/controlling-the-cache-key.html

https://dev.classmethod.jp/articles/cloudfront-cache-key-policy/


カスタムのキャッシュポリシーとしてヘッダー「Hoge」を追加
ヘッダー「Hoge」の値を変更してリスエストし、キャッシュが使用されないことを確認
ヘッダー「Fuga」の値を変更してリスエストし、キャッシュが使用されることを確認

 


-- 1. コマンド等のインストール

-- 1.1 aws cli version 2 インストール

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version

 

-- 1.2 jqインストール
sudo yum -y install jq


-- 2. S3 バケットを作成する

aws s3 ls

aws s3 mb s3://bucket123

 


-- 3. インデックスドキュメントの設定

vim index.html

<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>My Website Home Page</title>
</head>
<body>
  <h1>Welcome to my website</h1>
  <p>Now hosted on Amazon S3!</p>
</body>
</html>

aws s3api put-object --bucket bucket123 --key index.html --body index.html --content-type text/html

 

 

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


aws cloudfront create-distribution \
--origin-domain-name bucket123.s3.ap-northeast-1.amazonaws.com \
--default-root-object index.html

 

aws cloudfront list-distributions

aws cloudfront get-distribution \
--id 11111111111111

aws cloudfront get-distribution-config \
--id 11111111111111

 


-- 5. OAIの作成

aws cloudfront create-cloud-front-origin-access-identity \
--cloud-front-origin-access-identity-config '{
    "CallerReference": "caller01",
    "Comment": "oai01"
}'


aws cloudfront list-cloud-front-origin-access-identities

aws cloudfront get-cloud-front-origin-access-identity \
--id 22222222222222

 

-- 6. OAIをディストリビューションに追加する

 

aws cloudfront get-distribution \
--id 11111111111111

aws cloudfront get-distribution-config \
--id 11111111111111


aws cloudfront get-distribution-config \
--id 11111111111111 | jq -r .DistributionConfig > distribution.json

vim distribution.json

Origins -> Items -> CustomHeaders の下の
CustomOriginConfigを削除して下記S3OriginConfigを追加


        "S3OriginConfig": {
            "OriginAccessIdentity": "origin-access-identity/cloudfront/22222222222222"
        },

 


aws cloudfront update-distribution \
--id 11111111111111 \
--if-match $(aws cloudfront get-distribution-config --id 11111111111111 | jq -r .ETag) \
--distribution-config file://distribution.json

 


-- 7. OAI に Amazon S3 バケット内のファイルの読み込みアクセス許可を付与する


vim b.json

{
    "Version": "2012-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity 22222222222222"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::bucket123/*"
        }
    ]
}


aws s3api put-bucket-policy \
--bucket bucket123 \
--policy file://b.json


aws s3api get-bucket-policy \
--bucket bucket123


-- 8. キャッシュポリシーの作成

aws cloudfront create-cache-policy \
--cache-policy-config '{
        "Comment": "cp01",
        "Name": "cp01",
        "DefaultTTL": 86400,
        "MaxTTL": 31536000,
        "MinTTL": 1,
        "ParametersInCacheKeyAndForwardedToOrigin": {
            "EnableAcceptEncodingGzip": true,
            "EnableAcceptEncodingBrotli": true,
            "HeadersConfig": {
                "HeaderBehavior": "whitelist",
                "Headers": {
                    "Quantity": 1,
                    "Items": [
                        "Hoge"
                    ]
                }
            },
            "CookiesConfig": {
                "CookieBehavior": "none"
            },
            "QueryStringsConfig": {
                "QueryStringBehavior": "none"
            }
        }
    }'


aws cloudfront list-cache-policies \
--type custom


aws cloudfront get-cache-policy \
--id 33333333-3333-3333-3333-333333333333

aws cloudfront get-cache-policy-config \
--id 33333333-3333-3333-3333-333333333333


-- 9. オリジンリクエストポリシーの作成

aws cloudfront create-origin-request-policy \
--origin-request-policy-config '{
        "Comment": "orp01",
        "Name": "orp01",
        "HeadersConfig": {
            "HeaderBehavior": "whitelist",
            "Headers": {
                "Quantity": 1,
                "Items": [
                    "Hoge"
                ]
            }
        },
        "CookiesConfig": {
            "CookieBehavior": "none"
        },
        "QueryStringsConfig": {
            "QueryStringBehavior": "none"
        }
    }'

 


aws cloudfront list-origin-request-policies \
--type custom

aws cloudfront get-origin-request-policy \
--id 44444444-4444-4444-4444-444444444444

aws cloudfront get-origin-request-policy-config \
--id 44444444-4444-4444-4444-444444444444

 

-- 10. ディストリビューションにキャッシュポリシーとオリジンリクエストポリシーをアタッチする


aws cloudfront get-distribution \
--id 11111111111111

aws cloudfront get-distribution-config \
--id 11111111111111


aws cloudfront get-distribution-config \
--id 11111111111111 | jq -r .DistributionConfig > distribution.json

vim distribution.json


"DefaultCacheBehavior"の末尾の下記を修正

    "ForwardedValues": {
      "QueryString": false,
      "Cookies": {
        "Forward": "none"
      },
      "Headers": {
        "Quantity": 0
      },
      "QueryStringCacheKeys": {
        "Quantity": 0
      }
    },
    "MinTTL": 0,
    "DefaultTTL": 86400,
    "MaxTTL": 31536000

    "CachePolicyId": "33333333-3333-3333-3333-333333333333",
    "OriginRequestPolicyId": "44444444-4444-4444-4444-444444444444"

 


aws cloudfront update-distribution \
--id 11111111111111 \
--if-match $(aws cloudfront get-distribution-config --id 11111111111111 | jq -r .ETag) \
--distribution-config file://distribution.json

 


-- 11. 動作確認

 

curl -v -H "Hoge:AAA" -X GET http://xxxxxxxxxxxxxx.cloudfront.net/index.html
curl -v -H "Hoge:BBB" -X GET http://xxxxxxxxxxxxxx.cloudfront.net/index.html
curl -v -H "Hoge:CCC" -X GET http://xxxxxxxxxxxxxx.cloudfront.net/index.html


curl -v -H "Fuga:AAA" -X GET http://xxxxxxxxxxxxxx.cloudfront.net/index.html
curl -v -H "Fuga:BBB" -X GET http://xxxxxxxxxxxxxx.cloudfront.net/index.html
curl -v -H "Fuga:CCC" -X GET http://xxxxxxxxxxxxxx.cloudfront.net/index.html

 

 

-- 12. クリーンアップ

-- ディストリビューションの無効化

aws cloudfront get-distribution \
--id 11111111111111

aws cloudfront get-distribution-config \
--id 11111111111111


※ distribution.jsonはget-distribution-configコマンドのDistributionConfigから取得し、Enabledをfalseに変更する

aws cloudfront get-distribution-config \
--id 11111111111111 | jq -r .DistributionConfig > distribution.json

sed -i 's/"Enabled": true/"Enabled": false/' distribution.json

 


aws cloudfront update-distribution \
--id 11111111111111 \
--if-match $(aws cloudfront get-distribution-config --id 11111111111111 | jq -r .ETag) \
--distribution-config file://distribution.json


※ if-matchにはETagの値をセット

無効化されるまで待つ


-- ディストリビューションの削除

aws cloudfront get-distribution \
--id 11111111111111

aws cloudfront get-distribution-config \
--id 11111111111111


aws cloudfront delete-distribution \
--id 11111111111111 \
--if-match $(aws cloudfront get-distribution-config --id 11111111111111 | jq -r .ETag)

 

aws cloudfront list-distributions


-- OAIの削除

aws cloudfront list-cloud-front-origin-access-identities


aws cloudfront delete-cloud-front-origin-access-identity \
--id 22222222222222 \
--if-match $(aws cloudfront get-cloud-front-origin-access-identity --id 22222222222222 | jq -r .ETag) 


-- キャッシュポリシーの削除


aws cloudfront list-cache-policies \
--type custom


aws cloudfront delete-cache-policy \
--id 33333333-3333-3333-3333-333333333333 \
--if-match $(aws cloudfront get-cache-policy --id 33333333-3333-3333-3333-333333333333 | jq -r .ETag)

 

-- オリジンリクエストポリシーの削除


aws cloudfront list-origin-request-policies \
--type custom

aws cloudfront delete-origin-request-policy \
--id 44444444-4444-4444-4444-444444444444 \
--if-match $(aws cloudfront get-origin-request-policy --id 44444444-4444-4444-4444-444444444444 | jq -r .ETag)

 


-- バケットの削除
aws s3 ls

aws s3 rb s3://bucket123 --force