AWS CloudFront

# AWS CloudFront

https://d1.awsstatic.com/webinars/jp/pdf/services/20190730_AWS-BlackBelt_Amazon_CloudFront.pdf

 

## Webアクセスの課題

  • レスポンスの遅延、不安定なレスポンス
    • ネットワークレイテンシの低い場所からレスポンスを返したい
  • 大量アクセスへの対応
    • 静的なコンテンツはキャッシュしたい

 

## Contents Delivery Network

 

## 高速配信機能

  • CloudFront ディストリビューション
  • ウェブディストリビューション
    • サポートプロトコル HTTPメソッド
    • オリジンへのアクセスはInternet 経由
  • エッジでもgzip 圧縮機能
    • CloudFront エッジでコンテンツをgzip 圧縮することでより高速にコンテンツを配信
      • リクエストヘッダにAccept-Encoding: gzip を指定
  • キャッシュ動作
    • キャッシュコントロール
      • 単一ファイルのキャッシュは20GBまで
      • URLパスごとにキャッシュ期間指定が可能
      • フォワードオプション機能による動的ページ配信
        • Header / Cookie / Query Strings
      • URLおよび有効かしたフォワードオプション機能のパラメータ値の完全一でキャッシュが再利用される
    • キャッシュコントロールヘッダ
      • キャッシュ時間のコントロールが可能
      • キャッシュコントロールヘッダを付与しない場合でも上書き可能
      • デフォルト24時間
      • 最小0
    • キャッシュファイルの無効化
      • コンテンツごとに設定可能
    • 動的コンテンツ機能
      • 動的コンテンツへの対応
      • ヘッダーをオリジンへ転送
        • オリジンに任意のヘッダー情報を転送することで動的なページ生成にも対応
        • 全てのヘッダーをするとキャッシュヒット率が低下するので悪手
        • カスタムヘッダーにも対応
        • CloudFront独自ヘッダー
      • Cookieをオリジンへ転送
      • クエリ文字列のパラメータの値をオリジンへ転送
    • きめ細やかなキャッシング
    • キャッシュ動作(Behaviors)を活用したマルチオリジンおよびキャッシュコントロールの個別設定
    • カスタムエラーページの生成
      • オリジンが5xx or 4xx を返す時にS3からカスタムエラーページを返すようにできる
    • カスタムオリジンのタイムアウト
    • オリジンフェイルオーバー
      • オリジングループを作成し、プライマリ、セカンダリと指定可能

 

## データ保護機能

  • データ保護機能
    • セキュア配信
      • HTTPS
      • SSL証明書
        • デフォルト証明書
        • 独自SSL証明書
          • SNI SSL証明書
          • 専用IPアドレスSSL証明書
            • 専用IP利用時は別途課金
          • 利用申請が必要
      • ビューワー接続 SSLセキュリティポリシー
        • クライアントとCloudFront間の事前定義されたSSL/TLS プロトコル Cipherの組み合わせをサポート
      • オリジン暗号化通信
        • CloudFront エッジとオリジンの間の通信方式を制御
        • Origin Protocol Policy
          • HTTP Only
          • HTTPS Only
          • Match Viewer(CloudFrontはビューアーリクエストのプロトコルに応じてHTTPまたはHTTPSを使用してオリジンと通信)
      • オリジンカスタムヘッダー
        • エッジ通過時にカスタムHTTPヘッダの追加/上書きが可能
          • オリジンにアクセスできるのはCloudFront のみから
        • リクエストヘッダの調整
      • 地域制限(white list / black list)
        • 制限された場合は403を返す
      • 署名付き URL/Cookie
        • Restricted Viewer Access を有効にするだけで、署名のないアクセスを全てブロック
        • 有効か期間を最小化することを推奨
        • URLの生成
      • フォールドレベル暗号化を仕様した機密データの保護
        • POSTリクエストの得ていデータフィールドを特定のアプリケーションのみアクセスできるように保護
        • オリジンサーバの保護
          • オリジンがS3の場合
            • Origin Access Identity(OAI)を利用
            • CloudFront + S3 の組み合わせでS3への直接アクセスをさせず、CloudFront でS3にアクセスできる人を絞れる機能
          • カスタムオリジンの場合
            • ALBのホストヘッダーのルーティングルールで任意のヘッダをチェック
            • CloudFrontが利用するIPアドレスのみを許可する
      • WAF連携
      • AWS Shield によるDDoS対策
        • デフォルトで有効化、無料

 

## レポート&ロギング機能

  • CloudFront Reports & Analytics
    • レポートできるもの
      • Cache Statistics
      • Monitoring / Alerms -> CloudWatch
      • Popular Objects
      • Top Referrers
      • Usage
      • Viewers
      • Access Log -> S3

 

## Lambda@Edge

CloudFront + Lambda = Lambda@Edge

  • 特徴
    • 完全に自動化された管理
    • 自動スケーリング
    • 利用に応じた支払い
    • 組み込みの耐障害性
    • グローバル分散
  • ユースケース
    • ビューアーのリクエストを受けて、オリジンにリクエストを発行する前にCloudFront cache で返せるものは返す
    • コンテンツ生成
    • セキュリティ
    • コンテンツ生成や処理をエッジで実行

 

## 雑感

キャッシュ目的でなくても、CloudFront を挟むことでレイテンシが改善することは知らなかった。( -> ただしアクセス頻度によっては課金額が怖いことになりそう)

一般的なことであるが、ここをサービスの入り口にして、オリジンはCloudFront 経由でしか受け付けないようにする。キャッシュヒット率を上げることが重要。グローバルサービスでの地域制限はこれを使うとサクッとできそう(ブロードキャスト系のサービスはよくやっている気がする)。職場で運用しているサービスで使えば効果ありそうと思った。