信頼性成熟度モデル

信頼性の取り組みは、各ステージが前のステージに基づいて構築され、システムが常に利用可能であり、ユーザーの期待を満たすようにする、段階的なプロセスです。 この成熟度モデルは、現在の状態を評価し、改善のための構造化されたパスを提供するのに役立ちます。

この基盤は、広範な最適化オーバーヘッドを伴わない即時の改善のために、ゾーン冗長性などの組み込みの Azure 信頼性機能を使用して、Azure によって提供される基本的な信頼性機能をブートストラップすることから始まります。

直感に反して、高い信頼性を実現する方法は、失敗が避けられないことを受け入れることです。 すべての問題を防ぐのではなく、問題が発生したときにシステムがどのように対応するかを計画する方が効果的です。 ビジネス要件は、どのリスクに積極的に対処する価値があるかを判断するのに役立ちます。 Teams は、構造化された可観測性を備えた高度な監視機能に投資し、障害軽減策を拡張してアプリケーション レベルの懸念事項を含め、回復性対策のテストを開始します。

次に、チームはビジネスの分析情報と技術スキルを統合します。 Teams は、正常性モデリングを実装し、障害モード分析を実施し、包括的なディザスター リカバリー計画を準備します。 この段階では、測定可能な目標と、さまざまな障害シナリオに対する体系的な準備を通じて説明責任を確保します。

システムの稼働後は、変更管理やデータの増加や運用の複雑さに対処するなど、運用環境の課題の管理に重点が置き、システムの信頼性にどのような影響が及びます。

最終的なレベルは無期限に実行され、回復力を維持することが目標です。 このレベルは、技術的な制御を超えたアーキテクチャの適応性の進化を表します。 このレベルでは、ワークロードの進化と拡大に伴い、システムが新しい予期しないリスクに耐えられるようにすることに重点を置いています。

モデルは 5 つの異なる成熟度レベルに構成され、それぞれが主な目標と一連のコア戦略を持ちます。 各レベルを調べるには、以下のタブ付きビューを使用します。 進捗する際には、強調表示されたトレードオフとそれに伴うリスクを必ず確認してください。

目標アイコン 最適化タスクに時間を費やすのではなく、ワークロードインフラストラクチャと運用における回復性の確かな基礎を確立します。

成熟度モデルのレベル 1 は、ワークロード チームがシステムの信頼性のための強力な基盤を構築できるように設計されています。 ブートストラップに焦点を当てています。これは、将来の信頼性の決定のための基本を設定するプロセスです。 この段階では、ほとんどの場合、現在のプラクティスに対するマイナーな拡張機能を使用した機能実装が含まれます。

このステージには、システムの調査、分析情報の取得、およびインベントリの作成が含まれます。 また、すぐに改善するためにゾーンの冗長性を有効にするような、Azure の組み込みの信頼性機能も使用します。

これらの基本を確立することで、信頼性成熟度モデルのレベルを進め、システムの回復性とパフォーマンスを段階的に強化するようにチームを準備できます。

主な戦略

✓ 運用責任を軽減する機会を評価する

この戦略は、基本的に ビルド と 購入または依存 のアプローチです。 この決定は、将来の開発をサポートしながら、この段階でどの程度の責任を管理できるかによって異なります。 ワークロードに関連するリソースを使用する必要がありますが、メンテナンスをオフロードする機会を常に検討する必要があります。 このアプローチを適用する従来のユース ケースをいくつか次に示します。

  • サービスとしてのプラットフォーム (PaaS) ソリューションを選択して、クラウド プラットフォームに責任をオフロードします。 レプリケーション、フェールオーバー、バックアップ ストアなど、一般的な回復性のニーズに対応する既製のソリューションを提供します。 このアプローチを使用すると、クラウド プロバイダーがホスティング、メンテナンス、回復性の向上を処理します。

    たとえば、クラウド プロバイダーは複数のコンピューティング ノードにデータをレプリケートし、レプリカを可用性ゾーンに分散します。 仮想マシン (VM) 上に独自のソリューションを構築する場合は、これらの側面を自分で管理する必要があります。これには時間がかかり、複雑になる可能性があります。

  • ワークロードのビジネス目標に直接関連付けられていない操作の責任をオフロードします。 データベース管理やセキュリティなど、一部の特殊な操作は、ワークロードの信頼性に影響する可能性があります。 経験豊富なチーム、テクノロジ、またはその両方がこれらのタスクを処理する可能性を探ります。

    たとえば、チームにデータベースの専門知識がない場合は、マネージド サービスを使用して、プロバイダーに責任を移します。 このアプローチは、チームがワークロードの機能に集中できるため、最初に役立ちます。 多くの企業は、一元管理されたサービスを共有しています。 プラットフォーム チームが使用可能な場合は、それらを使用してこれらの操作を処理します。 ただし、このアプローチでは、依存関係と組織の複雑さが増す可能性があります。

    または、チームが適切な専門知識を持っている場合は、スキルを使用し、管理機能を含まないサービスを選択することを明示的に決定できます。

  • Microsoft 以外のベンダーに責任をオフロードします。 出発点として既製の製品を選択します。 ワークロードのビジネス価値に貢献する場合にのみ、カスタマイズされたソリューションを構築します。

