アプリケーションコードを書くことは、ほとんどのクラウドソリューションよりも前にありました。この不協和音を処理するために、12ファクタアプリの方法論が浮上しています。
12の要因は、プログラマがクラウドを介してデプロイされた明確な契約を使用して、宣言的な方法で現代のアプリを書くのに役立つアプローこの記事では、12ファクタアプリの方法論を紹介し、その原則の高レベルの要約を提供します。
この記事では、私は12ファクタアプリの方法論を紹介し、その原則の高レベルの要約を提供します。12ファクタアプリの方法論とは何ですか?
2012年、Herokuのプログラマーは12ファクタアプリの方法論をデビューさせました。 これらのプログラマーは、SaaSアプリを”野生で”見た経験に基づいて、この方法論を書いた何百ものアプリを開発し、展開してきました。
このグループは、方法論を三角測量とみなしています。
- アプリ開発をサポートするための理想的なプラクティス
- アプリが有機的に成長すると:
- ソフトウェア侵食コストを回避するために
- 彼らは現代のアプリ開発で観察した体系的な問題の意識を高めるために
グループは、プロの開発者Martin Fowlerによるエンタープライズアプリケーションアーキテクチャとリファクタリングのパターンの二つのインスピレーション源を指摘している。そして今、私は12の要因のそれぞれを紹介します。
原則I.Codebase
“リビジョン管理で追跡された一つのコードベース、多くのデプロイ”
コードベースには、理解しやすい論理的なバージ
すべてのデプロイメントには、複数の環境にデプロイできる独自のコードリポジトリが必要です。 複数のアプリケーションを同じリポジトリに格納することは避けてください。 これにより、バージョン管理を理解することはほとんど不可能になり、バージョンが絡み合って付加価値のない作業が発生します。
原則II.Dependencies
“明示的に依存関係を宣言し、分離する”
この原則は、システム全体のパッケージの暗黙的な存在に頼るべきではないことを保 代わりに”
- アプリ固有のライブラリが利用可能であることを確認してください
- OSへの砲撃を確認してください
- curlやImageMagickなどの必要なシステ (これらが将来アプリが実行される可能性のあるすべてのシステムに存在するという保証はありません。)
全体的に、12ファクタアプリは自己含有でなければなりません。 ホストマシンにインストールされている競合するライブラリとの相互作用を避けるために、アプリケーションは十分に分離する必要があります。
例を見てみましょう。 Pythonでは、それぞれPipとVirtualenvを使用して宣言と分離を実現できます。 この原則を満たすには、常に依存関係の宣言と分離の両方を使用する必要があります。 外部ソースからではなく、アプリケーション内の依存関係を管理します。 依存関係は、アプリ内のリポジトリでホストされる必要があります
原則III.Config
“環境にconfigを保存する”
アプリケーションとその設定は完全に独立している必要があります。 さらに、configsをコードに常に格納することは完全に避けるべきです。
構成には別のファイルが必要であり、コードリポジトリ内でホストされるべきではありません。 別の設定ファイルを使用すると、実際のコードベースに触れることなく設定値を簡単に更新できるため、特定の設定値を変更したときにアプリケーションを再配置する必要がなくなります。
設定が環境ではなく、アプリにある場合、変数として、ソースコードに触れることなく簡単に別の環境に移動することができます。 Twelve-factorアプリは設定を変数として保存し、誤って”リポジトリにチェックインされる可能性は低い”ようにします。 別のボーナス:あなたの設定は言語とOSとは独立しています。
原則IV.バッキングサービス
“バッキングサービスを添付リソースとして扱う”
12ファクタアプリでは、コアアプリをサポートしていないサー これらの非コア必須サービスには、
- データベース
- 外部ストレージ
- メッセージキュー
- などが含まれます。
これらはリソースとして扱うことができます。 これらは、HTTPまたは同様の要求を介してサービスとしてアクセスし、設定で指定する必要があります。 このようにして、アプリのコアコードに影響を与えることなく、サービスのソースを変更できます。たとえば、メッセージキューシステムを使用するアプリは、構成情報を変更するだけでRabbitMQからZeroMQからActiveMQに簡単に変更できる場合に最適です。
原則V.ビルド、リリース、実行
“ビルドと実行のステージを厳密に分離する”
12ファクタアプリは、ビルド、リリース、および実行の三段階を分離
アプリをソース管理に保存してビルドプロセスを開始し、その依存関係をビルドします。 構成情報を分離すると、リリースステージのビルドと組み合わせることができ、実行ステージの準備が整います。 また、各リリースに一意のIDがあることも重要です。
原則VI.Processes
“アプリケーションを一つ以上のステートレスなプロセスとして実行する”
データベースなどのステートフルなバッキングサービ アイデアは、プロセスがステートレスであり、絶対に何も共有しないということです。
多くの開発者は”スティッキーセッション”に慣れていますが、次の要求が同じサービスからのものであることを期待してセッションに情報を保存す
原則VII.ポートバインドの原則
“ポートバインド経由でサービスをエクスポート”
12ファクタアプリは、常に追加のアプリケーションから独立していなければなりません。 すべての機能は、完全に分離された独自のプロセスでなければなりません。
従来の環境では、異なるプロセスが異なる機能を処理すると仮定しています。 そのため、これらの機能はHTTPなどのwebプロトコルを介して利用可能であるとさらに想定するのは簡単で、ApacheやTomcatなどのwebサーバーの背後でアプリが実 しかし、これは12因子の方法論に反しています。代わりに、webサーバーライブラリなどをコアアプリに追加します。 これは、アプリがHTTPまたは別のプロトコルであるかどうかにかかわらず、定義されたポートで要求を待つことができることを意味します。
原則VIII.並行性
“プロセスモデルを介してスケールアウト”
真の12ファクタアプリはスケーリングのために設計されています。 クラウドでのスケーリングがシームレスになるようにアプリケーションを構築します。 同時にアプリを開発するときは、新しいインスタンスをクラウドに簡単にスピンアップできます。容量を増やす(追加のマシンで追加のプロセスを開始する)には、アプリはローカルマシン上のメモリやCPUを増やす代わりに、インスタンスを追加で
原則IX。 Disposability
“高速起動と優雅なシャットダウンで堅牢性を最大化する”
disposableプロセスの概念は、アプリケーションがいつでも死ぬことができますが、ユーザーには影響しないことを意味します—アプリは他のアプリに置き換えたり、すぐに再び起動したりすることができます。 アプリにディスポーザビリティを構築することで、アプリが正常にシャットダウンされるようになります。このように設計すると、アプリはすぐに再びバックアップされます。
同様に、プロセスが終了すると、現在の要求を終了し、着信要求を拒否して終了する必要があります。
原則X.Dev/prodパリティ
“開発、ステージング、および本番環境を可能な限り類似させておく”
開発および本番環境にデプロイされたアプ 基本的に、両方の展開の間にはわずかな違いしかないはずです。
大きな違いは、開発コードと本番コードの間の意図しない互換性の問題につながる可能性があります。 12ファクタアプリを構築する場合、devとprodの間のバッキングサービスは同じでなければなりません; ここでの違いは、ラインの下に重要な問題を引き起こす可能性があります。
Principle XI.Logs
“ログをイベントストリームとして扱う”
ログ情報をファイルに保存するモノリシックで伝統的なアプリとは異なり、この原則は、ログを選択した場所にストリームする必要があることを維持しています。単にログファイルにダンプするのではなく、ログを選択した場所にストリームする必要があります。
通常、ログは書き込みのたびにクラウドベースの環境内の同じ場所に存在しません。 新しいプロセスが開始されたり、アプリがクラッシュしたりすると、ログは複数のクラウドマシンに分散されます。
この問題を解決するには、ログをストリームするための共通の場所に名前を付けます。 場合によっては、単にStdoutをファイルにリダイレクトすることができます。 ただし、おそらく、Fluentdのようなログルーターを展開し、ログをHadoopまたはSplunkのような特定のサービスに保存することをお勧めします。
Principle XII.Admin processes
“管理/管理タスクを一回限りのプロセスとして実行する”
最後の12要素アプリケーションの原則では、管理タスクをアプリの残りの部分から分離することが提案されています。 これらのタスクには、データベースの移行やレコードの検査が含まれます。管理プロセスは別々ですが、同じ環境で、アプリ自体の基本コードと設定に対して実行し続ける必要があります。
管理プロセスは別々ですが、同じ環境で実 アプリケーションと一緒に管理タスクコードを出荷することで、ドリフトを防止します。
関連する読書
- BMC DevOpsブログ
- アジャイル対ウォーターフォールSdlc:違いは何ですか?
- ソフトウェアエンジニアリングにおける展開パイプライン(CI/CD)
- Extreme Programming(XP)とは何ですか?
- どのように&なぜソフトウェア工場になるために
- プログラミングのためのトップ会議&ソフトウェア開発