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
MoneyForward,Inc.2018/3/23 Manabiya.techCoding CDN in MoneyForward.Yosuke Suzuki
View Slide
Introduction2Yosuke 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
Mission/Vision/Value個人のお金の悩みや不安の解消、事業者の経営改善に貢献し、日本でNo1の「お金のプラットフォーム」になることを目指しています。Missionお金を前へ。人生をもっと前へ。「お金」は、人生においてツールでしかありません。しかし「お金」とは、自身と家族の身を守るため、また夢を実現するために必要不可欠な存在でもあります。私たちは「お金と前向きに向き合い、可能性を広げることができる」サービスを提供することにより、ユーザーの人生を飛躍的に豊かにすることで、より良い社会創りに貢献していきます。Visionすべての人の、「お金のプラットフォーム」になる。オープンかつ公正な「お金のプラットフォーム」を構築すること、本質的なサービスを提供することにより、個人や法人すべての人のお金の課題を解決します。ValueUser Focus私たちは、いかなる制約があったとしても、常にユーザーを見つめ続け、本質的な課題を理解し、ユーザーの想像を超えたソリューションを提供します。Technology Driven私たちは、テクノロジーこそが世界を大きく変えることができると信じています。テクノロジーを追求し、それをサービスとして社会へ提供していくことで、イノベーションを起こし続けます。Fairness私たちは、ユーザー、社員、株主、社会などのすべてのステークホルダーに対してフェアであること、オープンであることを誓います。4
主要サービスBtoC(個人向け)・BtoB(法人向け)の両領域でサービスラインナップを拡充。※PFM:Personal Financial Managementの略称(以下同)
話したいこと© Money Forward,Inc.6● CDN、LB、リバプロ等、フロント周りの悩みをfastly(CDN)を入れて解決した話し● fastlyのデプロイをコード化、自動化した話し
こんな苦労していませんか?7
散らかり倒したリバースプロキシー(Nginx)のコンフィグ。変更作業、疲弊してます。8
急激なロードバランサーの負荷増加、ウォームアップ申請してないよ。。 orz9
年に1回のサーバ証明書の更新、発注手続きに、更新作業。単純作業、ホント面倒。。。10
Cloudfront。シンプルに使えるけど。複雑な処理はNginxでやらなくちゃ。。11
「他人のキャッシュが見えてしまう」そんな心配でCDN使えない。。12
思い当たることありますよね?fastlyなら解決するかも!?(マネフォではしたよ)13
fastlyとはめっちゃイケてるCDNサービスです。● コンフィギュレーションが超柔軟○ VCL(Varnish Configuration Language)で定義します。● 全てAPIで操作できる(API First)● コンフィグ伝搬、キャッシュ削除が超高速(数〜十数秒程度)● CDNに留まらずLB、WAF、イメージオプティマイザとリッチな機能が付随● エンジニアのサポートが手厚い● しかもお安い14
散らかり倒したリバースプロキシのコンフィグ© Money Forward,Inc.15● マネフォでは、fastlyで全て代替できた。● 設定変更は、APIを使ってコード化&自動化を実現。● サービスだからサーバの台数関係なし。ELBとrevprxをfastlyで置き換えました。
急激なロードバランサーの負荷増加© Money Forward,Inc.16● 数十台のエッジサーバがロードバランサーです。● 意識せずとも、ロードバランサー自体が負荷分散されてます。
年に1回のサーバ証明書の更新© Money Forward,Inc.17● fastlyが全部やってくれる。● もうサーバ証明書の期限、気にしない。
Cloudfrontだけじゃ(ry© Money Forward,Inc.18● マネフォのリバプロ(Nginx)でやってたことは、fastlyで全て出来た。● やりたいけどやれなかったは一個だけ。○ シャドウプロキシ。Nginxが昨年リリースした機能。
他人のキャッシュが見えてしまう© Money Forward,Inc.19● fastlyなら、二重三重に回避する設定にできる。● ちゃんと制限かけれるから、逆に安心してキャッシュに載せられる。
そんなイケてるCDN、fastlyをコード化して簡単にデプロイ出来るようにしたお話しです。(本題)20
こんなシステム構成© Money Forward,Inc.21
プロビジョニングツールの選択肢© 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が使える。
Question:どれ使ったらいいのか?23
Answer:fastlyでやりたいこと次第。fastlyのコンフィグレーションと共に、それぞれの特徴を説明します。24
fastly のConfigurationは3分類ある。(僕の勝手な分類。© Money Forward,Inc.25● 環境設定● イベント設定● 状態設定これらをどう使いたいかで、プロビジョニングツールが決まります。
環境設定© Money Forward,Inc.26システム構成に対する設定● ドメイン名● バックエンドのアドレス● ヘルスチェック● ロードバランシング設定など# origine and helth checkbackend 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;(略)}}
イベント設定© Money Forward,Inc.27イベント発生時のアクションを定義する。イベント例● バックエンドからデータ取ってくる際、拡張子.jpg、.pngはキャッシュ3h● リクエスト受け付けたら、特定のIPからリクエストブロック# jpg & png CacheSettingsub 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}# Blacklistacl black_list {“10.192.80.20”/32; # tekitou ip#1}sub vcl_recv {if( client_ip ~ black_list ){error 403 "Forbidden";}}
状態設定© Money Forward,Inc.28● フラグ等の一時的な設定○ メンテナンスフラグ○ キャッシュON/OFFフラグ● API一つで簡単にKey,Valueを追加、削除、変更可● fastly用語でdictionay例● mainte_flagテーブルに対しドメイン名をKeyにValueを取得しtrueならバックエンドをSorry用のホストに変える# Sorry Page Settingtable 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);}
イベント設定の設定方法は2つに分かれる。© Money Forward,Inc.29● Snippet:設定は簡単。複雑なこと出来ない。○ 設定補助により、簡易に設定○ 記載方法に制限はある○ アクションを一つ一つ定義する必要がある■ あるヘッダーが付いてたら、キャッシュ1時間保持■ IPがブラックリストにあったらブロック○ gitリポジトリで管理すると、依存関係が分かりづらい● Custome VCL (オススメ):複雑なことやりたければコチラ○ コンフィグを自由に記載出来、複雑な設定が可能○ アクションを複数まとめて定義出来る○ gitリポジトリ上でコンフィグで全体の定義が把握しやすい
プロビジョニングツールで出来ること© Money Forward,Inc.30ツール名 環境設定イベント設定状態設定※SnippetCustomVCLansible○ ○ × ×terrafform○ × ○ ×codily○ × ○ ○※ key,valueの値を入れるのは、どれも無理。 codilyもテーブルの定義まで。 しかし、マネフォのユースケースでは、その方が嬉しい。 (状態を変更するのに、プロビジョニングなんてしたくない)
fastlyを使い倒すならCodilyがオススメ(一部設定を不要と割り切れれば、お好きなものをどうぞ)© Money Forward,Inc.31
Codilyを使ったプロビジョニング in マネフォ(多分、時間切れで飛ばすので、ご参考に①)© Money Forward,Inc.32service "eample" dodomain "sample1.example.com"domain "sample2.example.com"backend "my backend" doaddress "server.example.com"endvcl "Main" docontent file: "./vcl//main.vcl"main trueenddictionary "mainte_flag"end環境設定はcodlyのDSLに定義イベント設定はカスタムVCLベタ書き。codilyから呼び出すのみ状態設定は、箱だけ作成$ codily --apply -f recipe.rbrecipe.rb
CodilyのRecipe (俺的)ベストプラクティス(多分、時間切れで飛ばすので、ご参考に②)© Money Forward,Inc.33recipe| --- 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の定義の単位です。サービス毎に設定できる
まとめ(持ち帰って欲しいこと)© Money Forward,Inc.34● fastlyの特徴○ APIファーストのコーディングできるCDN○ 超高速のキャッシュ&コンフィグ伝搬○ LB,WAF,ImageOptimizer等の付随機能● fastlyをコーディングする際は、プロビジョニングツールの選定に注意○ 各ツールで出来ること、出来ないことがあるので、合ってるものを選定しましょう。○ コンフィグの区分を意識するとコーディングしやすい。
クラウド大好き!全てのインフラをコード化してやる!そんな仲間を募集しています。インフラ https://www.wantedly.com/projects/7727ご静聴ありがとうございました!35