リスク:購入または依存オプションが要件を部分的に満たしている場合は、カスタム拡張機能の実装が必要になる場合があります。 この方法では、更新と最新化が実用的でなくなる "カスタマイズ ロックイン" 状況が発生する可能性があります。 要件を定期的に確認し、ソリューションの機能と比較します。 2 つの間に有意な偏差がある場合の出口戦略を作成します。

逆のシナリオもリスクです。 最初は 購入または依存 オプションの方が簡単に見えるかもしれませんが、PaaS サービス、ベンダー ソリューション、またはプラットフォーム所有のリソースの制限がワークロードに必要な粒度またはレベルの自律性を満たしていない場合は、後で再評価と再設計が必要になる場合があります。

✓ 重要なユーザーフローとシステムフローを特定する

この段階では、ワークロードをフローに分割することが重要です。 ユーザー フローとシステム フローに焦点を当てます。 ユーザー フローはユーザーの操作を決定し、システム フローはユーザー タスクに直接関連付けられていないワークロード コンポーネント間の通信を決定します。

たとえば、eコマース アプリケーションでは、顧客は閲覧や注文などのフロントエンド アクティビティを実行します。 一方、バックエンド トランザクションとシステムによってトリガーされるプロセスは、ユーザー要求を満たし、他のタスクを処理します。 これらの個別のフローは同じシステムの一部ですが、異なるコンポーネントを含み、さまざまな目的に対応します。

この段階でフローのカタログの作成を開始します。 ユーザーの操作とコンポーネントの通信を観察します。 フローを一覧表示して分類し、その始点と終点を定義し、依存関係をメモします。 わかりやすくするために、図を使用して結果と例外を文書化します。 このカタログは、ビジネス利害関係者との最初の会話の重要なツールとして機能し、最も重要な側面をその観点から特定できます。 この会話は、優先順位付けの第 1 レベルを通知できます。

主要なビジネス アクティビティに対するリスクと影響を評価して、フローをクリティカルとして分類します。 停止が予想される場合、グレースフル デグラデーションでは、これらの重要なフローを維持することに重点が置かれます。 eコマースの例では、重要なフローには、製品検索、カートへの項目の追加、およびチェックアウトが含まれます。これらのタスクはビジネスに不可欠であるためです。 製品データの更新や製品イメージの保守など、他のプロセスはそれほど重要ではありません。 ユーザーが製品を検索し続け、カートに項目を追加できるようにすることで、収益の損失を防ぐために、停止中も重要なフローが動作し続けられるようにします。

注

ビジネス プロセスは、時間の影響を受けなくても重要な場合があります。 時間の重要度が重要な要素です。 たとえば、監査要件を満たすことは重要なプロセスですが、監査用のデータをすぐに表示する必要がない場合があります。 プロセスは引き続き重要ですが、数時間以内の復旧が許容されるため、その信頼性は重要ではありません。

詳細については、「 Azure Well-Architected Framework: フローを使用してワークロード設計を最適化する」を参照してください。

✓ 適切な設計モデル、リソース、機能を選択する

この戦略は、次のレベルで適用する必要があります。

  • 建築: ワークロード設計では、さまざまなインフラストラクチャ レイヤーでの信頼性の期待を考慮する必要があります。 最初の決定は、アプリケーションをホストするためのコンテナー化と PaaS のどちらを選択するかです。 または、ハブアンドスポークや単一の仮想ネットワークなどのネットワーク設定を検討することもできます。

    機能に基づいてセグメント化を作成する境界も設定する必要があります。 たとえば、単一ゾーンの仮想ディスクを使用して 1 つの VM 上のすべてをホストする代わりに、コンピューティングとデータ ストレージを分割し、専用サービスを使用することを検討してください。

    注意事項

    移行シナリオでは、新しい機会を確認せずにリフト アンド シフト アプローチを採用すると、メリットと非効率性が見逃される可能性があります。 変更が困難なセットアップに行き詰まらないようにし、より優れたオプションと改善点を活用するために、最新化を早期に調査することが重要です。

  • Azure サービス: デシジョン ツリーを使用すると、設計に適したサービスを選択するのに役立ちます。 ワークロードの進化とより多くの機能の要求に応じてサービスを切り替えることができるように、現在のニーズを満たすが柔軟性を維持するコンポーネントを選択します。

  • Azure サービス内の SKU または階層: 各 SKU の機能を確認し、プラットフォームの可用性の保証を理解します。 サービスレベル アグリーメントを評価して、公開されたパーセンタイルに関連する対象範囲を理解します。

  • 信頼性をサポートする機能: コードを変更せずに単純な構成を使用して可用性を強化するには、クラウドネイティブ サービスを選択します。 オプションを理解し、ゾーンの冗長性を高めたり、セカンダリ リージョンにデータをレプリケートしたりするなどの構成を意図的に選択することが重要です。

