ストラングラーフィグパターン - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

ストラングラーフィグパターン

Intent

strangler fig パターンは、モノリシックアプリケーションをマイクロサービスアーキテクチャに段階的に移行するのに役立ちます。これにより、トランスフォーメーションリスクとビジネスの中断が軽減されます。

導入する理由

モノリシックアプリケーションは、1 つのプロセスまたはコンテナ内でほとんどの機能を提供するように開発されています。コードは緊密に結合されています。そのため、アプリケーションの変更には、リグレッションの問題を回避するための徹底的な再テストが必要です。変更は単独でテストできず、サイクル時間に影響します。アプリケーションがより多くの機能で強化されるため、複雑さが増すと、メンテナンスに費やす時間が長くなり、市場投入までの時間が長くなり、その結果、製品のイノベーションが遅くなる可能性があります。

アプリケーションのサイズが大きくなると、チームの認識的負荷が増加し、チームの所有権の境界が不明確になる可能性があります。負荷に基づいて個々の機能をスケーリングすることはできません。ピーク負荷をサポートするためにアプリケーション全体をスケーリングする必要があります。システムが古くなると、テクノロジーが古くなり、サポートコストが上昇する可能性があります。モノリシックでレガシーなアプリケーションは、開発時に利用可能だったベストプラクティスに従っており、配布するように設計されていません。

モノリシックアプリケーションをマイクロサービスアーキテクチャに移行すると、より小さなコンポーネントに分割できます。これらのコンポーネントは、個別にスケーリングでき、個別にリリースでき、個々のチームが所有することができます。これにより、変更がローカライズされ、迅速にテストおよびリリースできるため、変更の速度が向上します。コンポーネントは疎結合されており、個別にデプロイできるため、変更の影響範囲は小さくなります。

コードを書き換えたりリファクタリングしたりしてモノリスをマイクロサービスアプリケーションに完全に置き換えることは、多大な負担と大きなリスクです。モノリスが 1 回のオペレーションで移行される大規模な移行は、トランスフォーメーションリスクとビジネスの中断をもたらします。アプリケーションがリファクタリングされている間は、新機能を追加することは非常に困難または不可能です。

この問題を解決する 1 つの方法は、Martin Fowler によって導入された strangler fig パターンを使用することです。このパターンでは、機能を徐々に抽出し、既存のシステムを中心に新しいアプリケーションを作成することで、マイクロサービスに移行します。モノリスの機能は徐々にマイクロサービスに置き換えられ、アプリケーションユーザーは新しく移行された機能を徐々に使用できます。すべての機能が新しいシステムに移動されると、モノリシックアプリケーションを安全に廃止できます。

適用対象

以下の場合は、strangler fig パターンを使用します。

  • モノリシックアプリケーションをマイクロサービスアーキテクチャに徐々に移行したい。

  • モノリスのサイズと複雑さのため、大きなバング移行アプローチはリスクがあります。

  • 企業は新機能を追加したいと考えているため、変換が完了するまで待つことはできません。

  • エンドユーザーは、変換中に最小限の影響を受けている必要があります。

