App の一覧 I. コードベース バージョン管理されている1つのコードベースと複数のデプロイ II. 依存関係 依存関係を明示的に宣言し分離する III. 設定 設定を環境変数に格納する IV. バックエンドサービス バックエンドサービスをアタッチされたリソースとして扱う V. ビルド、リリース、実行 ビルド、リリース、実行の3つのステージを厳密に分離する VI. プロセス アプリケーションを1つもしくは複数のステートレスなプロセスとして実行する VII. ポートバインディング ポートバインディングを通してサービスを公開する VIII. 並行性 プロセスモデルによってスケールアウトする IX. 廃棄容易性 高速な起動とグレースフルシャットダウンで堅牢性を最大化する X. 開発/本番一致 開発、ステージング、本番環境をできるだけ一致させた状態を保つ XI. ログ ログをイベントストリームとして扱う XII. 管理プロセス 管理タスクを1回限りのプロセスとして実行する 出典:https://12factor.net/ja/
App × AWS I. コードベース II. 依存関係 III. 設定 IV. バックエンドサービス V. ビルド、リリース、実行 VI. プロセス VII. ポートバインディング VIII. 並行性 IX. 廃棄容易性 X. 開発/本番一致 XI. ログ XII. 管理プロセス 出典:https://12factor.net/ja/ CloudWatch Logs Auto Scaling Code Commit Code Artifact Parameter Store Secrets Manager Code Build / Deploy / Pipeline
12FAがあるアプリケーションの例 e.g. 設定を外部のパラメータ管理から環境変数で取得 The Twelve-Factor App の例 • スケールアウトしたインスタンスからもセッション データを取得可能。スケールアウトが容易に • スティッキーセッションが不要 • 接続先が変わってもアプリのコードは修正不要 • 環境の設定値を一カ所で管理 • シークレット値(APIキー等)もセキュアに保存可能 Session ID Session ID Session ID Client Instance A Instance B app app IdをKeyに データ取得 Secrets Manager Parameter Store *1 ElastiCache DynamoDB IdをKeyに データ取得 環境変数 (*1) 正式にはSystems Managerですが省略しています or or
コードベース II. 依存関係 III. 設定 IV. バックエンドサービス V. ビルド、リリース、実行 VI. プロセス VII. ポートバインディング VIII. 並行性 IX. 廃棄容易性 X. 開発/本番一致 XI. ログ XII. 管理プロセス 出典:https://12factor.net/ja/ 1 2 3 CloudWatch Logs Auto Scaling Code Commit Code Artifact Parameter Store Secrets Manager Code Build / Deploy / Pipeline
VIII. 並行性 • 構成は12FAに則ったアプリケーション • 一見すると何も問題無い(むしろ良い)ように見えるが… • 例えば、内部ユーザー向けアプリケーションだったとしたら 少し違った見方ができる e.g. セッションデータを外部DBに保存 Session ID Session ID Session ID Client Instance A Instance B app app IdをKeyに データ取得 ElastiCache DynamoDB IdをKeyに データ取得 or