✓ 基本レベルの冗長性を使用してデプロイする

ソリューションの各部分内で、単一インスタンスなどの単一障害点を回避します。 代わりに、冗長性のために複数のインスタンスを作成します。 Azure サービスは、多くの場合、冗長性を処理します。特に PaaS サービスでは、通常は既定でローカルの冗長性とアップグレードのオプションが含まれます。 ゾーン冗長を使用して、これらのインスタンスを複数の Azure データセンターに分散することをお勧めします。 そうでない場合は、少なくともローカルの冗長性を確保しますが、この方法ではリスクが高くなります。 今後のレベルでは、geo 冗長コンポーネントを使用してソリューションを拡張することで、信頼性要件が満たされる可能性があるかどうかを評価します。

トレードオフ: 重要なトレードオフの 1 つは、冗長性のコストの増加です。 また、クロスゾーン通信では待機時間が発生する可能性があります。 待機時間を最小限に抑える必要があるレガシ アプリケーションの場合、冗長性によってパフォーマンスが低下する可能性があります。

リスク: アプリケーションが複数インスタンス環境用に設計されていない場合は、複数のアクティブなインスタンスで問題が発生し、データが不整合になる可能性があります。 また、待機時間が短いオンプレミスのセットアップ用にアプリケーションが構築されている場合、可用性ゾーンを使用すると、パフォーマンスが低下する可能性があります。

✓ メトリック、ログ、トレースを有効にしてフローを監視する

メトリック、ログ、トレースの可視性を確保するために、Azure Monitor などのプラットフォームネイティブ ツールを選択します。 組み込みの機能を使用して、潜在的な問題のアラートを設定します。 通知を送信してアラートを取得するには、基本的なアラートが設定されている必要があります。 次のようなサービスの正常性状態の変化を示す Azure プラットフォーム機能を利用します。

インフラストラクチャとアプリケーションの両方に 対して Azure Monitor アクション グループ を設定します。

トレードオフ: より多くのログを収集するときは、増加するボリュームを管理する必要があります。これは、これらのログのストレージ関連のコストに影響します。 データ保持ポリシーを使用してデータの量を管理します。 Azure Monitor を使用して、ワークスペースに日次上限を設定します。 詳細については、「信頼性の 構成に関する推奨事項」を参照してください。

次のレイヤーで可観測性の構築を開始します。

インフラストラクチャ

まず、診断ログを有効にし、分析のためにプラットフォーム コンポーネントからネイティブ メトリックを収集します。 CPU、メモリ、入力/出力、ネットワーク アクティビティなど、リソースの使用状況に関する情報を収集します。

アプリケーション

メモリ消費量や要求の待機時間などのアプリケーション レベルのメトリックを収集し、アプリケーション アクティビティをログに記録します。 メイン アプリケーション スレッドとは別のスレッドまたはプロセスでログ記録操作を実行します。 この方法では、ログ記録によってアプリケーションのプライマリ タスクの速度が低下することはありません。

また、Application Insights の 基本的な可用性テスト も確認してください。

データ

データベースを基本的なレベルで監視するには、データベース リソースが出力する主要なメトリックを収集します。 インフラストラクチャ コンポーネントと同様に、ネットワーク メトリックなど、データ ストアのコンテキストでリソースの使用状況を追跡します。 接続がプールされる方法に関するデータを収集することは、後の段階で効率性を高めるためには重要です。

信頼性を確保するには、アクティブな接続や失敗した接続の監視などの接続メトリックを追跡することが重要です。 たとえば、Azure Cosmos DB では、要求の数が割り当てられた要求ユニットを超え、接続が失敗し始めると、429 状態コードが返されます。

✓ 障害軽減プレイブックの構築を開始する

障害の範囲は、断続的なものから、わずかに拡張された一時的な障害や致命的な停止までです。