問題点と考慮事項

  • コードベースアクセス: strangler fig パターンを実装するには、モノリスアプリケーションのコードベースにアクセスできる必要があります。機能がモノリスから移行されるため、コードの軽微な変更を行い、モノリス内に破損防止レイヤーを実装して、呼び出しを新しいマイクロサービスにルーティングする必要があります。コードベースアクセスなしで呼び出しを傍受することはできません。コードベースアクセスは受信リクエストのリダイレクトにも重要です。プロキシレイヤーが移行された機能の呼び出しを傍受してマイクロサービスにルーティングできるように、一部のコードリファクタリングが必要になる場合があります。

  • 不明瞭なドメイン: 特にドメインが明確でなく、サービス境界が間違っている場合、システムの早期分解にはコストがかかる可能性があります。ドメイン駆動型設計 (DDD) はドメインを理解するためのメカニズムであり、イベントストーミングはドメインの境界を決定するための手法です。

  • マイクロサービスの識別: マイクロサービスを識別するための主要なツールDDDとして を使用できます。マイクロサービスを識別するには、サービスクラス間の自然な分割を探します。多くの サービスは独自のデータアクセスオブジェクトを所有し、簡単に分離できます。関連するビジネスロジックを持つサービスと、依存関係がない、またはほとんどないクラスは、マイクロサービスの候補として適しています。モノリスを分解する前にコードをリファクタリングして、密結合を防ぐことができます。また、コンプライアンス要件、リリース頻度、チームの地理的位置、スケーリングのニーズ、ユースケース駆動型のテクノロジーのニーズ、チームの認識的負荷も考慮する必要があります。

  • 破損防止レイヤー: 移行プロセス中に、モノリス内の機能がマイクロサービスとして移行された機能を呼び出す必要がある場合は、各呼び出しを適切なマイクロサービスにルーティングする破損防止レイヤー (ACL) を実装する必要があります。モノリス内の既存の発信者を切り離して変更を防ぐために、 ACLは、呼び出しを新しいインターフェイスに変換するアダプターまたはファサードとして機能します。これは、このガイドの前半のACLパターンの実装セクションで詳しく説明されています。

  • プロキシレイヤーの障害: 移行中、プロキシレイヤーはモノリシックアプリケーションに送信されるリクエストをインターセプトし、レガシーシステムまたは新しいシステムにルーティングします。ただし、このプロキシレイヤーは単一障害点またはパフォーマンスのボトルネックになる可能性があります。

  • アプリケーションの複雑さ: 大きなモノリスは、strangler fig パターンから最もメリットがあります。完全なリファクタリングの複雑さが低い小規模なアプリケーションでは、移行するのではなく、マイクロサービスアーキテクチャでアプリケーションを書き換える方が効率的かもしれません。

  • サービスインタラクション: マイクロサービスは同期的にまたは非同期的に通信できます。同期通信が必要な場合は、タイムアウトによって接続またはスレッドプールが消費され、アプリケーションのパフォーマンスの問題が発生する可能性があるかどうかを検討してください。このような場合は、サーキットブレーカーパターンを使用して、長期間失敗する可能性が高いオペレーションの即時失敗を返します。非同期通信は、イベントとメッセージングキューを使用して実現できます。

  • データ集約: マイクロサービスアーキテクチャでは、データはデータベース全体に分散されます。データ集約が必要な場合は、フロントエンドAWS AppSyncで を使用するか、バックエンドでコマンドクエリ責任の分離 (CQRS) パターンを使用できます。

  • データ整合性: マイクロサービスはデータストアを所有しており、モノリシックアプリケーションはこのデータを使用することもできます。共有を有効にするには、キューとエージェントを使用して、新しいマイクロサービスのデータストアをモノリシックアプリケーションのデータベースと同期できます。ただし、これにより 2 つのデータストア間でデータの冗長性と結果整合性が生じる可能性があるため、データレイクなどの長期的なソリューションを確立するまでは、戦術的なソリューションとして扱うことをお勧めします。

実装

strangler fig パターンでは、特定の機能を一度に 1 つのコンポーネントである新しいサービスまたはアプリケーションに置き換えます。プロキシレイヤーは、モノリシックアプリケーションへのリクエストをインターセプトし、レガシーシステムまたは新しいシステムにルーティングします。プロキシレイヤーはユーザーを正しいアプリケーションにルーティングするため、モノリスが引き続き機能するようにしながら、新しいシステムに機能を追加できます。新しいシステムは、古いシステムのすべての機能を最終的に置き換え、廃止することができます。

高レベルのアーキテクチャ

次の図では、モノリシックアプリケーションには、ユーザーサービス、カートサービス、アカウントサービスの 3 つのサービスがあります。カートサービスはユーザーサービスに依存し、アプリケーションはモノリシックリレーショナルデータベースを使用します。

3 つのサービスを持つモノリシックアプリケーション。

最初のステップでは、ストアフロント UI とモノリシックアプリケーションの間にプロキシレイヤーを追加します。開始時、プロキシはすべてのトラフィックをモノリシックアプリケーションにルーティングします。

モノリシックアプリケーションへのプロキシの追加。

アプリケーションに新しい機能を追加する場合は、既存のモノリスに機能を追加するのではなく、新しいマイクロサービスとして実装します。ただし、アプリケーションの安定性を確保するために、モノリスのバグを引き続き修正します。次の図では、プロキシレイヤーは、 API に基づいてモノリスまたは新しいマイクロサービスに呼び出しをルーティングしますURL。

モノリスまたは新しいマイクロサービスへのプロキシルーティング呼び出し。

破損防止レイヤーの追加

