Coding CDN in Moneyforward

Coding CDN in Moneyforward

fastlyを使って、CDNをコーディングした事例
MANABIYA LT大会(3/23-24)
https://teratail.connpass.com/event/77317/?utm_campaign=event_participate_to_follower&utm_medium=facebook&utm_source=notifications

5c4aa56e9054db3fbbf0fd18cbc841d1?s=128

suzuki_yosuke

March 23, 2018
Tweet

Transcript

  1. MoneyForward,Inc. 2018/3/23 Manabiya.tech Coding CDN in MoneyForward. Yosuke Suzuki

  2. Introduction 2 Yosuke Suzuki  Money Forward,Inc. (CISO室 サービスインフラグループ) • Career(ほぼずっと金融のインフラエンジニア)

    ◦ 2005~2008 Fujitsu FIP, Inc. ◦ 2008~2014 Simplex Technology, Inc. ◦ 2015~2016 American Family Life Assurance Company of  Columbus( Aflac ) ◦ 2017~ Money Forward, Inc. • SNS ◦ @syou1024(ほぼROM専ですが、連絡先にどうぞ) © Money Forward,Inc.
  3. マネーフォワードのご紹介 (ほんの少し時間下さい) 3

  4. Mission/Vision/Value 個人のお金の悩みや不安の解消、事業者の経営改善に貢献し、 日本でNo1の「お金のプラットフォーム」になることを目指しています。 Mission お金を前へ。人生をもっと前へ。 「お金」は、人生においてツールでしかありません。しかし「お金」とは、自身と家族の身を守るため、また夢を実現するために必要不可欠な存在でもありま す。 私たちは「お金と前向きに向き合い、可能性を広げることができる」サービスを提供することにより、ユーザーの人生を飛躍的に豊かにすることで、より良い 社会創りに貢献していきます。 Vision

    すべての人の、「お金のプラットフォーム」になる。 オープンかつ公正な「お金のプラットフォーム」を構築すること、本質的なサービスを提供することにより、個人や法人すべての人のお金の課題を解決しま す。 Value User Focus 私たちは、いかなる制約があったとしても、常にユー ザーを見つめ続け、本質的な課題を理解し、ユーザー の想像を超えたソリューションを提供します。 Technology Driven 私たちは、テクノロジーこそが世界を大きく変えること ができると信じています。テクノロジーを追求し、それ をサービスとして社会へ提供していくことで、イノベー ションを起こし続けます。 Fairness 私たちは、ユーザー、社員、株主、社会などのすべて のステークホルダーに対してフェアであること、オープ ンであることを誓います。 4
  5. 主要サービス BtoC(個人向け)・BtoB(法人向け)の両領域でサービスラインナップを拡充。 ※PFM:Personal Financial Managementの略称(以下同)

  6. 話したいこと © Money Forward,Inc. 6 • CDN、LB、リバプロ等、フロント周りの悩みをfastly(CDN)を入 れて解決した話し • fastlyのデプロイをコード化、自動化した話し

  7. こんな苦労していませんか? 7

  8. 散らかり倒した リバースプロキシー(Nginx)のコンフィグ。 変更作業、疲弊してます。 8

  9. 急激なロードバランサーの負荷増加、 ウォームアップ申請してないよ。。 orz 9

  10. 年に1回のサーバ証明書の更新、 発注手続きに、更新作業。 単純作業、ホント面倒。。。 10

  11. Cloudfront。シンプルに使えるけど。 複雑な処理はNginxでやらなくちゃ。。 11

  12. 「他人のキャッシュが見えてしまう」 そんな心配でCDN使えない。。 12

  13. 思い当たることありますよね? fastlyなら解決するかも!? (マネフォではしたよ) 13

  14. fastlyとは めっちゃイケてるCDNサービスです。 • コンフィギュレーションが超柔軟 ◦ VCL(Varnish Configuration Language)で定義します。 • 全てAPIで操作できる(API

    First) • コンフィグ伝搬、キャッシュ削除が超高速(数〜十数秒程度) • CDNに留まらずLB、WAF、イメージオプティマイザとリッチな機能が付 随 • エンジニアのサポートが手厚い • しかもお安い 14
  15. 散らかり倒したリバースプロキシのコンフィグ © Money Forward,Inc. 15 • マネフォでは、fastlyで全て代替できた。 • 設定変更は、APIを使ってコード化&自動化を実現。 •

    サービスだからサーバの台数関係なし。 ELBとrevprxをfastlyで置 き換えました。
  16. 急激なロードバランサーの負荷増加 © Money Forward,Inc. 16 • 数十台のエッジサーバがロードバランサーです。 • 意識せずとも、ロードバランサー自体が負荷分散されてます。

  17. 年に1回のサーバ証明書の更新 © Money Forward,Inc. 17 • fastlyが全部やってくれる。 • もうサーバ証明書の期限、気にしない。

  18. Cloudfrontだけじゃ(ry © Money Forward,Inc. 18 • マネフォのリバプロ(Nginx)でやってたことは、fastlyで全て出 来た。 • やりたいけどやれなかったは一個だけ。

    ◦ シャドウプロキシ。Nginxが昨年リリースした機能。
  19. 他人のキャッシュが見えてしまう © Money Forward,Inc. 19 • fastlyなら、二重三重に回避する設定にできる。 • ちゃんと制限かけれるから、逆に安心してキャッシュに載せら れる。

  20. そんなイケてるCDN、 fastlyをコード化して 簡単にデプロイ出来るようにした お話しです。(本題) 20

  21. こんなシステム構成 © Money Forward,Inc. 21

  22. プロビジョニングツールの選択肢 © Money Forward,Inc. 22 • 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が使える。
  23. Question: どれ使ったらいいのか? 23

  24. Answer: fastlyでやりたいこと次第。 fastlyのコンフィグレーションと共に、 それぞれの特徴を説明します。 24

  25. fastly のConfigurationは3分類ある。(僕の勝手な分類。 © Money Forward,Inc. 25 • 環境設定 • イベント設定

    • 状態設定 これらをどう使いたいかで、プロビジョニングツールが決まります。
  26. 環境設定 © Money Forward,Inc. 26 システム構成に対する設定 • ドメイン名 • バックエンドのアドレス

    • ヘルスチェック • ロードバランシング設定 など # 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; (略) } }
  27. イベント設定 © Money Forward,Inc. 27 イベント発生時のアクションを定義する。 イベント例 • バックエンドからデータ取ってくる 際、拡張子.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"; } }
  28. 状態設定 © Money Forward,Inc. 28 • フラグ等の一時的な設定 ◦ メンテナンスフラグ ◦

    キャッシュ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); }
  29. イベント設定の設定方法は2つに分かれる。 © Money Forward,Inc. 29 • Snippet:設定は簡単。複雑なこと出来ない。 ◦ 設定補助により、簡易に設定 ◦

    記載方法に制限はある ◦ アクションを一つ一つ定義する必要がある ▪ あるヘッダーが付いてたら、キャッシュ1時間保持 ▪ IPがブラックリストにあったらブロック ◦ gitリポジトリで管理すると、依存関係が分かりづらい • Custome VCL (オススメ):複雑なことやりたければコチラ ◦ コンフィグを自由に記載出来、複雑な設定が可能 ◦ アクションを複数まとめて定義出来る ◦ gitリポジトリ上でコンフィグで全体の定義が把握しやすい
  30. プロビジョニングツールで出来ること © Money Forward,Inc. 30 ツール名 環境設定 イベント設定 状態設定 ※

    Snippet Custom VCL ansible ◦ ◦ × × terrafform ◦ × ◦ × codily ◦ × ◦ ◦ ※ key,valueの値を入れるのは、どれも無理。   codilyもテーブルの定義まで。   しかし、マネフォのユースケースでは、その方が嬉しい。   (状態を変更するのに、プロビジョニングなんてしたくない)
  31. fastlyを使い倒すならCodilyがオススメ (一部設定を不要と割り切れれば、お好きなものをどうぞ) © Money Forward,Inc. 31

  32. Codilyを使ったプロビジョニング in マネフォ (多分、時間切れで飛ばすので、ご参考に①) © Money Forward,Inc. 32 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
  33. CodilyのRecipe (俺的)ベストプラクティス (多分、時間切れで飛ばすので、ご参考に②) © Money Forward,Inc. 33 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の定義の単位です。サービス毎に設定できる
  34. まとめ(持ち帰って欲しいこと) © Money Forward,Inc. 34 • fastlyの特徴 ◦ APIファーストのコーディングできるCDN ◦

    超高速のキャッシュ&コンフィグ伝搬 ◦ LB,WAF,ImageOptimizer等の付随機能 • fastlyをコーディングする際は、プロビジョニングツールの選定 に注意 ◦ 各ツールで出来ること、出来ないことがあるので、合ってる ものを選定しましょう。 ◦ コンフィグの区分を意識するとコーディングしやすい。
  35. クラウド大好き!全てのインフラをコード化してやる! そんな仲間を募集しています。 インフラ https://www.wantedly.com/projects/7727 ご静聴ありがとうございました! 35