見出し画像

【メモ】 CloudFrontについて調べた

主な特徴

CloudFrontとはCDN(コンテンツデリバリーネットワーク)で、
エンドユーザーにコンテンツをより低いレイテンシー(応答までの時間)で届けるサービス

  • CDNのメリットとしてCF側にキャッシュを貯めておくことができる

  • レスポンスが早く、レイテンシーが低くコンテンツが返せる

  • オリジンサーバの負荷低減(リソース節約)になる

グローバルエッジネットワーク

400 以上のエッジロケーションと 13 のリージョン別中間層キャッシュからなる、グローバルなネットワークを展開
日本には東京20, 大阪に7のエッジロケーションがある。

リージョン別エッジキャッシュ

(リソースを提供するサーバをオリジンと呼ぶ)
edge locationだけでなく、regional edge cacheと呼ばれる層も存在する。
400以上あるedge locationsはregional edge cacheからコンテンツが配られる。それによってオリジンサーバー側が全てコンテンツを配る必要がなく、効率的にコンテンツ配信が出来る。

Origin Shield

regional edge cacheを拡張したもの。別のリージョンからリクエストが来る場合のパフォーマンス向上。
Original Shieldを使わない場合、海外のregional edge cacheから直接オリジンサーバにリクエストが来るため負荷になりやすい。

オリジンサーバと同じリージョンにregional edge cacheと同く仕組みをOriginal Shieldと呼ぶ。海外リージョンから来たリクエストもOrigin Shieldを経由することができ、リクエストの削減・コスト最適化に寄与する。

Automatic Flash Crowd Protection

通常エッジにコンテンツキャッシュがない場合、ユーザー側のリクエストはすべてオリジンにもリクエストが来てしまう。
同時に大量リクエストが発生した場合(Flash Cloud)最初のリクエストのみをオリジンに送る負荷軽減する仕組み。

キャッシュコントロールとポリシー

