Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
2017/02/20
決済金融から始める
データドリブン
カンパニー
江藤 徳宏
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 2
自己紹介
• 担当サービス
• Yahoo! ウォレット
• 本人確認
• 役割
• 運用エンジニア & 保守開発
• 学生時代の専門
• 数理科学(非線形偏微分方程式)
• 趣味
• ランニング(ラン歴3年、東京マラソン2015完走)
• スマホゲーム(パズドラ、PokemonGO)
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 3
Yahoo! ウォレット
働いているところ
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 4
データドリブン企業
ここ1年で、「ネット企業」から「データドリブン企業」へ!
ほとんどのサービスで、
データを利活用できるようにする
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 5
データドリブンへの路
データ利活用しよう!
そのためのマインドマップを作成しました
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 6
データドリブンへの路
CI/CD
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 7
CI/CD
• テスト (commit build)
• コミットされたソースがテストされる
CI(Continuous Integration)
↑これらを自動的に行う!
• パッケージング (component build)
• レビューが完了したソースはメインブランチにマージ
される
• メインブランチへの変更をテストする
• テスト成功時のみ、パッケージを作成する
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 8
CI/CD
• アセンブリ(assembly build)
• パッケージ群の構成リストを作成する
CD(Continuous Delivery)
↑これらを自動的に行う!
• デプロイ(deploy build)
• アセンブリで作成された構成リストにてサーバへのリリー
スを実施
• まっさらなサーバであれば、サービスが利用できる状態に
持っていく
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 9
CI/CD
• ソフト面(CI)
• テストがない
• テストなど必要ないと思っている
• ハード面(CD)
• 構成管理ができていない
• /etc/hostsは?
• routeは?
• LANGは?
• ディレクトリを手動で作っている
• リリース方法が原始的(手置き)
CI/CD 阻害要因
レガシーシステム
(技術的負債)
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 10
今回のLTの目的
• 既存(古い)システム
• レガシーコードで書かれているものが多い
• テストがないので、改修が困難
• レガシーシステムと戦う方法
• テストのすすめ
• 構成管理のすすめ
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
CI
テストのすすめ
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 12
テストしづらいコード
モック化したい箇所が
ベタ書きだったら・・・
※実際の現場は、
こんなものではない
ですよ。。
この部分だけ
ごまかしたい
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 13
レガシーコードを斬る!
よく使うモッキングフレームワークその1
Phake
https://github.com/mlively/Phake
% cat composer.json
{
"require-dev": {
"phake/phake": "@stable”
}
}
% composer install
★導入方法
特徴
• MockObjectと似ている
• 1メソッドだけモックにすることが可能
• コールバック関数への置換
• 呼び出し検証機能
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 14
レガシーコードを斬る!
ソース
まるごと関数でラップする
protected以上とする
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 15
レガシーコードを斬る!
テスト
テスト対象クラスをpartialMockメソッドでインスタンス化
どの関数がどの引数で呼ばれたときに何がしを返す
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 16
レガシーコードを斬る!
よく使うモッキングフレームワークその2
AspectMock
https://github.com/Codeception/AspectMock
% cat composer.json
{
"require-dev": {
"codeception/aspect-mock": "*"
}
}
% composer install
★導入方法
特徴
• グローバル関数をドラスティックに変更
• コールバック関数への置換
• 呼び出し検証機能
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 17
レガシーコードを斬る!
ソース
名前空間を指定する
この関数だけモック化
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 18
レガシーコードを斬る!
テスト
名前空間、関数名、返却値を指定するだけ。
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 19
テストのまとめ
• コミットされたソースについては、全部グリーンになること
• 何をテストしたいのか、観点を明確にする
• MockObjectでテストできないようなコードは書かない
(できればTDD実践!)
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 20
テストのまとめ
レガシーコードに出会ったら・・・・・・
• 封印する
• フルスクラッチ
• 手を加えるならば必ずテストを書く
• in/outテスト
• 適切なモッキングフレームワークを使う
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
CD
構成管理のすすめ
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 22
CD
構成管理
• システムの構成要素を一元管理する
• ネットワーク設定
• アカウント、sudo権限
• hosts
• syslog
• パッケージ群(独自、rpm) etc…
管理するだけでなく、簡単に適用したい
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 23
Chef
• システムのあるべき姿を「リソース」という単位で管理
Yahoo!ウォレットでは、Chefを導入中
• 「リソース」を束ねて、「レシピ」にまとめる
• 「レシピ」を適用する機能群を「ロール」にまとめる
• デプロイ先のサーバ群を「環境」にまとめ、ロールを紐づける
• デプロイを実行する
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 24
Chef
Web AP DB
ATS
Apache
PHP
Web APL
ATS
Apache
Jetty
Logic APL
MySQL Server
ATS = Apache Traffic Server
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 25
Chef(環境とロール)
web-dev db-dev開発環境
本番環境 web-prod ap-prod db-prod
web-role ap-role db-role
ap-dev
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 26
Chef(レシピ)
web-recipe ap-recipe db-recipe
ATS install
Apache install
PHP install Jetty install
Web APL install Logic APL install MySQL install
レシピは再利用できるように、細かく分けるのがコツ
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 27
Chef(ロールとレシピ)
web-dev ap-dev db-dev
web-prod ap-prod db-prod
web-role ap-role db-role
web-recipe ap-recipe db-
recipe
run_list run_list run_list
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 28
Chef(CI + デプロイ)
web-dev
web-role
web-recipe
PC
Chef-client
Chef-server
git push
Chefdk
git.corp
web-dev-env
web-dev
CI-tool
web hook
Upload recipe
knife ssh
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 29
Chef(課題)
web01
web-role
web-recipe
Chef-server
web-prod-env
web01
LB
web04web02 web03
Internet
CI-tool
web02
web03 web04
web-prod-envへリリース!
環境に紐づく全ノード取得
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 30
Chef(課題)
web01
LB
web04web02 web03
Internet
CI-tool
サービスアウト&リリース
なんらかの理由でデプロイ失敗。。
web-role
web-recipe
Chef-server
web-prod-env
web01 web02
web03 web04
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 31
Chef(課題)
web01
LB
web04web02 web03
Internet
CI-tool
サービスアウト&リリース
web-role
web-recipe
Chef-server
web-prod-env
web01 web02
web03 web04
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 32
Chef(課題)
web01
LB
web04web02 web03
Internet
CI-tool
サービスアウト&リリース
web-role
web-recipe
Chef-server
web-prod-env
web01 web02
web03 web04
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 33
Chef(課題)
web01
LB
web04web02 web03
Internet
CI-tool
サービスアウト&リリース
web-role
web-recipe
Chef-server
web-prod-env
web01 web02
web03 web04
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 34
Chef(課題)
web01
LB
web04web02 web03
Internet
CI-tool
見事に全滅
web-role
web-recipe
Chef-server
web-prod-env
web01 web02
web03 web04
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 35
Chef(課題解決)
web01
web-role
web-recipe
Chef-server
LB
web04web02 web03
Internet
CI-tool
web03 web04
前半の環境に紐づく全ノード取得 web-prod-env-1
web-prod-env-2
web01 web02
前半だけリリース!
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 36
Chef(課題解決)
web01
LB
web04web02 web03
Internet
CI-tool
サービスアウト&リリース
環境を分けよう! web-role
web-recipe
Chef-server
web03 web04
web-prod-env-1
web-prod-env-2
web01 web02
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 37
Chef(課題解決)
この件についてはissueが上がっているので、
きっと近いうちに修正されるはず!
https://github.com/chef/chef/issues/5399
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 38
Chef(cookbook)
Rubyとリソースの組み合わせ
レシピ/recipes
リソース1 リソース2
リソース3 リソース4
材料1
材料集/files
リリースする資材
テンプレート1
材料2
これらを総称して、cookbookと呼ぶ
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 39
Chef(ATSを入れるレシピ)
%w(pkgconfig libtool gcc make openssl tcl pcre libcap
flex hwloc lua ncurses curl).each do |pkg|
yum_package pkg do
action :install
end
end
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 40
Chef(ATSを入れるレシピ)
remote_file '/tmp/master.zip' do
source 'https://github.com/apache/trafficserver/archive/master.zip'
mode '0444'
end
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 41
Chef(ATSを入れるレシピ)
execute 'expand ATS' do
command <<-EOF
cd /tmp/; unzip master.zip
cd trafficserver-master; autoreconf -if
./configure --prefix=/opt/ats
make; make check; make install
EOF
end
Install_ats.rb
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. 42
今後のロードマップ
• eコマース事業拡大に伴い、ウォレットへの需要は高まる
• 売り場での決済時アクセスが増える
• パーソナライズのための情報提供を安全に完全に行う
• プロダクトの品質を、高カバレッジな自動テストで担保
• 実機から仮想環境へ。ペットから家畜への移行が必要
• より正確で迅速なデプロイ作業をChefで実現
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
情報技術で
人々のマネーライフの課題を解決する
決済金融カンパニー
43

