Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

suzuki_yosuke

March 23, 2018
Tweet

More Decks by suzuki_yosuke

Other Decks in Technology

Transcript

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

    View Slide

  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.

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    ● エンジニアのサポートが手厚い
    ● しかもお安い
    14

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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が使える。

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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;
    (略)
    }
    }

    View Slide

  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";
    }
    }

    View Slide

  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);
    }

    View Slide

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

    View Slide

  30. プロビジョニングツールで出来ること
    © Money Forward,Inc.
    30
    ツール名 環境設定
    イベント設定
    状態設定

    Snippet
    Custom
    VCL
    ansible
    ○ ○ × ×
    terrafform
    ○ × ○ ×
    codily
    ○ × ○ ○
    ※ key,valueの値を入れるのは、どれも無理。
      codilyもテーブルの定義まで。
      しかし、マネフォのユースケースでは、その方が嬉しい。
      (状態を変更するのに、プロビジョニングなんてしたくない)

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide