node.js アプリケーションを Application Load Balancer (ALB) の背後にある相互接続されたサービスのセットとしてデプロイします。その後、ALB を使用してトラフィックをモノリスからマイクロサービスにシームレスに移行します。 構築を開始する

このプロセスは、マイクロサービスを立ち上げ、アプリケーションのトラフィックをモノリスから安全に移行させるために従うプロセスです。

アーキテクチャの概要
  1. デプロイされたモノリス
    これは開始時の構成です。Amazon ECS のコンテナで実行されているモノリシック node.js アプリです。
  2. マイクロサービスの開始
    前のモジュールで構築し、Amazon ECR にプッシュした 3 つのコンテナイメージを使用して、既存の Amazon ECS クラスターで 3 つのマイクロサービスを開始します。
  3. ターゲットグループの設定
    モジュール 2 と同様に、各サービス用にターゲットグループを追加し、ALB ルールを更新して新しいマイクロサービスに接続します。
  4. トラフィックの切り替えとモノリスのシャットダウン
    ALB 内の 1 つのルールを変更することによって、実行されているマイクロサービスへのトラフィックのルーティングが開始されます。全てが正常状態になったら、モノリスをシャットダウンします。

以下のステップバイステップ手順に従って、マイクロサービスをデプロイします。各ステップの番号をクリックして、セクションを展開してください。

