Amazon CloudFrontを 利 用 した サイト 高 速 化 とセキュア 配 信 Kiyonori Kitasako Solutions Architect, Amazon Data Service Japan 2014.07.18 Session #TA-06 2014 Amazon.com, Inc. and its affiliates. All rights reserved. May not be copied, modified, or distributed in whole or in part without the express consent of Amazon.com, Inc.
自 己 紹 介 名 前 所 属 仕 事 北 迫 清 訓 (きたさこ きよのり) アマゾンデータサービスジャパン ソリューションアーキテクト メディアおよびコンテンツ 配 信 系 のお 客 様 を 主 に 担 当 コンテンツ 配 信 アーカイブなどの 案 件 に 従 事
Agenda 1. Amazon CloudFront 2. 3. 4. CloudFrontによるサイト 高 速 化 CloudFrontによるセキュア 配 信 まとめ
Amazon CloudFront
Contents Delivery Network 世 界 中 にあるエッジのキャパシティを 活 用 して 高 速 かつ 効 率 的 にコンテンツを 配 信 可 能 なサービス ユーザからのアクセスを 最 も 近 いエッジサーバに 誘 導 することでユーザへの 配 信 を 高 速 化 エッジサーバでは コンテンツのキャッシングを 行 い オリジンサーバに 負 荷 をかけずエッジから 直 接 配 信
Contents Delivery Network ユーザ 体 験 の 向 上 CDNサービス オリジンサーバ 台 数 の 削 減 リクエスト 配 信 コンテンツ 取 得 リクエスト オリジン キャッシュから 配 信 キャッシュ クライアント レスポンス 向 上 Amazon CloudFront 負 荷 軽 減
Contents Delivery Network 最適なエッジへの誘導 ②IPアドレス問い合わせ (xxx.cloudfront.net) ①ドメイン名問い合わせ DNSリゾル バ Internet Amazon CloudFront CloudFront DNS 位置情報DB ③最適なEdgeアドレス応答 Edge Location クライアント ④最適なEdgeへアクセス ⑤キャッシュがなければ オリジンから取得 オリジン
Global Edge Locations Europe Amsterdam, Netherlands(2) Dublin, Ireland Frankfurt, Germany (3) London, England (3) Madrid, Spain Marseille, France Milan, Italia Paris, France (2) Stockholm, Sweden Warsaw, Poland North America Atlanta, GA Ashburn, VA (3) Dallas, TX (2) Hayward, CA Jacksonville, FL Los Angeles, CA(2) Miami, FL New York, NY (3) Newark, NJ Palo Alto, CA San Jose, CA Seattle, WA South Bend, IN St. Louis, MO South America Sao Paulo, Brazil Rio de Janeiro, Brazil 52 Edge Locations 2014年07月時点 Asia Chennai, India Hong Kong, China(2) Manila, Philippines Melbourne, Australia Mumbai, India Osaka, Japan Seoul, Korea Singapore (2) Sydney, Australia Taipei, Taiwan Tokyo, Japan(2)
CloudFrontによる サイト 高 速 化
Webアクセスの高速化 クライアント HTTPリクエストにおける 80 20の法則 TCP Connection Send Receive DNS Lookup 20 index.jsp style.css 8 0 hoge.js itme1.png item2.png 215 request
Webアクセスの 高 速 化 TCP Connection DNS Lookup Send Receive クライアント オリジン 物 理 的 な NWスピード CloudFront 通 信 の 最 適 化 クライアント レスポンス キャパシティ オリジン
CDN Edge Locationの 活 用 物 理 的 なネットワークスピード( 距 離 ) DC クライアント ISP ISP IX ISP オリジン AWS edge AWS edge キャッシュ IX/Teir1 AWS region
CDN Edge Locationの 活 用 レスポンスキャパシティ DC オリジン クライアント AW S edg e VS サーバキャパシティ ネットワークキャパシティ Edge Capacity
CDN Edge Locationの活用 分散型 CDN 集中型 CDN ISP ISP クライアント クライアント Edge ISP Edge ISP ISP IX Edge ISP Edge クライアントに 近いエッジ ISP IX ISP AWS edge AWS edge VS キャッシュヒット 率が高い キャッシュ共有
CDN Edge Locationの 活 用 CloudFrontのEdgeに 可 能 な 限 りキャッシュ させることが 重 要
CDN Edge Locationの 活 用 可 能 な 限 りキャッシュからコンテンツを 配 信 HTTPリクエストにおける80:20の 法 則 静 的 コンテンツ 動 的 コンテンツ 80 20
キャッシュの 活 用 静 的 コンテンツは 全 てキャッシュさせることで CDNの 効 果 を 最 大 化 キャッシュTTLも 可 能 な 限 り 長 く クライアント 側 にもキャッシュさせる 画 像 ファイル 動 画 ファイル CSS Java Script 静 的 HTML
動 的 コンテンツ 動 的 コンテンツ 動 的 コンテンツ(ページ 共 通 ) 動 的 コンテンツ(パーソナライズ)
キャッシュの活用 動的コンテンツ(ページ共通) リクエストに応じて動的にページ生成は行われる が 生成されるページ自体は一定期間共通 例えば /item/contentsdetail?item_id=012345 (商品詳細) /api/listcategory?category=cloud (カテゴリ一覧) /api/listcontents?top=10 (人気商品一覧) Query Stringsを活用している
キャッシュの 活 用 動 的 コンテンツ(ページ 共 通 ) HTTPヘッダー 判 定 によるページ 切 り 替 え 例 えば User-Agentを 見 てクライアント 端 末 に 適 したページを 応 答
キャッシュの 活 用 動 的 コンテンツでも 一 定 期 間 ページ 更 新 が 不 必 要 なものは 積 極 的 にキャッシュ 日 単 位 時 間 単 位 分 単 位 秒 単 位 Cache-Control Header と Minimum TTLで 調 整
キャッシュの 活 用 短 期 間 でのキャッシュの 更 新 クライアント CDN Edge キャッシュ( 短 期 ) If-Modified-Since オリジン Last-Modified /ETagヘッダー キャッシュの 再 利 用 キャッシュ( 期 間 切 れ) 304 (Not Modified) 更 新 なし 最 適 化 された 通 信 更 新 あり
キャッシュヒット 率 の 向 上 ヒット 率 向 上 のための 要 素 キャッシュ 時 間 URLの 共 通 化 Etag / Last-Modifiedヘッダーの 活 用 (オプション)Query Stringsパラメータ 値 の 固 定 化 (オプション) 転 送 対 象 Header 値 の 固 定 化 CloudFrontは 完 全 一 致 でキャッシュを 共 有
キャッシュヒット 状 況 の 確 認 HTTPクライアントでレスポンスヘッダーを 確 認 > curl --head http://dxxxx.cloudfront.net/index.php HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Date: Wed, 16 Jul 2014 07:34:38 GMT Server: Apache/2.2.26 (Amazon) X-Powered-By: PHP/5.3.28 Cache-Control: no-store X-Cache: Miss from cloudfront X-Amz-Cf-Id: fhhlqzdhwy1y8ea8feo-mrfcp2g1mdo8mzirzi3fgu2x3gtmnxyyha== > curl --head http://dxxxx.cloudfront.net/index.php HTTP/1.1 200 OK : X-Cache: Hit from cloudfront X-Amz-Cf-Id: -ZS2M7j2qsW5fOEPCrMlyx2jo5pRvi7altuyN1hwFQxUZOeog6Axng== > curl --head http://dxxxx.cloudfront.net/index.php HTTP/1.1 200 OK : X-Cache: RefreshHit from cloudfront X-Amz-Cf-Id: HbXR9PvZ_JjOa3xFuzZ41DqImkqDkDU84Gxn5of0zUobVjY0956hXg== オリジン キャッシュ キャッシュ 再 利 用
CDN Edge Locationの 活 用 キャッシュができない 動 的 ページはEdgeを プロキシとして 利 用
動 的 コンテンツでの 活 用 Dynamic Contents Acceleration CloudFrontによる 最 適 化 されたOriginとの 通 信 POST/PUT, Header, Cookie 対 応 Keep-Alive Connection TCPスロースタート
POST/PUT, Header, Cookieの 対 応 キャッシュできない 動 的 コンテンツ POST/PUTリクエストはPROXYとして 動 作 OriginへのHeaderやCookie 情 報 の 転 送 Cloud FrontのEdgeを 経 由 させても 多 くの 動 的 ページが 扱 えるように その 上 でEdgeとOrigin 間 通 信 の 最 適 化
Keep-Alive Connection 従来のTCP Connection TCP Connection Send Receive DNS Lookup TCP 3 Way Handshake クライアント オリジン SYN SYN- ACK USER 1 120ms ACK GET /index.jsp SYN SYN- ACK Webサーバ USER 2 120ms オリジンへの負荷が増加 ACK GET /index.jsp 30ms
Keep-Alive Connection CloudFrontによるKeep-Alive Optimization Keep-Alive クライアント SYN SYN- ACK USER 1 120ms ACK GET /index.html SYN オリジン CDN Edge SYN SYN- ACK GET /index.jsp HTTPS通信の場合 もっと顕著な差が GET /index.jsp CloudFrontで SSL Termination ACK SYN- ACK USER 2 60ms ACK GET /index.html 10ms 20ms
TCPスロースタート ネットワークの輻輳を回避 するために少しづつパケッ トを増やしながら通信する 仕組み TCP Slow Start クライアント オリジン Packet 1 Packet 1 ACK User TCP Connection Send Receive DNS Lookup Packet 2 Packet 3 Packet 3 ACK Packet 4 Packet 5 Packet 6 ユーザの新規TCPコネクション毎に発生 Packet 7
TCPスロースタート CloudFrontによるTCP Slow Start Optimization TCP Slow Start CDN Edge USER 1 Packet 1 Packet 1 ACK CDN Edge オリジン オリジン Packet 1 USER 2 Packet 2 Packet 3 Packet 2 Packet 4 Packet 3 Packet 3 ACK Packet 4 ACK Packet 4 Packet 5 Packet 5 Packet 6 Packet 6 Packet 7 Packet 7 Packet 8 既存のコネクションを流用するため スロースタートシーケンスをバイパス
DNS Lookupの高速化 ホストの名前解決にRoute53を活用 CloudFrontはAlternative Domain Name Originの名前解決にも TCP Connection Send Receive DNS Lookup Amazon Route53 世界52箇所にDNSサーバを配備 Anycastを利用してレイテンシー が低いDNSが応答
DNS Lookupの 高 速 化 CloudFrontのAlternative Domain NameをRoute53を 利 用 して 名 前 解 決 する 際 は レコードセットのTypeを CNAMEではなくAレコードのAliasを 利 用 することで クエリ 回 数 の 削 減 が 可 能 CNAM E > nslookup cdn.awssummit.co.jp Server: 192.168.2.1 Address: 192.168.2.1#53 A Recode + Alias > Nslookup cdn.awssummit.co.jp Server: 192.168.2.1 Address: 192.168.2.1#53 cdn.awssummit.co.jp. Non-authoritative answer: cdn.awssumit.co.jp canonical name = dxxxx.cloudfront.net. Name: dxxxx.cloudfront.net Address: 54.230.234.XXX Name: dxxxx.cloudfront.net Address: 54.230.234.XXX : Non-authoritative answer: Name: cdn.awssumit.co.jp Address: 54.230.234.XXX Name: cdn.awssumit.co.jp Address: 54.230.234.XXX Name: cdn.awssumit.co.jp Address: 54.230.235.XXX :
Webアクセスの 高 速 化 CloudFront TCP Connection DNS Lookup Send Receive Route53 Route53 クライアント オリジン 物 理 的 なネットワーク 速 度 エッジキャッシュおよびキャパシティの 活 用 オリジンとの 通 信 の 最 適 化 DNSクエリ
CloudFrontでの 実 現 方 法 静 的 動 的 コンテンツの 混 在 環 境 におけるCloudFrontの 設 定
CloudFront Behaviorの活用 URL毎に異なるキャッシュポリシーを適用 http://www.aws.com/ img/item01.jpg api/cache-itme?id=10 クライアント index.jsp Behavior Cache TTL (正規表現) Custom TTL img/* 30 Days api/cache* * AWS MC 動的ページは Cache-control: no-cache, no-store Custom TTL 10 min Use Origin オリジン
CloudFrontによる セキュア 配 信
CloudFrontのセキュア 機 能 HTTPSサポート GEO Restriction Signed URL( 署 名 付 きURL)
Signed URLとは CloudFront経由で配信するコンテンツに対して 期間指定URLを生成することで 配信コンテン ツを保護する機能 CloudFront 秘密鍵 署名付きURL発行 オリジン 認証サーバ 署名確認 クライアント CloudFront Signed URL有効 オリジンへのダイレクトアクセス Origin Access Identity(OAI) Amazon S3 接続元IP制限 Webサーバ
Signed URLの 仕 組 み 指 定 可 能 ポリシー 既 定 ポリシ(Canned Policy) アクセス 有 効 終 了 時 刻 許 可 コンテンツフルパス カスタムポリシ(Custom Policy) アクセス 有 効 開 始 終 了 時 刻 アクセス 元 IPアドレス 制 限 許 可 コンテンツパスワイルドカード 指 定
Signed URLの 作 成 方 法 1. ポリシー 定 義 をJSONフォーマットの 文 字 列 で 準 備 2. AWSアカウントのCloudFront 用 秘 密 鍵 で 文 字 列 を 暗 号 化 3. コンテンツURLのQuery Stringsにパラメータとしてセット https://dxxx.cloudfront.net/secure/media01.mp4? Signature=Yana7RByw30iPHZQzFKIyqoAsLHMPPeZ~w- 7RPuHeVTY06VDgnW7MbNjQSbGkHn9kWPdlFAWCX7g1q9Mk5kORLXMcJwCOCm165~P6ss9Bj8rMmY NoIj96u7Nm3xzwbFHfCf5WyafA6aX1PoQ2Vgod98TZVhHGuTdA-IuiMz6Ly8_ &Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9kMWJ3amwwb3JteW9veC5jbG91ZGZyb2 50Lm5ldC9obHMvKiIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTM5N DI0NjMwM319fV19 &Key-Pair-Id=APKAIZ4RI4PUMO3SNKLQ CloudFront 用 秘 密 鍵 があればどこでも URLの 生 成 が 可 能
Signed URLの利用領域 プレミアムコンテンツ配信 ダウンロード配信 (ゲーム, 映像, 音声, データ) ストリーミング配信 (映像, 音声) 既存認証システムと連携し コンテンツに対して複雑な保護処理を 施さなくても簡単かつセキュアに配信 CloudFrontの設定と既存認証システム でのURL生成機能の実装のみ
Signed URL Tips 有 効 時 間 の 設 定 ダウンロード 時 は 有 効 時 刻 を 短 く 設 定 ストリーミングは 映 像 音 声 の 再 生 時 間 +αを 設 定 CloudFrontの 設 定 Behavior 毎 にSigned URLの 有 無 が 指 定 可 能 アクセスURLの 正 規 表 現 を 利 用 し Distributionを 分 けなくても 特 定 のコ ンテンツのみ 保 護 可 能 アクセス HTTPSと 場 合 によってはGeo Restrictionとの 組 み 合 わせ キャッシュの 有 効 活 用 キャッシュされたコンテンツにも Signed URLは 有 効 クライアントにキャッシュさせたくな いコンテンツは Cache-Controlヘッ ダーのno-cache, no-storeと CloudFrontのCustom TTLで 調 整
まとめ
CloudFrontの 活 用 インフラアプローチによるサイト 高 速 化 の 実 現 動 的 コンテンツに 関 してもCloudFrontを 上 手 く 活 用 セキュアなコンテンツ 配 信 も 容 易 かつ 高 速 化 が 可 能 チリも 積 もれば 速 くなる
2014.09.09 SAVE THE DATE http://csd.awseventsjapan.com/ Cloud Storage & DB Day 検 索