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

Twelve-Factor Python (Django) Application with Docker

Kosei Kitahara
September 01, 2017

Twelve-Factor Python (Django) Application with Docker

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

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 から提供されている