Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Twelve-Factor Appで読み解く、モダンなアプリの理想とレガシーなアプリの現実 /...
Search
rs_tukki
June 24, 2020
Programming
4
1.9k
Twelve-Factor Appで読み解く、モダンなアプリの理想とレガシーなアプリの現実 / Rakus Meetup Tokyo 5 Twelve Factor App
Rakus Meetup Tokyo #5 「SaaSを支える開発原則」の登壇資料です。
https://rakus.connpass.com/event/178046/
rs_tukki
June 24, 2020
Tweet
Share
More Decks by rs_tukki
See All by rs_tukki
設計初心者のための「伝わる」フロー図 / How to draw a communicative flow diagram for beginners
rs_tukki
1
730
はじめてのTypeScript × はじめてのChrome拡張 / frontend_lt typescript and chrome-extension
rs_tukki
0
850
Other Decks in Programming
See All in Programming
PicoRubyと暮らす、シェアハウスハック
ryosk7
0
220
令和7年版 あなたが使ってよいフロントエンド機能とは
mugi_uno
10
5.2k
BEエンジニアがFEの業務をできるようになるまでにやったこと
yoshida_ryushin
0
200
カンファレンス動画鑑賞会のススメ / Osaka.swift #1
hironytic
0
170
情報漏洩させないための設計
kubotak
5
1.3k
生成AIでGitHubソースコード取得して仕様書を作成
shukob
0
630
Alba: Why, How and What's So Interesting
okuramasafumi
0
210
shadcn/uiを使ってReactでの開発を加速させよう!
lef237
0
300
技術的負債と向き合うカイゼン活動を1年続けて分かった "持続可能" なプロダクト開発
yuichiro_serita
0
300
GitHub CopilotでTypeScriptの コード生成するワザップ
starfish719
26
6k
盆栽転じて家具となる / Bonsai and Furnitures
aereal
0
1.9k
chibiccをCILに移植した結果 (NGK2025S版)
kekyo
PRO
0
130
Featured
See All Featured
How GitHub (no longer) Works
holman
312
140k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
45
2.3k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
The Cost Of JavaScript in 2023
addyosmani
46
7.2k
Building Applications with DynamoDB
mza
93
6.2k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3.1k
Faster Mobile Websites
deanohume
305
30k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.6k
Adopting Sorbet at Scale
ufuk
74
9.2k
Embracing the Ebb and Flow
colly
84
4.5k
Visualization
eitanlees
146
15k
Optimizing for Happiness
mojombo
376
70k
Transcript
#RAKUSMeetup ©2020 RAKUS Co., Ltd. ©2020 RAKUS Co., Ltd. Twelve-Factor
Appで読み解く、 モダンなアプリの理想と レガシーなアプリの現実 開発統括部 第三開発部 楽楽精算開発2課 矢須 健太
#RAKUSMeetup ©2020 RAKUS Co., Ltd. 自己紹介 • 矢須 健太 (25)
• 楽楽精算の開発を担当 • @rs_tukki • Main : Java(Spring Boot, Seasar2) / Swift / Kotlin • Sub : PHP / Python / C# • Like : 野球観戦 / 旅行 / 読書
#RAKUSMeetup ©2020 RAKUS Co., Ltd. 楽楽精算
#RAKUSMeetup ©2020 RAKUS Co., Ltd. 楽楽精算 • 交通費・出張費・経費・交際費など、お金にまつわる全ての処理を一元管理できるクラウドシステムです。 • 2009年リリース
/ 導入社数6,000社突破!
#RAKUSMeetup ©2020 RAKUS Co., Ltd. ©2020 RAKUS Co., Ltd. Twelve-Factor
App
#RAKUSMeetup ©2020 RAKUS Co., Ltd. Twelve-Factor App • 今回初めて聞いたという人 •
言葉だけは聞いたことがある人 • 内容を説明できる人
#RAKUSMeetup ©2020 RAKUS Co., Ltd. Twelve-Factor App • 今回初めて聞いたという人 •
言葉だけは聞いたことがある人 • 内容を説明できる人
#RAKUSMeetup ©2020 RAKUS Co., Ltd. Twelve-Factor App • 今回初めて聞いたという人 •
言葉だけは聞いたことがある人 • 内容を説明できる人
#RAKUSMeetup ©2020 RAKUS Co., Ltd. Twelve-Factor App • クラウド上で動くアプリケーション(=SaaS)が守るべき 原則を12個にまとめた方法論
• 提唱されたのは2012年
#RAKUSMeetup ©2020 RAKUS Co., Ltd. 楽楽精算 • 交通費・出張費・経費・交際費など、お金にまつわる全ての処理を一元管理できるクラウドシステムです。 • 2009年リリース
/ 導入社数6,000社突破!
#RAKUSMeetup ©2020 RAKUS Co., Ltd. レガシーなアプリとモダンな方法論 • 楽楽精算はTwelve-Factor Appより古い •
今回のお話 1. Twelve Factor-Appから何点か抜粋して 2. 楽楽精算の開発と比較することで 3. レガシーなアプリをモダンに改善する道を探っていく!
#RAKUSMeetup ©2020 RAKUS Co., Ltd. Twelve-Factor App • 今回説明する内容 •
III. 設定 • X. 開発/本番一致 • V. ビルド、リリース、実行 • VIII. 並行性
#RAKUSMeetup ©2020 RAKUS Co., Ltd. Twelve-Factor App • 今回説明する内容 •
III. 設定 • X. 開発/本番一致 • V. ビルド、リリース、実行 • VIII. 並行性
#RAKUSMeetup ©2020 RAKUS Co., Ltd. III. 設定 • 原則:アプリの設定値は環境変数に格納せよ! •
設定値をコード内部に含めるのはNG • コードは今すぐにでもオープンソース化できる状態であるべき • 外部ファイルを読み取る方式もNG • 言語やフレームワークに依存したファイル形式になる • 環境ごとに異なる設定ファイルが散乱し、管理が煩雑になる
#RAKUSMeetup ©2020 RAKUS Co., Ltd. III. 設定 • 楽楽精算では 開発用リポジトリ
リリース用リポジトリ ローカル用の 設定ファイル テスト用の 設定ファイル 本番用の 設定ファイル
#RAKUSMeetup ©2020 RAKUS Co., Ltd. III. 設定 • よくある話 •
ローカルでは動いたのにテスト機上では動かない… ローカル用の 設定ファイル テスト用の 設定ファイル
#RAKUSMeetup ©2020 RAKUS Co., Ltd. III. 設定 • よくある話 •
ローカルでは動いたのにテスト機上では動かない… ローカル用の 設定ファイル ⇒記入済 テスト用の 設定ファイル ⇒未記入
#RAKUSMeetup ©2020 RAKUS Co., Ltd. III. 設定 • あるかもしれない話 •
本番リリースでも同じことが起きる…? 開発用リポジトリ リリース用リポジトリ ローカル用の 設定ファイル ⇒記入済 テスト用の 設定ファイル ⇒記入済 本番用の 設定ファイル ⇒未記入…?
#RAKUSMeetup ©2020 RAKUS Co., Ltd. III. 設定 • 何故書き忘れるのか? •
設定ファイルに書く→この設定を全環境で使えるのでは? • 他環境用のファイルも直さなければという意識が薄くなる • 環境変数なら • 各環境に直接登録される値 • 環境ごとに値を登録するという意識が強まり回避しやすい
#RAKUSMeetup ©2020 RAKUS Co., Ltd. Twelve-Factor App • 今回説明する内容 •
III. 設定 • X. 開発/本番一致 • V. ビルド、リリース、実行 • VIII. 並行性
#RAKUSMeetup ©2020 RAKUS Co., Ltd. X. 開発/本番一致 • 原則:開発・本番各環境で3つのギャップを最小にせよ! •
時間のギャップ • 開発⇒本番デプロイを数時間で実現 • 人材のギャップ • 開発した人が運用も行う • ツールのギャップ • 開発と本番で同じツールを使う
#RAKUSMeetup ©2020 RAKUS Co., Ltd. X. 開発/本番一致 • 楽楽精算では/時間のギャップ •
メジャーリリースは基本年4回 バージョン/月 4月 5月 6月 7月 8月 9月 10月 11月 12月 1月 2月 3月 バージョン1 バージョン2 バージョン3 バージョン4 設計~開発 テスト リリース準備 リリース リリース リリース リリース リリース準備 テスト 設計~開発 リリース準備 テスト リリース準備 設計~開発
#RAKUSMeetup ©2020 RAKUS Co., Ltd. X. 開発/本番一致 • 楽楽精算では/時間のギャップ •
メジャーリリースは基本年4回 バージョン/月 4月 5月 6月 7月 8月 9月 10月 11月 12月 1月 2月 3月 バージョン1 バージョン2 バージョン3 バージョン4 設計~開発 テスト リリース準備 リリース リリース リリース リリース リリース準備 テスト 設計~開発 リリース準備 テスト リリース準備 設計~開発 実装からリリースまで 半年超えることも…
#RAKUSMeetup ©2020 RAKUS Co., Ltd. X. 開発/本番一致 • 楽楽精算では/人材のギャップ •
開発担当のチームとリリース担当のチームが分かれている • 原則に則っていないが、分かれていること自体は問題ではない 開発チームと リリースチームが分離
#RAKUSMeetup ©2020 RAKUS Co., Ltd. X. 開発/本番一致 • 本当の問題点 •
開発担当「◦◦な環境が欲しいんですが何を渡せばいいですか?」 • リリース担当「◦◦が欲しいけど開発側の手順は分からないよ?」 • お互いがお互いの業務に無関心なために起こる弊害 お互いの意思疎通が 上手くいっていない
#RAKUSMeetup ©2020 RAKUS Co., Ltd. X. 開発/本番一致 • 楽楽精算では/ツールのギャップ •
使用しているツールはほとんど一致している • テスト環境では動いたのに本番環境では動かない、というケース が少ない ツール/環境 ローカル環境 テスト環境 本番環境 OS Windows CentOS CentOS アプリケーションサーバ Tomcat Tomcat Tomcat Webサーバ Apache(Tomcat内蔵) Apache Apache データベース PostgreSQL PostgreSQL PostgreSQL
#RAKUSMeetup ©2020 RAKUS Co., Ltd. Twelve-Factor App • 今回説明する内容 •
III. 設定 • X. 開発/本番一致 • V. ビルド、リリース、実行 • VIII. 並行性
#RAKUSMeetup ©2020 RAKUS Co., Ltd. V. ビルド、リリース、実行 • 原則:3つのプロセスは明確に区別せよ! •
実行中のコードを直接変更してはいけない • ≒コードを変更する場合はリリース自体をやり直すべきである • 別環境へリリースするたびにビルドしてはいけない • ≒全ての環境で同じコードを使うべきである • 実行のたびにリリース作業をやり直してはいけない • ≒再起動だけ行う場合は同じ成果物を使いまわす
#RAKUSMeetup ©2020 RAKUS Co., Ltd. V. ビルド、リリース、実行 • 楽楽精算では… 開発の完了したコード
をビルドしてリリース 担当に受け渡す
#RAKUSMeetup ©2020 RAKUS Co., Ltd. V. ビルド、リリース、実行 • 楽楽精算では… リリース担当はビルド
されたアプリを 各サーバに配置する
#RAKUSMeetup ©2020 RAKUS Co., Ltd. V. ビルド、リリース、実行 • 楽楽精算では… 各サーバ上で配置
されたアプリを起動
#RAKUSMeetup ©2020 RAKUS Co., Ltd. V. ビルド、リリース、実行 • 楽楽精算では… 開発担当が勝手に
ビルドを変更できない (ビルドと実行の 分離) 全環境に対して同じ ビルドでリリースする (ビルドとリリースの 分離) 再起動は必要なサーバ で行うだけ (実行とリリースの 分離)
#RAKUSMeetup ©2020 RAKUS Co., Ltd. Twelve-Factor App • 今回説明する内容 •
III. 設定 • X. 開発/本番一致 • V. ビルド、リリース、実行 • VIII. 並行性
#RAKUSMeetup ©2020 RAKUS Co., Ltd. VIII. 並行性 • 原則:インスタンス数の増加によって負荷に対応せよ! •
サーバそのもののスペック増強だと仮想マシンの再起動が必要 • ⇒ユーザが使えない時間が発生してしまう • プロセスが1つのみなのでそれが落ちたらもう対応不可 • プロセスを水平分割し、負荷によって処理を振り分けるべき • 例:ロードバランサ • プロセスが複数あれば1つが落ちても別のプロセスで処理を継続できる
#RAKUSMeetup ©2020 RAKUS Co., Ltd. VIII. 並行性 • 楽楽精算では… •
ロードバランサ×ユーザ別の複数環境 ・・・ LB LB LB
#RAKUSMeetup ©2020 RAKUS Co., Ltd. VIII. 並行性 • 楽楽精算では… •
ロードバランサ×ユーザ別の複数環境 ・・・ LB LB LB ユーザごとに環境を 分割して負荷分散 ロードバランサで 処理を振り分けて 負荷分散
#RAKUSMeetup ©2020 RAKUS Co., Ltd. VIII. 並行性 • おまけ •
リリースを分割してリスクを減らせる場合もある ・・・ LB LB LB 1回目リリース 2回目リリース
#RAKUSMeetup ©2020 RAKUS Co., Ltd. まとめ • Twelve-Factor Appと楽楽精算の比較を行った •
実現できていない点は実際に運用上苦労しているところ • 今から改善できそうなところも多い • 大事なことは「何故それをすべきなのか?」を考えること • 基本的に「こうするべき」としか書かれていない • 各アプリの特性や目指す形を考えた上で採用するか決める • そもそも今でも役立つとはいえ8年前の話
#RAKUSMeetup ©2020 RAKUS Co., Ltd. ご清聴ありがとうございました。 • 参考 • The
Twelve-Factor App (日本語訳) • https://12factor.net/ja/ • とにかく分かりづらいTwelve-Factor Appの解説を試みる • https://www.slideshare.net/masatoshitada7/twelvefactor-app • Javaでやってみる The Twelve Factor App JJUG-CCC 2014 Fall 講演資料 • https://www.slideshare.net/nabedge/java-the-twelve-factor-app