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 full-size 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 full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size 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 full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size 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 full-size 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 full-size 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 full-size slide

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

    View full-size slide

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

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

    View full-size slide

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

    View full-size 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 full-size 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 full-size slide

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

    View full-size slide

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

    View full-size slide