概要

CDNとしてコンテンツをキャッシュできる。全世界にキャッシュを持つので、キャッシュクリアや設定の変更反映には時間がかかるので注意。またCloudFrontにキャッシュさせるとブラウザキャッシュにも入ってしまうので、なんかおかしいなと思ったらブラウザのキャッシュクリアも試してみること。設定の変更には時間がかかるので検証する場合はまとめて&気長に!

CloudFront 用語集

DistributionCloudFrontの一番大きな管理単位
OriginDistributionに複数配置可能。次のBehaviorsにて/path以下を別ドメインに割り当てるなんてことも可能。
Behaviorsパスに対してどのoriginを割り当てるかの設定。path/*をどのOriginにするかを指定する。クエリーストリングを渡さないのがデフォルトなので注意。パスはそのままoriginにわたるので/hogeだとorigin/hogeになる。あと末尾が完全一致しないと飛ばないのでwiki/*にたいしてwikiではマッチしない。
C Nameランダムなxxx.cloudfront.netだとアクセスしづらいのでCNameを設定できるが正規のSSL証明書が必須となった

cli

一覧aws cloudfront list-distributions
invalidationaws cloudfront create-invalidation --distribution-id XXXXXXX --paths '/*'

SSLでCNAMEを使う

  1. ヴァージニアのACMに独自証明書をインポートする。

https://recipe.kc-cloud.jp/archives/11408

  1. terraform

https://qiita.com/tos-miyake/items/f0e5f28f2a69e4d39422

https://tech.torico-corp.com/blog/aws-cloudfront-acm-ssl-sertificate/

キャッシュについて

デフォルト設定

何もしないとデフォルトは24時間キャッシュ。クエリストリング部分は参照しないのでwikiなんかでは延々とTOPページが表示される。originサーバーでのCacheヘッダーを参照するようにするとその通りに動いてくれる。no-cacheやprivateを入れていればキャッシュしない。Behaviroの設定でカスタマイズすることもできるのでurlパス単位で設定できる。

PHPだと以下のキャッシュコントロールを入れるとキャッシュされなかった。

<?php
header("Cache-Control: no-cache");
header("Cache-Control: private");
date_default_timezone_set('JST');
echo date(DATE_RFC2822);
echo date("Y/m/d G:i:s");

QueryString Forwarding and Caching

Noneクエリーストリング無視。完全静的ページ向け
Forward all, chache based on whitelistクエリーストリングで指定パラメータ以外はキャッシュする。a=xxx&b=123でaが指定されている場合bが変わってもa=xxxのページキャッシュがかえる
Forward all, cache based on allクエリーストリング列も含めてキャッシュ対象

キャッシュかどうかの見分け方

キャッシュがないときX-Cache: Miss from cloudfront
キャッシュ有通常ページX-Cache: Hit from cloudfront
キャッシュ有かつエラーページX-Cache: Error from cloudfront

IP制限

Terraform使ってやるといい https://www.terraform.io/docs/providers/aws/d/ip_ranges.html

キャッシュ無効化

キャッシュ無効化は1000件までは無料。ワイルドカードでも良いので消したいフォルダの上位で指定するのが無駄なくて良い。無効化は各エッジサーバーに伝播するのに、結構時間がかかるのとObjectの数が3000個らしいので頻繁に変わるところは適宜キャッシュコントロールを付けるのがおすすめ。

Originの制限

Lambda@Edge

仕掛けるタイミングはViewer Request/Origin Request/Origin Response/Viewer Responseで4つ。それぞれ一つだけであるが、behaviorごとに設定できる!

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-edge.html

注意点

ARN

default_cache_behavior {
# 中略
   # lambda@Edge
   lambda_function_association {
     event_type = "viewer-request"
     lambda_arn = aws_lambda_function.redirect.qualified_arn
   }
}

必要な権限

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": ["lambda.amazonaws.com", "edgelambda.amazonaws.com"]
      },
      "Effect": "Allow"
    }
  ]
}
AWSServiceRoleForLambdaReplicator
AWSServiceRoleForCloudFrontLogger

Behaivor

上から順番に一致なので、より細かいものを上に持ってくるべし

hoge/*
hoge/moge/*
hoge/moge/*
hoge/*

エラーページ

CloudFrondの障害など

年1-2回レベルで発生しているらしいので、落ちた時の対策を考えておく必要がある。

CloudFront用のrewrite設定

Wordpress

RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} !CloudFront
RewriteCond %{REQUEST_METHOD} =GET
RewriteRule ^(.*)$ http://%1クラウドフロントのURL$1 [R=301,L,NE]

最後のNEはURLエンコーディングをしないということで、これを入れないと検索できない。

pukiwiki

もともとno-cacheなので大して負荷軽減にはなってないぞ。

RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} !CloudFront
RewriteCond %{QUERY_STRING} !(cmd=edit|plugin=newpage|その他除外したいクエリー)
RewriteCond %{REQUEST_METHOD} =GET
RewriteRule ^(.*)$ http://%1クラウドフロントのURL$1 [R=301,L,NE]

同じくNE必須。

ログの出力

ログを出力を有効にすると約10分毎にログがS3に生成される。PUTが多くなるのでS3の無料枠をはみ出すことになるので本格運用する場合はコストに含めておくべき。

CloudFront移行

同じcnameは同時に存在できないので、移行元で別名に変更後、わりとすぐに別名で作成できる。

S3連携

"だがうまくいかない"
{
   "Version": "2008-10-17",
   "Id": "PolicyForCloudFrontPrivateContent",
   "Statement": [
       {
           "Sid": "1",
           "Effect": "Allow",
           "Principal": {
               "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXX"
           },
           "Action": "s3:GetObject",
           "Resource": "arn:aws:s3:::アクセスさせたいバケット名称/*"
       }
   ]
}

S3連携でDirectory Index実現

Lambda@Edgeのoriginトリガー(cache missの時に動く、/をindex.htmlにするだけであればこれで十分)

Counter: 3855, today: 1, yesterday: 0

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-10-14 (金) 13:16:53