CloudFrontの設定

  • ディストリビューション(カスタムドメイン、SSL、TLSなどの証明書紐付け、ログ)

    • Behavior

      • パスパターンに合わせてどのオリジンサーバに紐づけるのか設定

        • ex: image/*

      • キャッシュポリシー

      • オリジンリクエストポリシー

    • Origin

      • どのオリジンサーバにCloudFrontを紐づけるのか設定

        • ex: {bucket-name}.s3.{region}.amazonaws.com

        • (この場合S3がオリジンサーバになる)

コンテンツを適宜キャッシュしたり、Origin request policyを使ってedge側でwebに対する攻撃を防御することも可能

Behavior

  • キャッシュコントロール機能

  • キャッシュヒット率を向上させる

    • GET, HEAD, OPTIONのリクエストがキャッシュ対象

  • 単一リクエストのキャッシングは最大30GB

  • 同一のコンテンツを返すためにキャッシュキーにできる値は、URL、Cache Policyで有効化したHTTPヘッダー、Cookieパラメータが完全一致した場合、キャッシュが再利用される

キャッシュキーを設定すると、設定したキーのみオリジンに送られる仕組みだった
→これだとキャッシュキーにはしたくないがオリジンには送りたいニーズがあったので2020年からポリシーが分離した

  • キャッシュポリシー

    • consoleから設定が可能

    • どの値をキャッシュキーにしてcache controlするか

  • オリジンリクエストポリシー

    • クライアントからリクエストした値のうちどれを転送するのか設定できる

キャッシュファイルの無効化(Invalidation)

  • ワイルドカードを使って無効化パスを指定する

  • キャッシュファイルの無効リクエストは有償なので、日々の業務においてはCache Policyの各TTLや、オリジンで指定するCache-Controlレスポンスヘッダで適切なキャッシュ期間を設定する

    • 最初の1000パスまでは追加料金なしでそれ以降は従量制

Origin Group

  • オリジンフェイルオーバー機能

    • primary, secondaryオリジンの2つのオリジングループを作成することで、400, 500系エラーが発生した場合secondaryオリジンにroutingすることができる機能

CloudFront Header

ユーザーがCloudFrontを経由してリクエストされた場合、様々のヘッダを付与した状態でオリジンにリクエストすることが可能。
オリジンリクエストポリシーで追加可能

Server Timingヘッダを利用することでユーザーリクエストのトランザクション全体のメトリクスを確認することができる
レスポンスヘッダポリシーから設定が可能

レスポンスヘッダポリシー

CloudFront→ポリシー→レスポンスヘッダー→レスポンスヘッダーポリシーを作成 から設定可能
CORSヘッダやセキュリティ関連のヘッダ、任意のカスタムヘッダを定義

CloudFrontのEdgeのコンテンツ圧縮機能

  • Cache policyのGzip, Brotli(ブレトリ)を有効

  • BefaviorのCompress Objects Automaticallyを有効

  • リクエストヘッダにAccept Encoding:gzip,brが指定されていて、オリジンがレスポンス圧縮に対応していない場合はCloudFrontエッジでGzip、Brotli圧縮をおこなって配信

  • これによりキャッシュがある場合は圧縮されたキャッシュを返すことができる

Lambda Edge

リクエストorレスポンスを受け取る前と後をトリガーにしてAWS Lambdaを実行することができる
Lambda Edgeではファイルシステムのアクセスもできるので、SSRや画像コンテンツのリクエスト前にクエリ文字列に合わせて画像フォーマットを変更したりなど、複雑な処理が可能。

CloudFront Functions

Edge location側でプログラムを実行することができる。(1ミリ秒未満)

  • Lambda Edgeと違いユーザーにより近いEdge locationで処理を実行することができる。

  • オリジンリクエスト、オリジンレスポンのトリガーは前項のLambda Edgeで実行する。

  • Lambda Edgeと異なり外部へのリクエスト、ファイルシステムへのアクセスができない

  • 実行環境は軽量なjavascriptのみ

  • 具体的には簡単な認証(basic 認証)やurl rewriteやヘッダの操作など

Cloud Frontのビヘイビアから設定可能

エラーレスポンスのカスタマイズ

4xx, 5xxエラーの場合はレスポンスページを別のオリジンに指定することができる

GEO制限

特定の国のユーザーに対するアクセス制御が可能
有効にすることで、日本からのアクセスのみ許可する設定などが可能

レポート・モニタリング

ログやメトリクスを可視化することができる

キャッシュ統計や、よく接続されるオブジェクトなど見る事ができる

CloudWatchを参考に閾値を設けて障害や異常検知を行える
Amazon Athena(SQLで分析できるツール)+Amazon QuickSight(グラフ)を使ってデータを可視化することもできる。

リアルタイムログ

edge locationからログを集約することで1分以内のログ収集が可能
Kinesis Data Streamを経由する

セキュリティポリシー

ViewerとCloudFront間のSSL,TLSの組み合わせを選択することができる

オリジンサーバの保護

クライアントからCloudFrontを経由せずにオリジンサーバにアクセスされることを防ぐ
S3であればOAI(origin access identify)が使えるがカスタムオリジンサーバはヘッダやIPアドレスで制限するのは運用が大変だった
→CloudFrontのManaged Prefix Listを使う
VPNセキュリティグループルールでIPアドレスを制御することができる

フィールドレベル暗号化

POSTリクエストの特定のデータフィールドを特定のアプリケーションのみアクセスできるように保護できる
public keyを使って複合化できる。

クレジットカード番号情報をユーザー情報と合わせてサーバーに送る場合、データベースに生のまま保存したくない時に使える。

AWS Shield

DDoS攻撃対策, WAFと連携することができる

CDNに必要なセキュリティ

ユーザー → CDN → オリジン(S3やApplication Load Balancerなど)
関連する脅威

  • DDOS攻撃

    • 大量アクセスすることでサービスダウンされる

  • Bot

    • スクレイパーなど悪質なもの

  • HTTP攻撃

    • XSS, SQLiなど脆弱性を攻撃

  • 認証しないと閲覧できないコンテンツを盗むもの

AWS WAF

Web application firewall
DDos, HTTP攻撃からの保護
通信内容を検査して不正なアクセスを遮断するセキュリティ対策
Webアプリケーションの脆弱性を悪用した攻撃からwebアプリケーションを保護

  • 悪意のあるリクエストを検知・ブロック

  • カスタムルールの適用

  • モニタリング

    • どのくらいブロックしたのか等

    • cloud watchと組み合わせて利用

  • Web ACL

    • Rule → Actionを設定することができる

    • ルールに対してブロックするのか検知のみするのか等の設定が可能

DDos攻撃に有効なのがレートベースルール。
5分間あたりの同一IPからのリクエスト数が設定された閾値を超過したらBlock or Countする

  • AWS Managed Rules for AWS WAF

    • Ruleをセットしていくのを個別で作成して運用すると大変なので、事前に構築済みのルールセットを使用することができる

    • 一部のルールを除いて追加必要なしで利用することが出来る

    • 内容が最新の攻撃手法に合わせてアップデートされる

  • Bot Controlルールグループ

    • ボットと判断されるトラフィックを検知して、それに基づいたアクションを指定することができるグループ

    • リクエストの内容からボットの種別(search engineなど)をラベル情報として付与

    • ラベルを元に処理を場合分けすることが可能

Cloud FrontにきたリクエストをWAFが検査
スコープダウンステートメントを利用して特定のURLに対して適用することも可能

  • Custom Response

Blockした際に403以外のカスタムレスポンスを返却することができる

実践的な対策としては、

  • 国内経由と海外経由で別のレートベースルールを適用する

    • DDoS攻撃は海外経由が多い傾向

    • 国内からのアクセスは緩めにして、海外からのアクセスは厳しめにすることが可能

  • レートベースルールBlock時にあえて200status codeでレスポンス

    • 対策されたと検知されるとIPアドレスを変えながら繰り返しDDoS攻撃してくるパターンの対策ができる

    • カスタムレスポンスで4xx系ではなく2xx系レスポンスして対策

  • サーチエンジンなどの悪意のないボットのクロールレートを調整

    • 悪意のないボットアクセスでも頻度によっては負荷を与えることがある

    • 頻度が高すぎる場合に429(Too Many Request)レスポンスを返す

    • 良性のボットの多くはクロール先からのレスポンスに従ってクロールレートを調整するメカニズムが存在する

AWS Shield Advanced

DDoSは複数のリソースからターゲットに対して攻撃してくる。(1つのリソースからの攻撃はゆるやかでも、多くの複数リソースから攻撃される場合がある)レートベースルールだと不安な場合に検討する。

  • AWS Shield Standard

    • 自動的に適用されている

    • 一般的なDDoS攻撃に対して自動的に緩和

  • AWS Shield Advanced

    • 大規模かつ高度な攻撃に備える

    • Shieldレスポンスチームという年中無休の専門チームが支援

プライベートコンテンツの保護

動画、音楽など購入者のみ閲覧
署名付きURL, 署名付きCookieを利用
Cloud FrontのBehaviorから「ビューワーのアクセスを制限する」を有効にすることで署名のないアクセスを全てブロックすることができる(URLもしくはCookieで指定)

特定のパスパターンにだけ適用することも出来る

クライアント側から認証リクエストを送る、署名付きのURLまたはCookieを生成してクライアントにレスポンスする→認証情報を載せた状態でCloudFrontにアクセスすることで署名を検証して問題がなければコンテンツを返却するフローが可能。
単一コンテンツは署名付きURL、複数コンテンツの場合は署名付きCookieが推奨されている。


スキ頂けると嬉しいです〜