Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Twelve-Factor Python (Django) Application with ...

Avatar for Kosei Kitahara Kosei Kitahara
September 01, 2017

Twelve-Factor Python (Django) Application with Docker

Twelve-Factor App に準拠した Web アプリケーション開発について

Avatar for Kosei Kitahara

Kosei Kitahara

September 01, 2017
Tweet

More Decks by Kosei Kitahara

Other Decks in Technology

Transcript

  1. Twelve‑Factors ざっと読み飛ばします 1. コー ドベー ス: バー ジョン管理されている1 つのコー ドベー

    スと複数 のデプロイ 2. 依存関係: 依存関係を明示的に宣言し分離する 3. 設定: 設定を環境変数に格納する 4. バックエンドサー ビス: バックエンドサー ビスをアタッチされたリ ソー スとして扱う 5. ビルド、 リリー ス、 実行: ビルド、 リリー ス、 実行の3 つのステー ジ を厳密に分離する 6. プロセス: アプリケー ションを1 つもしくは複数のステー トレスなプ ロセスとして実行する
  2. Twelve‑Factors 7. ポー トバインディング: ポー トバインディングを通してサー ビスを 公開する 8. 並行性:

    プロセスモデルによってスケー ルアウトする 9. 廃棄容易性: 高速な起動とグレー スフルシャットダウンで堅牢性を 最大化する 10. 開発/ 本番一致: 開発、 ステー ジング、 本番環境をできるだけ一致さ せた状態を保つ 11. ログ: ログをイベントストリー ムとして扱う 12. 管理プロセス: 管理タスクを1 回限りのプロセスとして実行する
  3. なぜ Twelve‑Factor App なのか 背景 働き方の多様化: リモー トワー ク、 時間もばらばら

    少人数でもサー ビスの開発、 運用保守を 目指したモノ ロー カルで動作するサー ビスと同等のサー ビスがプロダクションで もそのまま動作する いつ、 どこで、 誰でも Mac さえあれば開発可能 見なければいけないものを減らす アプリケー ションエンジニアはアプリケー ション開発に集中す る インフラエンジニアはインフラの構成管理、 運用に集中する
  4. アプリケー ションの構成 High/Low レイテンシー な Django Web アプリケー ション High/Low

    レイテンシー な Celery ワー カー アプリケー ション それぞれが共通のリソー スへアクセス
  5. Python Web アプリケー ションを Twelve‑ Factor App へ 特に以下について話します 1.

    コー ドベー ス 2. 依存関係 3. 設定 4. バックエンドサー ビス
  6. コー ドベー ス 単一のコー ドベー ス、 複数のデプロイ: ロー カル、 開発、

    ステー ジ ング、 プロダクション Docker イメー ジとして固める 同一のイメー ジを Docker リポジトリ (ECR) にプッシュする ( 本題から外れますが) モノリシック (DRY) に作り、 マイクロにデプ ロイ アプリケー ションを用途や重要度等に応じ分離可能にする nginx や uwsgi 等の各種パラメー ター 値が異なる場合が多いた めどんどん分離していきます 全てのアプリケー ションとして動作可能とするが、 コマンド ( C M D ) で動作を分ける
  7. Travis による単一イメー ジのビルド どうも各デプロイ毎にビルドが走ってしまうらしい https://github.com/travis‑ci/travis‑ci/issues/2570 ビルドは一回にして、 同じものをデプロイ b e f

    o r e _ d e p l o y : - > i f ! [ " $ B E F O R E _ D E P L O Y _ R U N " ] ; t h e n e x p o r t B E F O R E _ D E P L O Y _ R U N = 1 ; m a k e b u i l d ; f i
  8. 各環境の Docker リポジトリへデプロイ - p r o v i d

    e r : s c r i p t s k i p _ c l e a n u p : t r u e s c r i p t : E N V = d e v e l o p m e n t m a k e r e l e a s e o n : b r a n c h : m a s t e r # 開発環境は m a s t e r m e r g e 時に - p r o v i d e r : s c r i p t s k i p _ c l e a n u p : t r u e s c r i p t : E N V = p r o d u c t i o n m a k e r e l e a s e o n : t a g s : t r y e # ステー ジング、 プロダクションはタグプッシュ時に
  9. アプリケー ションの分離 各種制限により適宜アプリケー ションを分離可能にする Django は I N S T

    A L L E D _ A P P S や R O O T _ U R L C O N F で切り分け る # ロー カル開発時には全てを動かす i f s e t t i n g s . D E B U G : u r l p a t t e r n s + = [ u r l ( r ' ^ ' , i n c l u d e ( ' l a t e n c y . h i g h . u r l s ' ) ) , u r l ( r ' ^ ' , i n c l u d e ( ' l a t e n c y . l o w . u r l s ' ) ) , . . . ] Celery は Routing Tasks によって切り分ける
  10. Docker image のアプリケー ションの分離 全ての依存関係をインストー ル 単一イメー ジが ECS で取り扱いやすかったため

    コマンドの引数で切り分け (nginx 等のパラメー タ類は全て異なる) E N T R Y P O I N T [ " / u s r / b i n / r u n . s h " ] C M D [ " - - h e l p " ] # r u n . s h c a s e " $ 1 " i n " w e b a p p _ h i g h _ l a t e n c y " ) r u n _ h i g h _ l a t e n c y _ w e b a p p ; ; " w e b a p p _ l o w _ l a t e n c y " ) r u n _ l o w _ l a t e n c y _ w e b a p p ; ; " w o r k e r _ h i g h _ l a t e n c y " ) r u n _ h i g h _ l a t e n c y _ w o r k e r ; ; . . . * ) u s a g e ; ; e s a c
  11. 依存関係: Python パッケー ジ requirements.txt による管理 バー ジョンまで明示的に指定 a r

    r o w = = 0 . 1 0 . 0 . . . pyup.io 等のツー ルで自動メンテナンス、 自動更新、 自動テスト
  12. 依存関係: システムパッケー ジ (Dockerfile) Best practices for writing Dockerfile に準拠する

    Ubuntu の場合は - - n o - i n s t a l l - r e c o m m e n d s オプションを 指定 バー ジョンまで明示的に指定する ( べき等性の担保) F R O M u b u n t u : x e n i a l - 2 0 1 7 0 7 1 0 . . . R U N a p t - g e t i n s t a l l - - n o - i n s t a l l - r e c o m m e n d s - y \ a p t - u t i l s = 1 . 2 . 2 4 \ a u t o c o n f = 2 . 6 9 - 9 \ . . . CI の定時ビルドによりパッケー ジの更新をいち早く発見 hadolint で lint かけるのが楽 pyup.io みたいなの欲しい・・・
  13. 設定とバックエンドサー ビス バックエンドやアプリケー ションの挙動はすべて環境変数で指定可 能にし、 ポー タブルな状態にする 各フレー ムワー クのサー

    ドパー ティー 製ライブラリー として公開さ れています django‑environ rails_12factor by herok D A T A B A S E S = { ' d e f a u l t ' : e n v . d b ( d e f a u l t = ' s q l i t e : / / / . . . ' ) , } 環境変数が指定されていない場合は SQLite などロー カルで動作 環境変数を指定すると指定された DB ( m y s q l : / / 等) を参照
  14. AWS ネイティブなバックエンドのロー カル起 動、 及びテスト ロー カル起動やテストでは moto を利用する Kinesis

    Firehose, DynamoDB (v2) 等で利用 他にも DynamoDB Local が AWS から提供されている