決済金融から始めるデータドリブンカンパニー #yjmu

  • 1.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 2017/02/20 決済金融から始める データドリブン カンパニー 江藤 徳宏
  • 2.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 2 自己紹介 • 担当サービス • Yahoo! ウォレット • 本人確認 • 役割 • 運用エンジニア & 保守開発 • 学生時代の専門 • 数理科学(非線形偏微分方程式) • 趣味 • ランニング(ラン歴3年、東京マラソン2015完走) • スマホゲーム(パズドラ、PokemonGO)
  • 3.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 3 Yahoo! ウォレット 働いているところ
  • 4.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 4 データドリブン企業 ここ1年で、「ネット企業」から「データドリブン企業」へ! ほとんどのサービスで、 データを利活用できるようにする
  • 5.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 5 データドリブンへの路 データ利活用しよう! そのためのマインドマップを作成しました
  • 6.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 6 データドリブンへの路 CI/CD
  • 7.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 7 CI/CD • テスト (commit build) • コミットされたソースがテストされる CI(Continuous Integration) ↑これらを自動的に行う! • パッケージング (component build) • レビューが完了したソースはメインブランチにマージ される • メインブランチへの変更をテストする • テスト成功時のみ、パッケージを作成する
  • 8.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 8 CI/CD • アセンブリ(assembly build) • パッケージ群の構成リストを作成する CD(Continuous Delivery) ↑これらを自動的に行う! • デプロイ(deploy build) • アセンブリで作成された構成リストにてサーバへのリリー スを実施 • まっさらなサーバであれば、サービスが利用できる状態に 持っていく
  • 9.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 9 CI/CD • ソフト面(CI) • テストがない • テストなど必要ないと思っている • ハード面(CD) • 構成管理ができていない • /etc/hostsは? • routeは? • LANGは? • ディレクトリを手動で作っている • リリース方法が原始的(手置き) CI/CD 阻害要因 レガシーシステム (技術的負債)
  • 10.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 10 今回のLTの目的 • 既存(古い)システム • レガシーコードで書かれているものが多い • テストがないので、改修が困難 • レガシーシステムと戦う方法 • テストのすすめ • 構成管理のすすめ
  • 11.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. CI テストのすすめ
  • 12.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 12 テストしづらいコード モック化したい箇所が ベタ書きだったら・・・ ※実際の現場は、 こんなものではない ですよ。。 この部分だけ ごまかしたい
  • 13.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 13 レガシーコードを斬る! よく使うモッキングフレームワークその1 Phake https://github.com/mlively/Phake % cat composer.json { "require-dev": { "phake/phake": "@stable” } } % composer install ★導入方法 特徴 • MockObjectと似ている • 1メソッドだけモックにすることが可能 • コールバック関数への置換 • 呼び出し検証機能
  • 14.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 14 レガシーコードを斬る! ソース まるごと関数でラップする protected以上とする
  • 15.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 15 レガシーコードを斬る! テスト テスト対象クラスをpartialMockメソッドでインスタンス化 どの関数がどの引数で呼ばれたときに何がしを返す
  • 16.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 16 レガシーコードを斬る! よく使うモッキングフレームワークその2 AspectMock https://github.com/Codeception/AspectMock % cat composer.json { "require-dev": { "codeception/aspect-mock": "*" } } % composer install ★導入方法 特徴 • グローバル関数をドラスティックに変更 • コールバック関数への置換 • 呼び出し検証機能
  • 17.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 17 レガシーコードを斬る! ソース 名前空間を指定する この関数だけモック化
  • 18.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 18 レガシーコードを斬る! テスト 名前空間、関数名、返却値を指定するだけ。
  • 19.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 19 テストのまとめ • コミットされたソースについては、全部グリーンになること • 何をテストしたいのか、観点を明確にする • MockObjectでテストできないようなコードは書かない (できればTDD実践!)
  • 20.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 20 テストのまとめ レガシーコードに出会ったら・・・・・・ • 封印する • フルスクラッチ • 手を加えるならば必ずテストを書く • in/outテスト • 適切なモッキングフレームワークを使う
  • 21.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. CD 構成管理のすすめ
  • 22.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 22 CD 構成管理 • システムの構成要素を一元管理する • ネットワーク設定 • アカウント、sudo権限 • hosts • syslog • パッケージ群(独自、rpm) etc… 管理するだけでなく、簡単に適用したい
  • 23.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 23 Chef • システムのあるべき姿を「リソース」という単位で管理 Yahoo!ウォレットでは、Chefを導入中 • 「リソース」を束ねて、「レシピ」にまとめる • 「レシピ」を適用する機能群を「ロール」にまとめる • デプロイ先のサーバ群を「環境」にまとめ、ロールを紐づける • デプロイを実行する
  • 24.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 24 Chef Web AP DB ATS Apache PHP Web APL ATS Apache Jetty Logic APL MySQL Server ATS = Apache Traffic Server
  • 25.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 25 Chef(環境とロール) web-dev db-dev開発環境 本番環境 web-prod ap-prod db-prod web-role ap-role db-role ap-dev
  • 26.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 26 Chef(レシピ) web-recipe ap-recipe db-recipe ATS install Apache install PHP install Jetty install Web APL install Logic APL install MySQL install レシピは再利用できるように、細かく分けるのがコツ
  • 27.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 27 Chef(ロールとレシピ) web-dev ap-dev db-dev web-prod ap-prod db-prod web-role ap-role db-role web-recipe ap-recipe db- recipe run_list run_list run_list
  • 28.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 28 Chef(CI + デプロイ) web-dev web-role web-recipe PC Chef-client Chef-server git push Chefdk git.corp web-dev-env web-dev CI-tool web hook Upload recipe knife ssh
  • 29.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 29 Chef(課題) web01 web-role web-recipe Chef-server web-prod-env web01 LB web04web02 web03 Internet CI-tool web02 web03 web04 web-prod-envへリリース! 環境に紐づく全ノード取得
  • 30.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 30 Chef(課題) web01 LB web04web02 web03 Internet CI-tool サービスアウト&リリース なんらかの理由でデプロイ失敗。。 web-role web-recipe Chef-server web-prod-env web01 web02 web03 web04
  • 31.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 31 Chef(課題) web01 LB web04web02 web03 Internet CI-tool サービスアウト&リリース web-role web-recipe Chef-server web-prod-env web01 web02 web03 web04
  • 32.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 32 Chef(課題) web01 LB web04web02 web03 Internet CI-tool サービスアウト&リリース web-role web-recipe Chef-server web-prod-env web01 web02 web03 web04
  • 33.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 33 Chef(課題) web01 LB web04web02 web03 Internet CI-tool サービスアウト&リリース web-role web-recipe Chef-server web-prod-env web01 web02 web03 web04
  • 34.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 34 Chef(課題) web01 LB web04web02 web03 Internet CI-tool 見事に全滅 web-role web-recipe Chef-server web-prod-env web01 web02 web03 web04
  • 35.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 35 Chef(課題解決) web01 web-role web-recipe Chef-server LB web04web02 web03 Internet CI-tool web03 web04 前半の環境に紐づく全ノード取得 web-prod-env-1 web-prod-env-2 web01 web02 前半だけリリース!
  • 36.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 36 Chef(課題解決) web01 LB web04web02 web03 Internet CI-tool サービスアウト&リリース 環境を分けよう! web-role web-recipe Chef-server web03 web04 web-prod-env-1 web-prod-env-2 web01 web02
  • 37.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 37 Chef(課題解決) この件についてはissueが上がっているので、 きっと近いうちに修正されるはず! https://github.com/chef/chef/issues/5399
  • 38.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 38 Chef(cookbook) Rubyとリソースの組み合わせ レシピ/recipes リソース1 リソース2 リソース3 リソース4 材料1 材料集/files リリースする資材 テンプレート1 材料2 これらを総称して、cookbookと呼ぶ
  • 39.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 39 Chef(ATSを入れるレシピ) %w(pkgconfig libtool gcc make openssl tcl pcre libcap flex hwloc lua ncurses curl).each do |pkg| yum_package pkg do action :install end end
  • 40.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 40 Chef(ATSを入れるレシピ) remote_file '/tmp/master.zip' do source 'https://github.com/apache/trafficserver/archive/master.zip' mode '0444' end
  • 41.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 41 Chef(ATSを入れるレシピ) execute 'expand ATS' do command <<-EOF cd /tmp/; unzip master.zip cd trafficserver-master; autoreconf -if ./configure --prefix=/opt/ats make; make check; make install EOF end Install_ats.rb
  • 42.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 42 今後のロードマップ • eコマース事業拡大に伴い、ウォレットへの需要は高まる • 売り場での決済時アクセスが増える • パーソナライズのための情報提供を安全に完全に行う • プロダクトの品質を、高カバレッジな自動テストで担保 • 実機から仮想環境へ。ペットから家畜への移行が必要 • より正確で迅速なデプロイ作業をChefで実現
  • 43.
    Copyright © 2017Yahoo Japan Corporation. All Rights Reserved. 情報技術で 人々のマネーライフの課題を解決する 決済金融カンパニー 43