Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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.

Slide 3

Slide 3 text

マネーフォワードのご紹介 (ほんの少し時間下さい) 3

Slide 4

Slide 4 text

Mission/Vision/Value 個人のお金の悩みや不安の解消、事業者の経営改善に貢献し、 日本でNo1の「お金のプラットフォーム」になることを目指しています。 Mission お金を前へ。人生をもっと前へ。 「お金」は、人生においてツールでしかありません。しかし「お金」とは、自身と家族の身を守るため、また夢を実現するために必要不可欠な存在でもありま す。 私たちは「お金と前向きに向き合い、可能性を広げることができる」サービスを提供することにより、ユーザーの人生を飛躍的に豊かにすることで、より良い 社会創りに貢献していきます。 Vision すべての人の、「お金のプラットフォーム」になる。 オープンかつ公正な「お金のプラットフォーム」を構築すること、本質的なサービスを提供することにより、個人や法人すべての人のお金の課題を解決しま す。 Value User Focus 私たちは、いかなる制約があったとしても、常にユー ザーを見つめ続け、本質的な課題を理解し、ユーザー の想像を超えたソリューションを提供します。 Technology Driven 私たちは、テクノロジーこそが世界を大きく変えること ができると信じています。テクノロジーを追求し、それ をサービスとして社会へ提供していくことで、イノベー ションを起こし続けます。 Fairness 私たちは、ユーザー、社員、株主、社会などのすべて のステークホルダーに対してフェアであること、オープ ンであることを誓います。 4

Slide 5

Slide 5 text

主要サービス BtoC(個人向け)・BtoB(法人向け)の両領域でサービスラインナップを拡充。 ※PFM:Personal Financial Managementの略称(以下同)

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

fastlyとは めっちゃイケてるCDNサービスです。 ● コンフィギュレーションが超柔軟 ○ VCL(Varnish Configuration Language)で定義します。 ● 全てAPIで操作できる(API First) ● コンフィグ伝搬、キャッシュ削除が超高速(数〜十数秒程度) ● CDNに留まらずLB、WAF、イメージオプティマイザとリッチな機能が付 随 ● エンジニアのサポートが手厚い ● しかもお安い 14

Slide 15

Slide 15 text

散らかり倒したリバースプロキシのコンフィグ © Money Forward,Inc. 15 ● マネフォでは、fastlyで全て代替できた。 ● 設定変更は、APIを使ってコード化&自動化を実現。 ● サービスだからサーバの台数関係なし。 ELBとrevprxをfastlyで置 き換えました。

Slide 16

Slide 16 text

急激なロードバランサーの負荷増加 © Money Forward,Inc. 16 ● 数十台のエッジサーバがロードバランサーです。 ● 意識せずとも、ロードバランサー自体が負荷分散されてます。

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

Cloudfrontだけじゃ(ry © Money Forward,Inc. 18 ● マネフォのリバプロ(Nginx)でやってたことは、fastlyで全て出 来た。 ● やりたいけどやれなかったは一個だけ。 ○ シャドウプロキシ。Nginxが昨年リリースした機能。

Slide 19

Slide 19 text

他人のキャッシュが見えてしまう © Money Forward,Inc. 19 ● fastlyなら、二重三重に回避する設定にできる。 ● ちゃんと制限かけれるから、逆に安心してキャッシュに載せら れる。

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

プロビジョニングツールの選択肢 © 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が使える。

Slide 23

Slide 23 text

Question: どれ使ったらいいのか? 23

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

fastly のConfigurationは3分類ある。(僕の勝手な分類。 © Money Forward,Inc. 25 ● 環境設定 ● イベント設定 ● 状態設定 これらをどう使いたいかで、プロビジョニングツールが決まります。

Slide 26

Slide 26 text

環境設定 © 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; (略) } }

Slide 27

Slide 27 text

イベント設定 © 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"; } }

Slide 28

Slide 28 text

状態設定 © 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); }

Slide 29

Slide 29 text

イベント設定の設定方法は2つに分かれる。 © Money Forward,Inc. 29 ● Snippet:設定は簡単。複雑なこと出来ない。 ○ 設定補助により、簡易に設定 ○ 記載方法に制限はある ○ アクションを一つ一つ定義する必要がある ■ あるヘッダーが付いてたら、キャッシュ1時間保持 ■ IPがブラックリストにあったらブロック ○ gitリポジトリで管理すると、依存関係が分かりづらい ● Custome VCL (オススメ):複雑なことやりたければコチラ ○ コンフィグを自由に記載出来、複雑な設定が可能 ○ アクションを複数まとめて定義出来る ○ gitリポジトリ上でコンフィグで全体の定義が把握しやすい

Slide 30

Slide 30 text

プロビジョニングツールで出来ること © Money Forward,Inc. 30 ツール名 環境設定 イベント設定 状態設定 ※ Snippet Custom VCL ansible ○ ○ × × terrafform ○ × ○ × codily ○ × ○ ○ ※ key,valueの値を入れるのは、どれも無理。   codilyもテーブルの定義まで。   しかし、マネフォのユースケースでは、その方が嬉しい。   (状態を変更するのに、プロビジョニングなんてしたくない)

Slide 31

Slide 31 text

fastlyを使い倒すならCodilyがオススメ (一部設定を不要と割り切れれば、お好きなものをどうぞ) © Money Forward,Inc. 31

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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の定義の単位です。サービス毎に設定できる

Slide 34

Slide 34 text

まとめ(持ち帰って欲しいこと) © Money Forward,Inc. 34 ● fastlyの特徴 ○ APIファーストのコーディングできるCDN ○ 超高速のキャッシュ&コンフィグ伝搬 ○ LB,WAF,ImageOptimizer等の付随機能 ● fastlyをコーディングする際は、プロビジョニングツールの選定 に注意 ○ 各ツールで出来ること、出来ないことがあるので、合ってる ものを選定しましょう。 ○ コンフィグの区分を意識するとコーディングしやすい。

Slide 35

Slide 35 text

クラウド大好き!全てのインフラをコード化してやる! そんな仲間を募集しています。 インフラ https://www.wantedly.com/projects/7727 ご静聴ありがとうございました! 35