break-the-monolith
  • ステップ 1: サービス用にタスク定義を記述する

    モジュール 2 で実行していたものと同じクラスターに 3 つの新しいマイクロサービスをデプロイします。モジュール 2 と同様に、各サービスに対してタスク定義を記述します。

    ⚐ 注意: タスク定義には複数のコンテナを追加することが可能であるため、3 つのマイクロサービスすべてを単一のサービス上の異なるコンテナとして実行することができます。ただし、すべてのコンテナがサービスに比例してスケールする必要が生じるため、モノリシックのままとなります。ここでの目標は 3 つの独立したサービスを持つことで、各サービスには、それぞれのサービスのためのイメージでコンテナを実行する独自のタスク定義が必要です。

    これらのタスク定義はコンソール UI で記述する、または JSON として記述して手順を迅速化することもできます。JSON ファイルとしてタスク定義を記述するには、新しい [タスク定義] 画面の最下部にある [JSON による設定] を選択してください。

    タスク定義のパラメータは以下のとおりです。

    • タスク定義名 = [service-name]
    • イメージ = [service ECR repo URL]:latest 
    • cpu= 256
    • メモリ = 256 
    • コンテナポート = 3000 
    • ホストポート = 0



    または、JSON を使用する場合は以下のようになります。

    {
        "containerDefinitions": [
            {
                "name": "[service-name]",
                "image": "[account-id].dkr.ecr.us-west-2.amazonaws.com/[service-name]:[tag]",
                "memoryReservation": "256",
                "cpu": "256",
                "essential": true,
                "portMappings": [
                    {
                        "hostPort": "0",
                        "containerPort": "3000",
                        "protocol": "tcp"
                    }
                ]
            }
        ],
        "volumes": [],
        "networkMode": "bridge",
        "placementConstraints": [],
        "family": "[service-name]"
    }

    ♻ このプロセスを繰り返して、各サービスのタスク定義を作成します。

    • posts
    • threads
    • users
  • ステップ 2: Application Load Balancer を設定する: ターゲットグループ

    モジュール 2 と同様に、各サービスにターゲットグループを設定します。ターゲットグループは、トラフィックが各サービスに正しく到達することを可能にします。

    VPC 名をチェックする: AWS CloudFormation スタックには独自の VPC があり、大抵の場合はデフォルト VPC ではありません。ターゲットグループを正しい VPC で設定することが重要です。

    • EC2 コンソールの [ロードバランサー] セクションに移動します。
    • demo という名前のロードバランサーがすでに存在しているのが確認できます。
    • チェックボックスをオンにしてロードバランサーの詳細を表示します。
    • 詳細ページの VPC 属性の値をメモします。

     

    ターゲットグループを設定する

    • EC2 コンソールの [ターゲットグループ] セクションに移動します。
    • [ターゲットグループの作成] を選択します。
    • ターゲットグループを設定します (ここで指定されていない場合はデフォルト値を変更しないでください): ターゲットグループ名 = [service-name]、プロトコル = HTTP、ポート = 80、VPC = 前のステップからのロードバランサーに一致する VPC を選択します
      • ヘルスチェックの詳細設定: 正常のしきい値 = 2、非正常のしきい値 = 2、タイムアウト = 5、間隔 = 6
    • [作成] を選択します。

     

    ♻ このプロセスを繰り返して、各サービスのターゲットグループを作成します。

    • posts
    • threads
    • users

     

    最後に 4 番目のターゲットグループを作成する

    • drop-traffic

    このターゲットグループは「ダミー」ターゲットです。これを使用して、マイクロサービスが完全に実行された後でトラフィックがモノリスに到達しないようにします。テーブルには合計で 5 つのターゲットグループがあります。

    ターゲットグループ
  • ステップ 3: リスナールールの設定

    リスナーは、トラフィックを適切にルーティングするために、ALB に送られる接続リクエストをチェックします。

    現時点では、4 つのサービス (モノリスと 3 つのマイクロサービス) が同じロードバランサーの背後で実行されています。モノリスからマイクロサービスへの移行を行うためには、トラフィックのマイクロサービスへのルーティングを開始して、モノリスへのトラフィックのルーティングを停止します。

    リスナーを開く

    • EC2 コンソールの [ロードバランサー] セクションに移動します。
    • demo という名前のロードバランサーがすでに存在しているのが確認できます。
    • チェックボックスをオンにしてロードバランサーの詳細を表示します。
    • [リスナー] タブを選択します。

     

    リスナールールを更新する

    • リスナーの [ルールの表示 / 編集] を選択します。
    • + を選択してルールを挿入します。
    • ルールの条件は以下のとおりです。
      • IF Path = /api/[service-name]* THEN Forward to [service-name]
      • 例: Path = /api/posts* forward to posts
    • 4 つの新しいルール (モノリスへのトラフィックを維持するためのルール 1 つ、および各サービスに 1 つずつ) を作成します。デフォルトを含む合計 5 つのルールができます。ルールはこの順序で追加するようにしてください。
      • api: /api* forwards to api
      • users: /api/users* forwards to users
      • threads: /api/threads* forwards to threads
      • posts: /api/posts* forwards to posts
    • ページの左上にある [戻る] 矢印を選択し、ロードバランサーコンソールに戻ります。
    リスナールールの設定
  • ステップ 4: マイクロサービスのデプロイ

    ここでは、3 つのサービスをクラスターにデプロイします。これらのステップを 3 つのサービスそれぞれに繰り返してください。

    • Amazon ECS コンソールの左側にある [クラスター] メニューに移動します。
    • クラスター BreakTheMonolith-Demo-ECSCluster を選択します。
    • [サービス] タブで [作成] を選択します。
    • サービスを設定します (デフォルト値は変更しないでください) 。タスク定義 = X の最大値を選択: [service-name]:X (X はほとんどの場合 1 にします)、サービス名 = [service-name]、タスクの数 = 1
    • [ELB の設定] を選択します。
      • ELB タイプを Application Load Balancer にします。
      • IAM ロールには BreakTheMonolith-Demo-ECSServiceRole を選択します。
      • ロードバランサー demo を選択します。
      • [ELB に追加] を選択します。
    • サービスをターゲットグループに追加します。
      • リスナーポート = 80: HTTP
      • ターゲットグループ名 = お使いのグループを選択します: [service-name]
    • [保存] を選択します。
    • [サービスの作成] を選択します。
    • [サービスを表示] をクリックします。


    すべてのサービスが開始されるまでにかかる時間はほんの数秒です。次に進む前に、すべてのサービスとタスクが実行されており、正常な状態であることを再確認してください。

    マイクロサービスのデプロイ
  • ステップ 5: トラフィックをマイクロサービスに切り替える

    現在、マイクロサービスは実行されているものの、すべてのトラフィックはまだモノリスサービスに流れています。

    リスナールーラーを更新してトラフィックをマイクロサービスに再ルーティングする:

    • EC2 コンソールの [ロードバランサー] セクションに移動します。
    • demo ロードバランサーのリスナーで [ルールの表示/編集] を選択します。
    • 最初のルール (/api* forwards to api) を削除します。
    • デフォルトのルールを forward to drop-traffic に更新します。

    ルールは以下のようになります。

    トラフィックをマイクロサービスに切り替える

    モノリスをオフにする: トラフィックがマイクロサービスに流れるようになったので、モノリスサービスをスピンダウンできます。

    • Amazon ECS クラスター「BreakTheMonolith-Demo-ECSCluster」に戻ります。
    • api サービスを選択してから [更新] を選択します。
    • タスクの数を 0 に変更します。
    • [サービスの更新] を選択します。

     

    Amazon ECS は、クラスターでサービスがデプロイしたコンテナから全ての接続をドレインしてから、コンテナを停止するようになります。約 30 秒後にデプロイメントリストまたはタスクリストを更新すると、タスクの数が 0 になっていることがわかります。このサービスはまだアクティブなので、何らかの理由でロールバックする必要がある場合は、サービスを更新するだけで追加のタスクをデプロイできます。

    • api サービスを選択してから [削除] を選択し、削除を確認します。


    これで、一切のダウンタイムなしで node.js をモノリスからマイクロサービスに完全に移行できました!

  • ステップ 6: デプロイメントを検証する

    サービス URL を見つける: これはこのチュートリアルのモジュール 2 で使用したものと同じ URL です。

    • EC2 コンソールの [ロードバランサー] セクションに移動します。
    • ロードバランサー demo-microservices を選択します。
    • DNS 名の値をコピーし、ブラウザに貼り付けます。
    • 「リクエストを受信する準備ができました」というメッセージが表示されます。

     

    各マイクロサービスの値を表示する: ALB がリクエスト URL に基づいてトラフィックをルーティングします。各サービスを表示するには、以下のようにサービス名を DNS 名の末尾に追加します。

    • http://[DNS name]/api/users
    • http://[DNS name]/api/threads
    • http://[DNS name]/api/posts
    各マイクロサービスの値を表示する

    ⚐ 注意: これらの URL は、モノリスがデプロイされた時と全く同じように機能します。このアプリに接続することが期待される API またはコンシューマーは、いずれも行われた変更の影響を受けないため、これは非常に重要です。モノリスからマイクロサービスへの移行に、インフラストラクチャの他の部分への変更は必要ありません。

    API のテストには、Postman などのツールを使用することもできます。