CDNトラブルシュート(CDN移行)


CDNの移行においては、以下のような(一般的な)CDNトラブルが発生する可能性があります。

  • キャッシュされない
    • CDN切替によりオリジンサーバの負荷が上がり、サービスダウン
  • キャッシュされる
    • CDN切替により情報漏えいが発生する
  • アクセスが遅くなる
  • CDNが外れる

キャッシュに関するトラブルは致命的なものとなりやすいため、ここではキャッシュ関連のCDNによる違いをまとめます。

レンジリクエストへの対応

レンジリクエスト(巨大ファイルに対するファイルの部分取得)については、CDNより対応が大きく異なります。詳細については「レンジリクエスト」を参照ください。

Cookie、クエリ文字列の扱い

最近のCDNでは、動的ファイルに対するキャッシュとして、Cookie、クエリ文字列、ユーザエージェント等をキーとしたキャッシュが可能になっています。ただし、CDNにより対応レベルは異なり、以下に分類されます

  • Cookie等をキーとして認識できる
  • ホワイトリスト(オブジェクト認識に使用するキー)の指定が可能
  • ブラックリスト(オブジェクト認識に使用しないキー)の指定が可能

オリジンサーバのHTTPヘッダ

オリジンサーバが発行するcache-controlなどのHTTPヘッダ(キャッシュ指示)は、CDNにより扱いが異なります。

設定の優先度

どちらを優先するかにより、キャッシュの振る舞いが変わります。それぞれにユースケースが存在しますが、CDNによっては片方の優先度しか取れません:

  • オリジンサーバのcache-control > CDNへのTTL設定
    • ユースケース
      • CDNで全体的なTTLを設定し、特定のページのみno-cache等でキャッシュさせない
  • CDNへのTTL設定 > オリジンサーバのcache-control
    • ユースケース
      • WordPressのようなすべてのphpページに対しno-cacheを発行するCMSにおいて、no-cacheを無視する(phpをキャッシュさせる)

対応

オリジンサーバのcache-controlをCDNで解釈する際にも、RFCに完全に準拠していない場合があります。

障害例

Mercari社(2017)

  • 概要
    • CDN切替において、ユーザ別ページがCDNによりキャッシュされ、情報の漏洩が発生した
  • 詳細
    • 切替後のCDNは、積極的にコンテンツをキャッシュする仕様になっていた
      • 新CDNの特徴
        • “Cache-Control: no-cache”を無視してキャッシュする
        • Expiresヘッダが過去のものであっても、有効なCache-Controlがあればキャッシュする(上記:no-cacheの場合もキャッシュ)
  • 鍋島補足
    • CDNキャッシュによる情報漏えいは、「アクセスしたユーザの情報が他のユーザから見ることができる」というものであり、データベースの情報漏えい(全ユーザの情報リストが外部に流出)よりも軽微なものです
    •  AkamaiからFastlyへの切替であると思われます
    • Fastlyの場合、国内配信サーバの数は多くない(多分、数十台程度)ため、実際の漏洩数は多くはないと思われます
    • 現状、CDNにキャッシュさせたくないオブジェクトに対しては”Cache-Control:Private”を付けるのが無難です
    • ユーザページに対する外部監視を行い、CDNでキャッシュされているかどうか判定することは有効です
  • リンク