Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

CDN in Moneyforward

CDN in Moneyforward

CDN strategy required for FinTech service

Avatar for suzuki_yosuke

suzuki_yosuke

July 24, 2018
Tweet

More Decks by suzuki_yosuke

Other Decks in Technology

Transcript

  1. Introduction 2 Yosuke Suzuki  Money Forward Financial,Inc. • Career ◩

    2005~2008 Fujitsu FIP, Inc. ◩ 2008~2014 Simplex Technology, Inc. ◩ 2015~2016 American Family Life Assurance Company of  Columbus( Aflac ) ◩ 2017.01~2018.05 Money Forward, Inc. ◩ 2018.06~ Money Forward Financial, Inc • SNS ◩ @syou1024(twitter) © Money Forward,Inc.
  2. Mission/Vision/Value 個人のお金の悩みや䞍安の解消、事業者の経営改善に貢献し、 日本でNo1の「お金のプラットフォヌム」になるこずを目指しおいたす。 Mission お金を前ぞ。人生をもっず前ぞ。 「お金」は、人生においおツヌルでしかありたせん。しかし「お金」ずは、自身ず家族の身を守るため、たた倢を実珟するために必芁䞍可欠な存圚でもありた す。 私たちは「お金ず前向きに向き合い、可胜性を広げるこずができる」サヌビスを提䟛するこずにより、ナヌザヌの人生を飛躍的に豊かにするこずで、より良い 瀟䌚創りに貢献しおいきたす。 Vision

    すべおの人の、「お金のプラットフォヌム」になる。 オヌプンか぀公正な「お金のプラットフォヌム」を構築するこず、本質的なサヌビスを提䟛するこずにより、個人や法人すべおの人のお金の課題を解決した す。 Value User Focus 私たちは、いかなる制玄があったずしおも、垞にナヌ ザヌを芋぀め続け、本質的な課題を理解し、ナヌザヌ の想像を超えた゜リュヌションを提䟛したす。 Technology Driven 私たちは、テクノロゞヌこそが䞖界を倧きく倉えるこず ができるず信じおいたす。テクノロゞヌを远求し、それ をサヌビスずしお瀟䌚ぞ提䟛しおいくこずで、むノベヌ ションを起こし続けたす。 Fairness 私たちは、ナヌザヌ、瀟員、株䞻、瀟䌚などのすべお のステヌクホルダヌに察しおフェアであるこず、オヌプ ンであるこずを誓いたす。 4
  3. 話すこず、持ち垰っお頂きたいこず © Money Forward,Inc. 6 話すこず • マネヌフォワヌドのサヌビスにおけるCDN芁件 • なぜfastlyなのか

    • コンフィグレヌション具䜓䟋 • コンフィグのデプロむメントの自動化事䟋 • 今埌、fastlyを䜿っおやりたいこず • fastlyで䞍足する事 持ち垰っお頂きたいこず • CDNを安党に導入/運甚するための考慮点 • fastly導入する堎合のデプロむメント自動化の考慮点
  4. AI(人工知胜で 仕蚳ルヌルを孊習 3,600以䞊の口座から 取匕デヌタを自動取埗 囜内No.1 の察応数 取匕明现の自動取埗 人工知胜で孊習 マルチデバむス 様々なデバむス䞊で

    利甚可胜 ※ ※圓瀟調べ (2016幎12月末日点) MFクラりド䌚蚈の特城 わずらわしい䌚蚈䜜業を自動化し、生産性を倧幅に䞊げる
  5. サヌビスの特性 15 • PFMサヌビスで、650䞇ナヌザ、数千䞇リク゚スト/日。 • 殆どのペヌゞはナヌザ毎のペヌゞ。 • 扱っおいる情報はセンシティブ。 • ナヌザにセキュリティの䞍安を抱かせるだけでもNG。

    ◩ CDNにありがちな障害「他人のキャッシュ芋える」なんお起 こしたら䌚瀟存続の危機。絶察避ける。 ぀たり、 CDNに向いおいない(ず䞀般に思われる) サヌビス矀。
  6. コンフィグレヌションが超柔軟 19 • fastlyのバック゚ンドはvarnish。 • VCL(varnish configuration Langege)で柔軟に定矩可胜。 • キャッシュの条件を柔軟に定矩できる。

    • 以䞋をOR条件、AND条件で組み合わせお、キャッシュ察象を 制限。 ◩ URLのドメむン名が条件に圓おはたるか ◩ URLのパスが条件に圓おはたるか ◩ URLの拡匵子が条件に圓おはたるか ◩ リタヌンコヌドが条件に圓おはたるか ◩ ヘッダヌ情報が条件に圓おはたるか • 意図しないキャッシュを無くし、事故を避ける。 • 条件が厳しいこずで、安心しおアプリ開発できる。
  7. キャッシュの削陀/コンフィグ䌝搬が超高速 20 • 誀ったキャッシュが出来おしたった堎合に、玠早く削陀できる、 玠早く蚭定を倉曎できるこずが倧切 • 䞀般にCDNのキャッシュ削陀、コンフィグ䌝搬は時間がかか る。 ◩ 裏には䞖界各囜の゚ッゞサヌバがある。

    • fastlyはキャッシュ削陀、コンフィグ䌝搬が圧倒的に速い。 キャッシュ削陀 コンフィグ䌝搬 fastly 郚分パヌゞなら150ミリ秒 (党キャッシュパヌゞでも 10秒皋床。䞀工倫する ず、党キャッシュパヌゞも 150ミリ秒) 数秒〜十数秒 他瀟事䟋 A瀟①90%に察しお5秒で、党䜓には1分 A瀟②今幎5月から5秒になった。 (どちらも郚分パヌゞ。これでも盞圓早くなった 十数分かかる。
  8. APIで操䜜可胜 21 • APIファヌストの開発なので、党おの倉曎がAPIで可胜。 • ぀たり、先に䞊げた䜜業を自動化できる。 • Chatbotを䜿っお、Slackからキャッシュ削陀なんおこずも実装 可胜 ◩

    気軜過ぎるのも怖くお、マネフォではそこたでやっおいたせん。 • ただ、Jenkinsのゞョブを実行したら、キャッシュ削陀、コンフィ グ倉曎&ロヌルバック、メンテナンスペヌゞぞ切り替えずかでき る。
  9. キャッシュ制埡 © Money Forward,Inc. 28 • /assets/から始たるリク゚スト以 倖は403で返す。 • 拡匵子jpg,png、か぀、バック゚

    ンドのリタヌンコヌドが200の堎 合、TTL3時間でキャッシュセッ ト。 • それ以倖のリク゚ストはキャッ シュしない。 sub vcl_recv{ if (req.url !~ "^/assets/”) { error 403 "Forbidden"; } } sub vcl_fetch { if((req.url.ext ~ "(?i)^(jpg|png)$"\ && beresp.status == 200)) { set beresp.ttl = 10800s; set beresp.grace = 10800s; return(deliver); # Cache Setting } return(pass); # Not Cache Setting }
  10. キャッシュ有効無効切り替え © Money Forward,Inc. 29 • chache_modeテヌブルの「status」 がoffの時はキャッシュしない • chache_modeのvalueは、REST

    APIを䜿っお簡単に倉曎可胜で、簡単 にON/OFFを切り替えられる。 table cache_mode { "status": "off" } vcl_fetch { # Cache Switch if ( table.lookup(cache_mode, "status") == "off" ) { return(pass); } return(deliver); }
  11. ヘッダヌコントロヌル(ResponsHeader) © Money Forward,Inc. 30 table domane_list { "sample1.example.com": "true",

    "sample2.example.com": "false" } sub vcl_deliver { if ( table.lookup(domane, req.http.host) == "true" ) { set resp.http.X-Robots-Tag = "noindex"; } return(deliver); } • リク゚ストドメむンがdomain_list テヌブルのvalueでtrueだった ら、レスポンスヘッダヌにnoindx ヘッダヌを蚭定する。 • これで特定のドメむンを怜玢され ないように出来る。
  12. ヘッダヌコントロヌル(RequestHeader) © Money Forward,Inc. 31 table app_code_map { "sample1.example.com": "AP001",

    "sample2.example.com": "AP002" } sub vcl_recv { set req.http.X-App-Type =\ table.lookup(app_code_map, req.http.host); return(lookup) } • バック゚ンドぞのリク゚ストヘッ ダヌに特定のヘッダヌをもたせ お䞊げるこずが出来る。 • ドメむン名によっお付䞎するヘッ ダヌを倉曎しお、バック゚ンドの アプリの挙動を倉えおる。
  13. メンテナンスペヌゞ切り替え © Money Forward,Inc. 32 • 「sample1.example.com」はtrueな ので、Sorry甚のバック゚ンドに振り分 け、Sorryペヌゞが芋える。 •

    「sample2.example.com」はfalseな ので、バック゚ンドそのたたで、通垞 のペヌゞが芋える。 • mainte_flagのvalueは、REST API を䜿っお簡単に倉曎可胜で、簡単に Sorryペヌゞに切り替えられる。 • 条件にClientIPを指定しお䞊げお、特 定のIP以倖からはSorryずいうこずも 可胜。開発䞭のサむトの通信制埡な どにも䟿利。 # Sorry Page Setting table mainte_flag { "sample1.example.com": "true", "sample2.example.com": "false", } vcl_recv { if ( table.lookup(mainte_flag, req.http.host)\ == "true" ) { set req.http.host = "sorry.example.com"; set req.backend = F_sorry_host; } return(pass); }
  14. プロビゞョニングツヌルの遞択肢 © Money Forward,Inc. 35 • ansible ◩ ありたす。 ◩

    https://github.com/Jimdo/ansible-fastly • terrafform ◩ ありたす。 ◩ https://www.terraform.io/docs/providers/fastly/index.html • 他には ◩ Cookpadの@sora_hさんが開発したcodilyずいうツヌルもある。 ◩ https://github.com/sorah/codily ◩ rubyのDSLが䜿える。
  15. fastly のConfigurationは3分類ある。(僕の勝手な分類。 © Money Forward,Inc. 38 • 環境蚭定 • むベント蚭定

    • 状態蚭定 これらをどう䜿いたいかで、プロビゞョニングツヌルが決たりたす。
  16. 環境蚭定 © Money Forward,Inc. 39 システム構成に察する蚭定 • ドメむン名 • バック゚ンドのアドレス

    • ヘルスチェック • ロヌドバランシング蚭定 など # origine and helth check backend server1 {  .connect_timeout = 3s  .port = "1443"; .host = "server1.example.com"; .ssl = true; .ssl_cert_hostname = "server1.example.com"; .ssl_check_cert = always; (略) .probe = { .request = "GET /health_check.html" .timeout = 3s; .expected_response = 200; .interval = 15s; (略) } }
  17. むベント蚭定 © Money Forward,Inc. 40 むベント発生時のアクションを定矩する。 むベント䟋 • バック゚ンドからデヌタ取っおくる 際、拡匵子.jpg、.pngはキャッシュ

    3h • リク゚スト受け付けたら、特定のIP からリク゚ストブロック # jpg & png CacheSetting sub vcl_fetch { if((req.url.ext ~ "(?i)^(jpg|png)$")) { set beresp.ttl = 10800s; set beresp.grace = 10800s; return(deliver); # Cache Setting } return(pass); # Not Cache Setting } # Blacklist acl black_list { “10.192.80.20”/32; # tekitou ip#1 } sub vcl_recv { if( client_ip ~ black_list ){ error 403 "Forbidden"; } }
  18. 状態蚭定 © Money Forward,Inc. 41 • フラグ等の䞀時的な蚭定 ◩ メンテナンスフラグ ◩

    キャッシュON/OFFフラグ • API䞀぀で簡単にKey,Valueを远加、 削陀、倉曎可 • fastly甚語でdictionay 䟋 • mainte_flagテヌブルに察し ドメむン名をKeyにValueを取埗しtrueな らバック゚ンドをSorry甚の ホストに倉える # Sorry Page Setting table mainte_flag { "sample1.example.com": "true", "sample2.example.com": "false", } vcl_recv { if ( table.lookup(mainte_flag, req.http.host)\ == "true" ) { set req.http.host = "sorry.example.com"; set req.backend = F_sorry_host; } return(pass); }
  19. むベント蚭定の蚭定方法は぀に分かれる。 © Money Forward,Inc. 42 • Snippet蚭定は簡単。耇雑なこず出来ない。 ◩ 蚭定補助により、簡易に蚭定 ◩

    蚘茉方法に制限はある ◩ アクションを䞀぀䞀぀定矩する必芁がある ▪ あるヘッダヌが付いおたら、キャッシュ1時間保持 ▪ IPがブラックリストにあったらブロック ◩ gitリポゞトリで管理するず、䟝存関係が分かりづらい • Custome VCL (オススメ)耇雑なこずやりたければコチラ ◩ コンフィグを自由に蚘茉出来、耇雑な蚭定が可胜 ◩ アクションを耇数たずめお定矩出来る ◩ gitリポゞトリ䞊でコンフィグで党䜓の定矩が把握しやすい
  20. プロビゞョニングツヌルで出来るこず © Money Forward,Inc. 43 ツヌル名 環境蚭定 むベント蚭定 状態蚭定 ※

    Snippet Custom VCL ansible ◩ ◩ × × terrafform ◩ × ◩ × codily ◩ × ◩ ◩ ※ key,valueの倀を入れるのは、どれも無理。   codilyもテヌブルの定矩たで。   しかし、マネフォのナヌスケヌスでは、その方が嬉しい。   (状態を倉曎するのに、プロビゞョニングなんおしたくない)
  21. Codilyを䜿ったプロビゞョニング in マネフォ (倚分、時間切れで飛ばすので、ご参考に①) © Money Forward,Inc. 45 service "eample"

    do domain "sample1.example.com" domain "sample2.example.com" backend "my backend" do address "server.example.com" end vcl "Main" do content file: "./vcl//main.vcl" main true end dictionary "mainte_flag" end 環境蚭定はcodlyのDSLに定矩 むベント蚭定はカスタム VCLベタ曞き。 codilyから呌び出すのみ 状態蚭定は、箱だけ䜜成 $ codily --apply -f recipe.rb recipe.rb
  22. CodilyのRecipe ベストプラクティス (倚分、時間切れで飛ばすので、ご参考に②) © Money Forward,Inc. 46 recipe | ---

    recipe.rb  codilyで指定するDSLファむル | --- variables  レシピで利甚する倉数を蚭定 | `--- service_1.rb  サヌビス1の倉数定矩ファむル | `--- service_2.rb  サヌビス2の倉数定矩ファむル ` --- vcl  レシピから呌び出すVCL | --- common  共通利甚するVCLを保存 | --- service_1   サヌビス1のVCLを保存 | | --- main.vcl  メむンVCL | ` --- include.vcl  メむンVCLから呌び出されるVCL ` --- service_2  サヌビス1のVCLを保存 ※サヌビスずは、Fastlyの定矩の単䜍です。サヌビス毎に蚭定できる
  23. 新しい仮想通貚取匕所のサヌビスでも䜿う぀もり © Money Forward,Inc. 49 • もちろん、今たで以䞊の慎重さが倧前提。 • fastlyのWAF機胜入れたい ◩

    取匕所のシステムはGCP䜿う。GCPずfastlyの盞性は抜 矀。(フロントの倧量のログを捌くにはBigQueryは最高で す) ◩ fastlyずGCP間は閉域網でInternetを介さない。 • Push通信をfastly経由にしたい ◩ 仮想通貚の板情報は、かなりの負荷が芋蟌たれる。 ◩ 同じ情報を皆んなにリアルタむム配信。 ◩ SSEを䜿っお、fastly経由で配信したい。
  24. たずめ(持ち垰っお欲しいこず) © Money Forward,Inc. 52 • CDNを安党に導入/運甚するための考慮点 ◩ 適切に制限を掛けられるこずは倧事。 ◩

    もしもの時のリカバリ速床も倧事。 ▪ 䞊぀を考えるずfastlyはオススメ。 ◩ サヌビス特性を芋極めおキャッシングする。(キャッシュヒッ ト率䜎くしおも十分効果ある堎合もある) • fastly導入する堎合のデプロむメント自動化の考慮点 ◩ 各ツヌルで出来るこず、出来ないこずがあるので、合っおる ものを遞定したしょう。 ◩ コンフィグの区分を意識するず、ツヌル遞定、コヌディング がしやすい。