レベル 1 では、プラットフォームの障害に焦点を当てます。 これらは制御できない場合でも、それらを処理するための戦略を持っている必要があります。 たとえば、可用性ゾーンを利用してゾーン障害に対応します。 プラットフォーム レベルで一時的な障害を予測し、ワークロードで処理します。

これらのエラーを処理するプロセスは、複雑さによって異なります。 プラットフォーム レベルの潜在的な障害、関連するリスク、軽減戦略の文書化を開始します。 この演習は主に理論的であり、後のレベルで自動化で成熟します。

エラーの可能性、影響、軽減戦略などの要因を文書化する必要があります。 ワークロードの目標に合った重要度スケールを使用します。 スケールには、次のようなものが含まれるかもしれません。

  • 高。 システムの完全な停止により、大幅な財務損失とユーザー信頼の低下が発生します。

  • ミディアム ワークロードの一部に影響し、ユーザーの不便を引き起こす一時的な中断。

  • 低。 アプリケーションの不要な機能に影響を与え、ユーザーのダウンタイムを最小限に抑える小さなソフトウェアの問題。

テンプレートの例を次に示します。

問題 リスク 情報源 深刻さ 可能性 緩和策
一時的なネットワーク障害 クライアントは、アプリケーション サーバーへの接続を失います。 Azure プラットフォーム 高 非常に可能性が高い 再試行ロジックやサーキット ブレーカーなど、クライアント側のロジックで設計パターンを使用します。
ゾーン障害 ユーザーがアプリケーションに到達できません。 Azure プラットフォーム 高 可能性が高くない すべてのコンポーネントでゾーンの回復性を有効にします。
トランスポート層セキュリティ (TLS) 証明書の有効期限 クライアントは、アプリケーションとの TLS セッションを確立できません。 人的エラー 高 あり得る 自動 TLS 証明書管理を使用します。
CPU またはメモリの使用量が定義された制限に達し、サーバーが失敗します。 要求のタイムアウト。 アプリケーション ミディアム あり得る 自動再起動を実装します。
コンポーネントは、更新中は使用できません。 ユーザーは、アプリケーションで未処理のエラーを経験しました。 デプロイまたは構成の変更 低 デプロイ中の可能性が高く、他の時点では発生しない可能性が高い クライアント側ロジックでコンポーネントを処理します。

レベル 1 では、予期しない障害ケースが常に存在するため、完全性を追求しないでください。 予期しない停止が発生した場合は、原因と軽減策をプレイブックに文書化します。 この資産は、時間の経過に伴って更新する生きたドキュメントとして扱います。

✓一時的な障害から回復するためのメカニズムを追加

クラウド環境では、一時的な障害が一般的です。 これは、再試行が通常数秒以内に解決できる短期的な問題を示します。

組み込みの SDK と構成を使用してこれらの障害を処理し、システムをアクティブに保ちます。 多くの場合、組み込みの構成が既定の設定であるため、実装を検証するためにテストが必要になる場合があります。 また、アーキテクチャの一時的な障害を処理するように設計されたパターンを実装します。 詳細については、「信頼性を サポートするアーキテクチャ設計パターン」を参照してください。

永続的な問題は、一時的ではない障害または停止の開始を示している可能性があります。 このシナリオでは、アプリケーション内のローカライズされた問題を修正するだけではありません。 これには、システムの重要なユーザーとシステムのフローを調べ、自己保存手法と回復作業を追加することが含まれます。 これらのメソッドは、レベル 2 で説明されている成熟したプラクティスです。

✓ 基本的なテストを実行する

ソフトウェア開発ライフサイクルの初期段階で基本的な信頼性テストを統合します。 単体テストから始めて、機能と構成を検証するテストを行う機会を探します。

また、リスク軽減プレイブックで特定した問題の簡単なテスト ケースを開発します。 影響が大きく、作業の軽減策が少なくなるように重点を置く。 たとえば、ネットワークの停止や断続的な接続の問題をシミュレートして、再試行ロジックによって中断がどのように解決されるかを確認します。

リスク: テストでは、多くの場合、開発サイクルに摩擦が発生します。 このリスクを軽減するには、開発タスクと共に信頼性テストを追跡できるようにします。

特徴開発が優先され、テストによって開発サイクルに摩擦が生じる可能性があります。 機能開発が完了する前に、テストを開始する方が簡単です。 最初にアプリケーションの非機能的な側面を設計すると、後で対処するために問題のバックログを構築するのではなく、機能機能を追加するときにそれらを拡張できます。 このアプローチでは、最初はより多くの労力を必要としますが、管理しやすく、後で大きな問題を回避できます。

次のステップ