© 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.
Amazon CloudFrontを利用した
サイト高速化とセキュア配信
Kiyonori Kitasako
Solutions Architect, Amazon Data Service Japan
2014.07.18
自己紹介
• 名前
北迫 清訓 (きたさこ きよのり)
• 所属
アマゾンデータサービスジャパン
ソリューションアーキテクト
• 仕事
メディアおよびコンテンツ配信系のお客様を主に担当
コンテンツ配信、アーカイブなどの案件に従事
Agenda
1.
Amazon CloudFront
CloudFrontによるサイト高速化
CloudFrontによるセキュア配信
まとめ
2.
3.
4.
Amazon
CloudFront
Contents Delivery Network
• 世界中にあるエッジのキャパシティを活用して高速かつ効
率的にコンテンツを配信可能なサービス
– ユーザからのアクセスを最も近いエッジサーバに誘導
することで
ユーザへの配信を高速化
– エッジサーバでは、コンテンツのキャッシングを行い、
オリジンサーバに負荷をかけずエッジから直接配信
Contents Delivery Network
オリジンAmazon
CloudFront
レスポンス向上
負荷軽減
リクエスト 配信 リクエスト キャッシュから配信 キャッシュ コンテンツ取得CDNサービス
クライアント オリジンサーバ 台数の削減 ユーザ体験の 向上Contents Delivery Network
• 最適なエッジへの誘導
Amazon CloudFront
クライアント Internet 位置情報DB ①ドメイン名問い合わせCloudFront DNS
Edge Location
②IPアドレス問い合わせ (xxx.cloudfront.net) ③最適なEdgeアドレス応答 ④最適なEdgeへアクセス ⑤キャッシュがなければ オリジンから取得 DNSリゾル バ オリジン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, SwedenWarsaw, Poland
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)
South America
Sao Paulo, Brazil Rio de Janeiro, Brazil
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 2014年07月時点52
Edge Locations
CloudFrontによる
サイト高速化
Webアクセスの高速化
クライアント215 request
DNS Lookup TCP Connection Send Receiveindex.jsp
style.css
hoge.js
itme1.png
item2.png
HTTPリクエストにおける
80:20の法則
20
8
0
Webアクセスの高速化
DNS Lookup TCP Connection Send Receive クライアント クライアントCloudFront
物理的な NWスピード 通信の最適化 レスポンス キャパシティ オリジン オリジンIX ISP ISP ISP
CDN Edge Locationの活用
クライアント DCAWS
region
AWS edge AWS edge IX/Teir1• 物理的なネットワークスピード(距離)
キャッシュ オリジンCDN Edge Locationの活用
クライアント DC AW S edg eVS
Edge Capacity
• レスポンスキャパシティ
サーバキャパシティ
ネットワークキャパシティ
オリジンCDN Edge Locationの活用
クライアント分散型
CDN
集中型
CDN
IX ISP ISP ISP ISP クライアント Edge Edge Edge Edgeクライアントに
近いエッジ
キャッシュヒット
率が高い
VS
ISP IX AWS edgeキャッシュ共有
ISP ISP ISP AWS edgeCDN Edge Locationの活用
CloudFrontのEdgeに
可能な限りキャッシュ
させることが重要
CDN Edge Locationの活用
• 可能な限りキャッシュからコンテンツを配信
静的コンテンツ
動的コンテンツ
HTTPリクエストにおける80:20の法則
キャッシュの活用
• 画像ファイル
• 動画ファイル
• CSS
• Java Script
• 静的HTML
キャッシュTTLも可能な限り長く
クライアント側にもキャッシュさせる
• 静的コンテンツ
は全てキャッシュさせることで
CDNの効果を最大化
動的コンテンツ
動的コンテンツ(ページ共通)
動的コンテンツ(パーソナライズ)
動的コンテンツ
キャッシュの活用
• 動的コンテンツ(ページ共通)
リクエストに応じて動的にページ生成は行われる
が、生成されるページ自体は一定期間共通
/item/ContentsDetail?item_id=012345 (商品詳細)
/api/ListCategory?category=cloud (カテゴリ一覧)
/api/ListContents?top=10 (人気商品一覧)
例えば
Query Stringsを活用している
キャッシュの活用
• 動的コンテンツ(ページ共通)
HTTPヘッダー判定によるページ切り替え
例えば
キャッシュの活用
動的コンテンツ
でも
一定期間ページ更新が不必要なものは
積極的にキャッシュ
日単位
時間単位
分単位
秒単位
キャッシュの活用
• 短期間でのキャッシュの更新
クライアント CDN Edge オリジン Last-Modified /ETagヘッダー キャッシュ(短期) キャッシュ(期間切れ) If-Modified-Since 更新なし 304 (Not Modified) キャッシュの再利用 更新あり 最適化された通信キャッシュヒット率の向上
• ヒット率向上のための要素
– キャッシュ時間
– URLの共通化
– Etag / Last-Modifiedヘッダーの活用
– (オプション)Query Stringsパラメータ値の固定化
– (オプション)転送対象Header値の固定化
CloudFrontは完全一致でキャッシュを共有
キャッシュヒット状況の確認
> 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==
• HTTPクライアントでレスポンスヘッダーを確認
> 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
POST/PUT, Header, Cookieの対応
キャッシュできない動的コンテンツ
• POST/PUTリクエストはPROXYとして動作
• OriginへのHeaderやCookie情報の転送
Cloud FrontのEdgeを経由させても
多くの動的ページが扱えるように
その上でEdgeとOrigin間通信の最適化
Keep-Alive Connection
クライアント SYN SYN- ACK ACK オリジン GET /index.jsp SYN- ACK ACK GET /index.jsp SYN USER 1 USER 2• 従来のTCP Connection
Webサーバオリジンへの負荷が増加
30ms
120ms 120ms TCP 3 Way Handshake DNS Lookup TCP Connection Send ReceiveKeep-Alive Connection
CDN Edge クライアント SYN SYN- ACK ACK GET /index.html SYN- ACK ACK GET /index.html SYN USER 1 USER 210ms
120ms 60ms SYN SYN- ACK ACK GET /index.jsp20ms
GET /index.jsp Keep-AliveHTTPS通信の場合
もっと顕著な差が
CloudFrontで
SSL Termination
• CloudFrontによるKeep-Alive Optimization
オリジンTCPスロースタート
クライアント Packet 1 ACK Packet 1 オリジン User TCP Slow Start Packet 2 Packet 3 Packet 3 ACK Packet 4 Packet 5 Packet 6 Packet 7• ネットワークの輻輳を回避
するために少しづつパケッ
トを増やしながら通信する
仕組み
ユーザの新規TCPコネクション毎に発生
DNS Lookup TCP Connection Send ReceiveTCPスロースタート
• CloudFrontによるTCP Slow Start Optimization
USER 1 オリジン TCP Slow Start Packet 1 ACK Packet 1 Packet 2 Packet 3 Packet 3 ACK Packet 4 Packet 5 Packet 6 Packet 7 CDN Edge USER 2 オリジン Packet 1 Packet 2 Packet 3 Packet 4 CDN Edge Packet 4 ACK Packet 5 Packet 6 Packet 7 Packet 8
既存のコネクションを流用するため
スロースタートシーケンスをバイパス
DNS Lookupの高速化
• ホストの名前解決にRoute53を活用
CloudFrontはAlternative Domain Name
Originの名前解決にも
DNS Lookup
TCP Connection
Send Receive
Amazon Route53
• 世界52箇所にDNSサーバを配備
• Anycastを利用してレイテンシー
DNS Lookupの高速化
> Nslookup cdn.awssummit.co.jp Server: 192.168.2.1 Address: 192.168.2.1#53 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 :• CloudFrontのAlternative Domain NameをRoute53を利
用して名前解決する際は、レコードセットのTypeを
CNAMEではなくAレコードのAliasを利用
することで
クエリ回数の削減が可能
> nslookup cdn.awssummit.co.jp Server: 192.168.2.1 Address: 192.168.2.1#53 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 :