🐈

サーバレス系開発者がCloudFrontについてまとめてみる

2021/05/26に公開

はじめに

普段CloudFrontを使っているものの、適当に説明していたら「同じWEBサイトにアクセスした時に、前回読み込んだロゴ画像をキャッシュから返すとか、そういうのができる」って説明になって、そういうのってなんだよ、ってなったのでちょっと勉強してました。ブログに書いておきます。

podcastでも喋ってました。

CloudFrontとは

CloudFront is 何

CDNサービス

  • Amazon CloudFrontとはCDNサービスである
  • CDNとは、同一のコンテンツをより素早く効率的に配信するためのネットワークである
  • 長いので個人的にはCFと略すことが多い(他と被ってない・・よね?)

解決する課題

  • S3やEC2等を利用すると、簡単に世界中のユーザからコンテンツにアクセス可能にできる
  • ただし、以下のような課題がある
    • 大量のアクセスがある場合、アクセス数分の負荷に耐えなければならない
    • ユーザから遠いロケーションに配置されたコンテンツの取得には時間がかかる
    • XSSやDDoSのリスクがある
    • ・・・等。

できること

  • CloudFrontディストリビューションを作成して、コンテンツを効率的に配信可能
  • ディストリビューションとは、ドメイン単位で割り当てられるCloudFrontの設定の事
  • オリジンサーバをキャッシュし、エッジロケーションにプロビジョニングする
    • オリジンの負荷がオフロードされる
    • ユーザから近いエッジロケーションからコンテンツを取得させる

options

設定で様々なケースに対応可能。

概要

  • CloudFrontディストリビューションの有り・無しの構成
    とりあえず最小限の設定によってキャッシュすることで、効率的な配信ができるようになる。

  • 50%くらい使いこなしている、の図
    それだけで本当にいいのだろうか。

  • 100%使いこなしている、の図
    オプションをもりもりで使えばこんな感じにできる

ユースケースと対応オプション

列挙してみる。

  • オプションの一覧
    • セキュアに通信をしたければHTTPSを利用する
      • デフォルト証明書、独自SSL証明書が使える
        • 独自SSL証明書はSNI、専用IPアドレスSSL証明書が使える
    • 通信方式の制御も可能(TLS1.2や1.1等)
    • XSSやDDoS等の対策も可能
      • AWS WAFをディストリビューションにセットできる
      • AWS Shieldがデフォルトで組み込まれている
    • アクセス制御をするにはRestricted Viewer Accessを利用
      • 署名付きURLや署名付きCookieを利用する
        • 複数のファイルを制御するなら署名付きCookieを利用
      • S3ならさらにOrigin Access IdentityでS3でアクセスコントロールできる
        • 必ずCloudFrontを経由する仕組みが実現できる
    • 接続地域を制限したいならGeo-Restrictionsを利用
    • POSTリクエストの特定のフィールドだけアクセスできるようにもできる
      • フィールドレベル暗号化を利用
    • キャッシュの制御もできる
      • TTLを設定できる
      • Invalidationでキャッシュの削除もできる
    • コンテンツやヘッダーの加工もできる
      • ビューワーリクエスト→オリジンリクエスト→オリジンレスポンス→ビューワーレスポンスという4つの区間に分けて加工できる
      • ヘッダーを追加したり上書きできる
      • エラーページを設定できる
      • Lambda@Edgeをトリガできる
        • Lambda@Edge内でコンテンツやヘッダを加工できる
          • Header、URL、クエリ文字列の読み書き等が可能
    • ここまでの設定をパス毎に設定できる(パス毎の単位をBehavierという)
    • セカンダリオリジンを設定して、フェイルオーバーの設定もできる
  • CloudWatchと連携して各種ログの確認ができる

まとめ

  • CloudFrontとは、CDNサービスである
  • CDNサービスとは、同一のコンテンツをより素早く効率的に配信するためのネットワークである
  • 例えば、同じWEBサイトにアクセスした時に、前回読み込んだロゴ画像をキャッシュから返すとか、そういうのができる

参考

Discussion