次のアーキテクチャでは、ユーザーサービスはマイクロサービスに移行されています。カートサービスはユーザーサービスを呼び出しますが、実装はモノリス内で使用できなくなりました。また、新しく移行されたサービスのインターフェイスは、モノリシックアプリケーション内の以前のインターフェイスと一致しない場合があります。これらの変更に対処するには、 を実装しますACL。移行プロセス中に、モノリス内の機能がマイクロサービスとして移行された機能を呼び出す必要がある場合、 は呼び出しを新しいインターフェイスACLに変換し、適切なマイクロサービスにルーティングします。

ACL を追加して、新しいインターフェイスへの呼び出しを変換します。

モノリシックアプリケーションACL内には、移行されたサービスに固有のクラスとして を実装できます。たとえば、 UserServiceFacadeや などですUserServiceAdapter。すべての依存サービスがマイクロサービスアーキテクチャに移行されたら、 を廃止ACLする必要があります。

を使用する場合ACL、カートサービスはモノリス内でユーザーサービスを呼び出し、ユーザーサービスは を介してマイクロサービスに呼び出しをリダイレクトしますACL。カートサービスは、マイクロサービスの移行を認識せずにユーザーサービスを呼び出す必要があります。この疎結合は、リグレッションとビジネスの中断を減らすために必要です。

データ同期の処理

ベストプラクティスとして、マイクロサービスはデータを所有する必要があります。ユーザーサービスは、独自のデータストアにデータを保存します。レポートなどの依存関係を処理し、マイクロサービスに直接アクセスする準備ができていないダウンストリームアプリケーションをサポートするために、データをモノリシックデータベースと同期する必要がある場合があります。モノリシックアプリケーションでは、まだマイクロサービスに移行されていない他の関数やコンポーネントのデータが必要になる場合もあります。したがって、新しいマイクロサービスとモノリスの間でデータ同期が必要です。データを同期するには、次の図に示すように、ユーザーマイクロサービスとモノリシックデータベースの間に同期エージェントを導入できます。ユーザーマイクロサービスは、データベースが更新されるたびにイベントをキューに送信します。同期エージェントはキューをリッスンし、モノリシックデータベースを継続的に更新します。モノリシックデータベース内のデータは、同期されるデータに対して結果整合性があります。

同期エージェントを追加します。

追加サービスの移行

カートサービスがモノリシックアプリケーションから移行されると、そのコードは新しいサービスを直接呼び出すように改訂されるため、 はそれらの呼び出しをルーティングACLしなくなります。このアーキテクチャを以下に図で示します。

追加の サービスの移行。

次の図は、すべてのサービスがモノリスから移行され、モノリスのスケルトンのみが残っている最終的なストラング状態を示しています。履歴データは、個々のサービスが所有するデータストアに移行できます。は削除ACLでき、モノリスはこの段階で廃止される準備ができています。

すべてのサービスの移行後の最終的なストラング状態。

