はじめに
AWS re:Invent 2024で、AmazonのCTOであるDr. Werner Vogelsは、キーノートにおいて「Simplexity(シンプレクシティ)」を発表し、システム設計における複雑性の管理について6つの教訓を紹介しました。
今回はその教訓に基づいて、システム構築や運用においてどのようなことを考えなければいけないのか、またWell-Architected Frameworkへの対応について整理してみました。
6つの教訓
まずはそれぞれの教訓とはどのようなものかについて説明します。
-
進化可能性を要件とする
システムは将来的な変更や拡張に対応できるように設計する必要があります。これにより、新たな機能追加や技術の進化に柔軟に対応でき、長期的な維持管理が容易になります。 -
複雑性を分割する
システムの複雑な部分を小さな部分に分割し、それぞれを独立して管理・開発します。 これにより、各部分の理解と管理が容易になり、全体の品質と信頼性が向上します。 -
組織をアーキテクチャに合わせる
組織の構造をシステムのアーキテクチャに合わせることで、効率的な開発と運用が可能になります。 例えば、マイクロサービスアーキテクチャを採用する場合、各サービスに対応するチームを編成することで、責任範囲が明確になり、迅速な対応が可能となります。 -
セルベースの構成にする
システムを独立したセル(単位)に分割し、各セルが他のセルから独立して機能するように設計します。 これにより、障害が発生した際の影響範囲を限定し、全体の信頼性を向上させることができます。 -
予測可能なシステムを設計する
システムの動作が予測可能であることは、ユーザーの信頼を得るために重要です。 一貫したパフォーマンスや安定性を持つシステムを設計することで、ユーザーは安心して利用することができます。 -
複雑性を自動化する
システムの複雑な部分を自動化することで、人的ミスを減らし、効率的な運用が可能になります。 例えば、インフラのコード化や自動デプロイメント、テストの自動化などを導入することで、運用負荷を軽減し、品質を向上させることができます。
教訓から学ぶエンジニアの対応方針とWell-Architected Frameworkの関係
- 進化可能性を要件とする
- システムをモジュール化し、各コンポーネントが独立して変更・拡張できるように設計する
- IaCを採用し、バージョン管理や自動デプロイを可能にすることで、将来的な変更に柔軟に対応する
- CI/CDを実践し、自動化されたテストとデプロイメントパイプラインを構築する
対応するW-A
- 運用上の優秀性 : 運用手順のコード化と自動化、変更管理の実施、継続的な改善の推進
- 信頼性: 変更管理と自動化されたリカバリ手順の実装
- パフォーマンス効率: 新しい技術の評価と効率的なリソースの使用
2.複雑性を分割する
- マイクロサービスアーキテクチャを導入し、システムを小さなサービスに分割する
- 各サービス間のインターフェースを明確に定義し、依存関係を最小限に抑える
- ドメイン駆動設計(DDD)を活用し、ビジネスドメインに基づいてシステムを分割する
対応するW-A
- 運用上の優秀性: 運用手順のコード化と自動化、およびチームの責任範囲の明確化
- 信頼性: 障害の影響を最小限に抑えるためのシステム分割と設計
- パフォーマンス効率: 効率的なリソースの使用とスケーラビリティの確保
3.組織をアーキテクチャに合わせる
- DevOps文化を醸成し、開発チームと運用チームの連携を強化する
- クロスファンクショナルチームを編成し、各チームが特定のサービスやコンポーネントの全責任を持つ体制を構築する
- 定期的に組織とアーキテクチャの評価を行い、必要に応じて再編成する
対応するW-A
- 運用上の優秀性: チームの責任範囲の明確化と運用手順の標準化
- 信頼性: 組織構造とシステム設計の整合性確保
- セキュリティ: 責任の明確化とアクセス管理の適切な実施
4.セルベースの構成にする
- セルアーキテクチャを採用し、システムを独立したユニットに分割し、障害時の影響範囲を限定する
- 各セルが他のセルから独立して機能できるように設計し、全体の信頼性を向上させる
- 需要に応じて各セルを個別にスケールアップ/スケールアウトできるようにし、リソースの最適化を図る
対応するW-A
- 信頼性: バルクヘッドアーキテクチャを使用して影響範囲を制限することで、障害の分離を強化し、システム全体の信頼性を向上させる
- パフォーマンス効率: リソースのスケーリングと最適化を行い、需要に応じて効率的にリソースを使用する
- 運用上の優秀性: 運用手順のコード化と自動化、チームの責任範囲の明確化を推進する
5.予測可能なシステムを設計する
- 使用する技術やプロセスを標準化し、システムの一貫性と予測可能性を高める
- システムのパフォーマンスやエラーログを継続的に監視し、異常を早期に検知・対応する
- 将来の負荷増加を予測し、適切なリソース計画を立てることで、システムの安定性を維持する
対応するW-A
- 信頼性: システムのモニタリングと障害からの回復手順の実装により、システムの安定性と予測可能性を確保する
- パフォーマンス効率: リソースのモニタリングとスケーリングにより、需要の変化に対応し、効率的なリソース使用を実現する
- 運用上の優秀性: 運用手順の標準化と自動化により、プロセスの一貫性と予測可能性を向上させる
6.複雑性を自動化する
- EKSやECSなどのオーケストレーションツールを活用して、デプロイやスケーリングの自動化を実現する
- TerraformやCloudFormationを利用して、インフラ構築の自動化と再現性を確保する
- CI/CDパイプラインを構築し、コードの品質保証と迅速なリリースを可能にする
対応するW-A
- 運用上の優秀性: 運用手順のコード化と自動化により、運用効率と信頼性を向上させる
- セキュリティ: セキュリティのベストプラクティスを自動化することで、スケール機能を改善し、安全に、より速く、より費用対効果の高いスケールを可能とする
- 信頼性: 自動化されたリカバリ手順の実装により、障害からの迅速な回復を可能とする
まとめ
6つの教訓から対応すべき方針をあらためて認識するとともに、Well-Architected Frameworkのベストプラクティスを照らし合わせることでシステムの複雑性を効果的に管理し、信頼性と拡張性の高いシステム構築へとつながるのではないでしょうか?