Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Applications made 
with Twelve-Factor-App 
@koudaiii
Profile 
id: koudaiii 
fullname: Kodai Sakabe
• https://speakerdeck.com/takai/continuous-delivery-in-cookpad
• https://speakerdeck.com/takai/continuous-delivery-in-cookpad
継続的にデリバリーできる 
仕組みって?
Twelve-Factor App 
WebApplication、SaaSを作り上げるための方法論 
• http://twelve-factor-ja.herokuapp.com/
Twelve-Factor Appって? 
• 寄稿者が何百何千ものアプリケーションの開 
発・運用・スケールを経験してきた知見であ 
り方法論 
• Herokuプラットフォーム上を前提としている
方法論 
• セットアップ自動化のために 宣言的な フォーマットを使い、プロジェクトに 
新しく加わった開発者が要する時間とコストを最小化する。 
• 下層のOSへの 依存関係を明確化 し、実行環境間での 移植性を最大化 する。 
• モダンな...
1. コードベース (Codebase) 
2. 依存関係 (Dependencies) 
3. 設定 (Config) 
4. バックエンドサービス (Backing Services) 
5. ビルド、リリース、実行 (Build, rel...
CodeBase 
• バージョン管理されている1つのコードベース 
と複数のデプロイ 
• Git,SVN等 
• 常に1対1の関係
Dependencies 
• 依存関係を明示的に宣言し分離する 
• CPANやRubyGem等。~env系のツール 
• すべての依存関係を 依存関係宣言 マニフェス 
トで完全かつ厳密に宣言する(Gemfile) 
• 宣言したものを利用...
Config 
• 設定を環境変数に格納する 
• アプリケーションの 設定 は、デプロイ(ステージン 
グ、本番、開発環境など)の間で異なり得る唯一のも 
の 
• 設定をコードから厳密に分離すること 
• 環境変数に格納(qt)または、do...
Backing Services 
• バックエンドサービスをアタッチされたリソースとし 
て扱う 
• Twelve-Factor Appのデプロイは、 
• アプリケーションのコードに変更を加えることなく、 
• ローカルで管理されるMyS...
Backing Services(続き 
• リソースは自由にデプロイにアタッチしたり、デプロイからデ 
タッチしたりできる。 
• ハードウェアの問題によってアプリケーションのデータベース 
の動作がおかしい場合、 
• アプリケーションの管...
Backing Services(続き
Build, release, run 
• ビルド、リリース、実行の3つのステージを厳密に分離する。 
Capistrano等 
• releasesという名前のサブディレクトリに格納し、 
• 現在のリリースは現在のリリースのディレクトリへ...
Processes 
• アプリケーションを1つもしくは複数のステート 
レスなプロセスとして実行する 
• プロセスはステートレスかつシェアードナッシン 
グ である。 
• 永続化する必要のあるすべてのデータは、ステー 
トフルなバックエン...
Port binding 
• ポートバインディングを通してサービスを公開する 
• WebアプリケーションはWebサーバーコンテナの内部で実行されることが 
ある。 
• Twelve-Factor Appは完全に自己完結 し、Webに公開さ...
Concurrency 
• プロセスモデルによってスケールアウトする
Concurrency(続き 
• プロセスは決してデーモン化するべきではないし、PID 
ファイルを書き出すべきではない。 
• その代わりに、OSのプロセスマネージャー(例: 
Upstart、クラウドプラットフォームの分散プロセスマ 
ネ...
Disposability 
• 高速な起動とグレースフルシャットダウンで堅牢性 
を最大化する 
• プロセス は 廃棄容易 であり即座に起動・終了する 
ことができる。 
• この性質が、素早く柔軟なスケールと、コード や 設 
定 に対す...
Dev/prod parity 
• 開発、ステージング、本番環境をできるだけ一致させ 
た状態を保つ 
• 3つのギャップをなくす 
• 時間のギャップ・・コードが本番に反映される時間 
• 人材のギャップ・・リリースは運用担当者 
• ツー...
Dev/prod parity(続き 
• 継続的デプロイしやすいよう開発環境と本番環境のギャッ 
プを小さく保つ 
• 開発者が書いたコードは数時間後、さらには数分後には 
デプロイされる 
• コードを書いた開発者はそのコードのデプロイに深...
Logs 
• ログをイベントストリームとして扱う 
• ログは、すべての実行中のプロセスとバックエ 
ンドサービスの出力ストリームから収集された 
イベントが、集約されて時刻順に並べられたス 
トリームである。 
• 生の状態のログは、通常1...
Logs(続き 
• FluentdやSplunk,BigQuery等を組み合わせで以下の利点 
• 過去の特定のイベントを見つける。 
• 大きなスケールの傾向をグラフ化する。(1分あたり 
のリクエスト数など) 
• ユーザー定義のヒューリ...
Admin processes 
• 管理タスク(マイグレーション等)を1回限りのプロセスとして 
実行 
• 1回限りの管理プロセスは、アプリケーションの通常の長時 
間実行されるプロセスと全く同じ環境で実行されるべき 
• これらのプロセス...
1. コードベース (Codebase) 
2. 依存関係 (Dependencies) 
3. 設定 (Config) 
4. バックエンドサービス (Backing Services) 
5. ビルド、リリース、実行 (Build, rel...
CodeBase
Dependencies
Config
Disposability 
providerを変えることで違う環境へ構築。または、 
bundle exec knife solo bootstrap webapp等
Dev/prod parity 
同じBuild STEPで同じMiddleware。同じVagrantfile。
Continuous Integration
初期構築 
6ヶ月 ⇒ 30m
学習コスト 
役割毎に分割 
プロビジョニングログ 
実機による確認 
上記から変に1から学ぶ必要がない
はまった作業は 
Commitメッセージ&コメント
commitにより、設定情報だけではなく、 
なんのためにcommitしたかを追える 
Tagにより、アークテクチャーのバージョン管理 
!!
リリース作業 
bundle exec cap production deploy
環境を選ばない 
bundle exec knife solo bootstrap YourServer
ubuntu & CentOSの確認 
bundle exec kitchen test
テスト済みのインフラ基盤 
bundle exec rake spec
Continuous delivery
Next Step 
Blue-Green Deployment! 
ChatOps!
Reference 
• http://twelve-factor-ja.herokuapp.com/ 
• twelve-factor-app 
• https://speakerdeck.com/takai/continuous-deliv...
Applications made ​​with twelve factor-app
Applications made ​​with twelve factor-app
Upcoming SlideShare
Loading in …5
×

Applications made ​​with twelve factor-app

978 views

Published on

ASTT、東産業Matsuriでの発表

Published in: Technology
  • Be the first to comment

Applications made ​​with twelve factor-app

  1. 1. Applications made with Twelve-Factor-App @koudaiii
  2. 2. Profile id: koudaiii fullname: Kodai Sakabe
  3. 3. • https://speakerdeck.com/takai/continuous-delivery-in-cookpad
  4. 4. • https://speakerdeck.com/takai/continuous-delivery-in-cookpad
  5. 5. 継続的にデリバリーできる 仕組みって?
  6. 6. Twelve-Factor App WebApplication、SaaSを作り上げるための方法論 • http://twelve-factor-ja.herokuapp.com/
  7. 7. Twelve-Factor Appって? • 寄稿者が何百何千ものアプリケーションの開 発・運用・スケールを経験してきた知見であ り方法論 • Herokuプラットフォーム上を前提としている
  8. 8. 方法論 • セットアップ自動化のために 宣言的な フォーマットを使い、プロジェクトに 新しく加わった開発者が要する時間とコストを最小化する。 • 下層のOSへの 依存関係を明確化 し、実行環境間での 移植性を最大化 する。 • モダンな クラウドプラットフォーム 上への デプロイ に適しており、サーバー 管理やシステム管理を不要なものにする。 • 開発環境と本番環境の 差異を最小限 にし、アジリティを最大化する 継続的 デプロイ を可能にする。 • ツール、アーキテクチャ、開発プラクティスを大幅に変更することなく ス ケールアップ できる。
  9. 9. 1. コードベース (Codebase) 2. 依存関係 (Dependencies) 3. 設定 (Config) 4. バックエンドサービス (Backing Services) 5. ビルド、リリース、実行 (Build, release, run) 6. プロセス (Processes) 7. ポートバインディング (Port binding) 8. 並行性 (Concurrency) 9. 廃棄容易性 (Disposability) 10.開発/本番一致 (Dev/prod parity) 11.ログ (Logs) 12.管理プロセス (Admin processes)
  10. 10. CodeBase • バージョン管理されている1つのコードベース と複数のデプロイ • Git,SVN等 • 常に1対1の関係
  11. 11. Dependencies • 依存関係を明示的に宣言し分離する • CPANやRubyGem等。~env系のツール • すべての依存関係を 依存関係宣言 マニフェス トで完全かつ厳密に宣言する(Gemfile) • 宣言したものを利用する(bundle exec)
  12. 12. Config • 設定を環境変数に格納する • アプリケーションの 設定 は、デプロイ(ステージン グ、本番、開発環境など)の間で異なり得る唯一のも の • 設定をコードから厳密に分離すること • 環境変数に格納(qt)または、dotenv等(database)を用 いる
  13. 13. Backing Services • バックエンドサービスをアタッチされたリソースとし て扱う • Twelve-Factor Appのデプロイは、 • アプリケーションのコードに変更を加えることなく、 • ローカルで管理されるMySQLデータベースをサード パーティに管理されるサービス(Amazon RDSなど) に切り替えることができるべき
  14. 14. Backing Services(続き • リソースは自由にデプロイにアタッチしたり、デプロイからデ タッチしたりできる。 • ハードウェアの問題によってアプリケーションのデータベース の動作がおかしい場合、 • アプリケーションの管理者は最新のバックアップから新しいデー タベースサーバーを立ち上げる。 • そして現在の本番データベースをデタッチし、 • 新しいデータベースをアタッチする-コードを一切変更せずに。
  15. 15. Backing Services(続き
  16. 16. Build, release, run • ビルド、リリース、実行の3つのステージを厳密に分離する。 Capistrano等 • releasesという名前のサブディレクトリに格納し、 • 現在のリリースは現在のリリースのディレクトリへのシンボリック リンクとなる。 • Capistranoのrollbackコマンドを使うと、簡単かつ即座に以前のリ リースにロールバック • 今だとBule-Green deployment
  17. 17. Processes • アプリケーションを1つもしくは複数のステート レスなプロセスとして実行する • プロセスはステートレスかつシェアードナッシン グ である。 • 永続化する必要のあるすべてのデータは、ステー トフルなバックエンドサービス(典型的にはデー タベース)に格納しなければならない。
  18. 18. Port binding • ポートバインディングを通してサービスを公開する • WebアプリケーションはWebサーバーコンテナの内部で実行されることが ある。 • Twelve-Factor Appは完全に自己完結 し、Webに公開されるサービスを作 成するために、コンテナが実行環境にWebサーバーランタイムを注入する ことを頼りにしない。 • Webアプリケーションは ポートにバインドすることでHTTPをサービスと して公開し、 そのポートにリクエストが来るのを待つ。 • APPとWebはPort間でつなげ独立させる
  19. 19. Concurrency • プロセスモデルによってスケールアウトする
  20. 20. Concurrency(続き • プロセスは決してデーモン化するべきではないし、PID ファイルを書き出すべきではない。 • その代わりに、OSのプロセスマネージャー(例: Upstart、クラウドプラットフォームの分散プロセスマ ネージャー、あるいは開発環境におけるForemanのような ツール)を頼ることで、 • 出力ストリームを管理し、プロセスのクラッシュに対応し、 ユーザーによる再起動やシャットダウンを処理すべき
  21. 21. Disposability • 高速な起動とグレースフルシャットダウンで堅牢性 を最大化する • プロセス は 廃棄容易 であり即座に起動・終了する ことができる。 • この性質が、素早く柔軟なスケールと、コード や 設 定 に対する変更の素早いデプロイを容易にし、本番 デプロイの堅牢性を高める
  22. 22. Dev/prod parity • 開発、ステージング、本番環境をできるだけ一致させ た状態を保つ • 3つのギャップをなくす • 時間のギャップ・・コードが本番に反映される時間 • 人材のギャップ・・リリースは運用担当者 • ツールのギャップ・・開発と本番のMiddlewareが違う
  23. 23. Dev/prod parity(続き • 継続的デプロイしやすいよう開発環境と本番環境のギャッ プを小さく保つ • 開発者が書いたコードは数時間後、さらには数分後には デプロイされる • コードを書いた開発者はそのコードのデプロイに深く関 わり、そのコードの本番環境での挙動をモニタリングす る。 • 開発環境と本番環境をできるだけ一致させた状態を保つ。
  24. 24. Logs • ログをイベントストリームとして扱う • ログは、すべての実行中のプロセスとバックエ ンドサービスの出力ストリームから収集された イベントが、集約されて時刻順に並べられたス トリームである。 • 生の状態のログは、通常1行が1つのイベントを 表すテキストフォーマットである
  25. 25. Logs(続き • FluentdやSplunk,BigQuery等を組み合わせで以下の利点 • 過去の特定のイベントを見つける。 • 大きなスケールの傾向をグラフ化する。(1分あたり のリクエスト数など) • ユーザー定義のヒューリスティクスに基づいて素早く アラートを出す。(1分あたりのエラー数がある閾値 を超えた場合にアラートを出すなど)
  26. 26. Admin processes • 管理タスク(マイグレーション等)を1回限りのプロセスとして 実行 • 1回限りの管理プロセスは、アプリケーションの通常の長時 間実行されるプロセスと全く同じ環境で実行されるべき • これらのプロセスは、あるリリースに対して実行され、その リリースに対して実行されるすべてのプロセスと同じコード と設定を使う。 • デプロイ時に一緒にされるべきである。(db:migrate等)
  27. 27. 1. コードベース (Codebase) 2. 依存関係 (Dependencies) 3. 設定 (Config) 4. バックエンドサービス (Backing Services) 5. ビルド、リリース、実行 (Build, release, run) 6. プロセス (Processes) 7. ポートバインディング (Port binding) 8. 並行性 (Concurrency) 9. 廃棄容易性 (Disposability) 10.開発/本番一致 (Dev/prod parity) 11.ログ (Logs) 12.管理プロセス (Admin processes)
  28. 28. CodeBase
  29. 29. Dependencies
  30. 30. Config
  31. 31. Disposability providerを変えることで違う環境へ構築。または、 bundle exec knife solo bootstrap webapp等
  32. 32. Dev/prod parity 同じBuild STEPで同じMiddleware。同じVagrantfile。
  33. 33. Continuous Integration
  34. 34. 初期構築 6ヶ月 ⇒ 30m
  35. 35. 学習コスト 役割毎に分割 プロビジョニングログ 実機による確認 上記から変に1から学ぶ必要がない
  36. 36. はまった作業は Commitメッセージ&コメント
  37. 37. commitにより、設定情報だけではなく、 なんのためにcommitしたかを追える Tagにより、アークテクチャーのバージョン管理 !!
  38. 38. リリース作業 bundle exec cap production deploy
  39. 39. 環境を選ばない bundle exec knife solo bootstrap YourServer
  40. 40. ubuntu & CentOSの確認 bundle exec kitchen test
  41. 41. テスト済みのインフラ基盤 bundle exec rake spec
  42. 42. Continuous delivery
  43. 43. Next Step Blue-Green Deployment! ChatOps!
  44. 44. Reference • http://twelve-factor-ja.herokuapp.com/ • twelve-factor-app • https://speakerdeck.com/takai/continuous-delivery-in-cookpad • continuous-delivery-in-cookpad • http://www.atmarkit.co.jp/ait/articles/1312/03/news033.html • 継続的デリバリ/デプロイを実現する手法・ツールまとめ • http://easyramble.com/warn-missing-cookbook-dependency.html • WARN: MissingCookbookDependencyとChefで警告が出る場合の対処 • http://qiita.com/cazador/items/e0db714555f2f36d98c6 • 大規模にchefを使い倒すためのcookbook pattern • 書籍「入門Chef Solo - Infrastructure as Code」「Vagrant入門ガイド」「Chef活用ガイド コードではじめる 構成管理」「Chef実践入門 ~コードによるインフラ構成の自動化 (WEB+DB PRESS plus) 」

×