次の図は、モノリシックアプリケーションが廃止された後の最終的なアーキテクチャを示しています。個々のマイクロサービスは、リソースベース URL ( などhttp://www.storefront.com/user) またはアプリケーションの要件に基づいて独自のドメイン ( などhttp://user.storefront.com) でホストできます。ホスト名とパスを使用してアップストリームコンシューマーHTTPAPIsに公開する主な方法の詳細については、API「ルーティングパターン」セクションを参照してください。

モノリスを廃止した後の最終アーキテクチャ。

AWS のサービスを使用した実装

Gateway をアプリケーションプロキシAPIとして使用する

次の図は、モノリシックアプリケーションの初期状態を示しています。戦略 AWS を使用して lift-and-shift に移行されたと仮定して、Amazon Elastic Compute Cloud (Amazon EC2) インスタンスで実行され、Amazon Relational Database Service (Amazon RDS) データベースを使用しているとします。わかりやすくするために、アーキテクチャでは 1 つのプライベートサブネットと 1 つのパブリックサブネットを持つ 1 つの仮想プライベートクラウド (VPC) が使用されており、マイクロサービスが最初に同じ 内にデプロイされると仮定します AWS アカウント。(本番環境のベストプラクティスは、マルチアカウントアーキテクチャを使用してデプロイの独立性を確保することです)。EC2 インスタンスはパブリックサブネットの単一のアベイラビリティーゾーンに存在し、RDSインスタンスはプライベートサブネットの単一のアベイラビリティーゾーンにあります。Amazon Simple Storage Service (Amazon S3) は、ウェブサイトの JavaScript、CSS、React ファイルなどの静的アセットを保存します。

strangler fig パターンを使用する場合のモノリシックアプリケーションの初期状態。

次のアーキテクチャでは、 はモノリシックアプリケーションの前に Amazon API GatewayAWS Migration Hub Refactor Spacesデプロイします。Refactor Spaces はアカウント内にリファクタリングインフラストラクチャを作成し、APIGateway はモノリスへの呼び出しをルーティングするためのプロキシレイヤーとして機能します。初期状態では、すべての呼び出しはプロキシレイヤーを介してモノリシックアプリケーションにルーティングされます。前述のように、プロキシレイヤーは単一障害点になる可能性があります。ただし、APIゲートウェイをプロキシとして使用すると、サーバーレスのマルチ AZ サービスであるため、リスクを軽減できます。

API Gateway を使用した strangler fig パターンの実装。

ユーザーサービスは Lambda 関数に移行され、Amazon DynamoDB データベースはそのデータを保存します。Lambda サービスエンドポイントとデフォルトルートがリファクタリングスペースに追加され、呼び出しを Lambda 関数にルーティングするようにAPIゲートウェイが自動的に設定されます。実装の詳細については、「反復アプリケーションモダナイゼーションワークショップ」の「モジュール 2」を参照してください。

API Gateway を使用したstrangler fig パターンの実装: ルーティングの設定。

次の図では、カートサービスもモノリスから Lambda 関数に移行されています。ルートとサービスエンドポイントがリファクタリングスペースに追加され、トラフィックは自動的に Cart Lambda 関数にカットオーバーされます。Lambda 関数のデータストアは Amazon ElastiCache によって管理されます。モノリシックアプリケーションは、Amazon RDS データベースとともにEC2インスタンスに残ります。

strangler fig パターンを使用してモノリスからサービスを移動します。

次の図では、最後のサービス (アカウント) がモノリスから Lambda 関数に移行されています。元の Amazon RDS データベースを引き続き使用します。新しいアーキテクチャでは、データベースが分離された 3 つのマイクロサービスが追加されました。各サービスは異なるタイプのデータベースを使用します。マイクロサービスの特定のニーズを満たすために専用データベースを使用するこの概念は、ポリグスロット永続性と呼ばれます。Lambda 関数は、ユースケースによって決定されるさまざまなプログラミング言語で実装することもできます。リファクタリング中、リファクタリングスペースは、トラフィックのカットオーバーと Lambda へのルーティングを自動化します。これにより、ビルダーがルーティングインフラストラクチャを設計、デプロイ、設定するために必要な時間を節約できます。

strangler fig パターンを使用して、モノリスからすべてのサービスを移動します。

複数のアカウントの使用

前の実装では、モノリシックアプリケーションにプライベートサブネットとパブリックサブネットVPCを持つ単一の を使用し、シンプルにするために同じ AWS アカウント 内にマイクロサービスをデプロイしました。ただし、マイクロサービスがデプロイの独立性 AWS アカウント のために複数の にデプロイされることがよくある実際のシナリオでは、このようなケースはほとんどありません。マルチアカウント構造では、モノリスから異なるアカウントの新しいサービスへのトラフィックのルーティングを設定する必要があります。

リファクタリングスペースは、モノリシックアプリケーションからAPIコールをルーティングするための AWS インフラストラクチャの作成と設定に役立ちます。Refactor Spaces は、アプリケーションリソースの一部として、アカウント AWS 内の API GatewayNetwork Load Balancer、およびリソースベースの AWS Identity and Access Management (IAM) ポリシーを調整します。1 つのアカウント AWS アカウント または複数のアカウントにまたがる新しいサービスを外部HTTPエンドポイントに透過的に追加できます。これらのリソースはすべて 内でオーケストレーション AWS アカウント され、デプロイ後にカスタマイズして設定できます。

次の図に示すように、ユーザーサービスとカートサービスが 2 つの異なるアカウントにデプロイされていると仮定します。リファクタリングスペースを使用する場合は、サービスエンドポイントとルートを設定するだけで済みます。リファクタリングスペースは、APIGateway-Lambda 統合と Lambda リソースポリシーの作成を自動化するため、モノリスから安全にサービスをリファクタリングすることに集中できます。

でストラングラー fig パターンを実装します AWS Migration Hub Refactor Spaces。

リファクタリングスペースの使用に関するビデオチュートリアルについては、「 でのリファクタリングアプリの増分 AWS Migration Hub Refactor Spaces」を参照してください。

ワークショップ

ブログの参考情報

関連情報