このモジュールでは、Amazon Elastic Container Service (Amazon ECS) を使用して、EC2 コンピューティングインスタンスのマネージドクラスターをインスタンス化し、イメージをクラスターで実行されるコンテナとしてデプロイします。構築を開始する

アーキテクチャの概要

a.クライアント
クライアントはポート 80 を介してロードバランサーにリクエストを行います。

b.ロードバランサー
ロードバランサーは、利用可能なすべてのポート全体にリクエストを分散します。

c.ターゲットグループ
インスタンスはアプリケーションのターゲットグループに登録されます。

d.コンテナポート
各コンテナは、node.js クラスターの親をその名前空間内のポート 80 に結び付ける単一のアプリケーションプロセスを実行します。

e.node.js モノリスのコンテナ化
node.js クラスターの親は、モノリシックアプリケーション内のワーカーにトラフィックを分散する役割を担います。このアーキテクチャはコンテナ化されていますが、各コンテナは残りのコンテナとまったく同じ機能を持っているため、モノリシックのままです。

Amazon Elastic Container Service (Amazon ECS) は、Docker コンテナをサポートし、Amazon EC2 インスタンスのマネージドクラスターでアプリケーションを容易に実行することを可能にする、拡張性の高い高性能コンテナ管理サービスです。 簡単な API 呼び出しを使用して、Docker 対応アプリケーションの起動と終了、クラスターの完了状態のクエリ、多くの使い慣れた機能 (セキュリティグループ、Elastic Load Balancing、EBS ボリューム、IAM ロールなど) へのアクセスを実行できます。

Amazon ECS を使用することで、リソースニーズと可用性要件に基づいて、クラスター全体のコンテナの配置をスケジューリングできます。ビジネスまたはアプリケーション固有の要件を満たすために、独自のスケジューラまたはサードパーティー製のスケジューラを統合することもできます。

Amazon ECS は追加料金なしで使用できます。アプリケーションの保存や実行のために作成した AWS リソース (EC2 インスタンス、EBS ボリュームなど) には、料金が発生します。


以下のステップバイステップ手順通り、Amazon ECS を使用して node.js アプリケーションをデプロイします。 各ステップの番号をクリックして、セクションを展開してください。

break-the-monolith
  • ステップ 1: AWS CloudFormation を使用して ECS クラスターを起動する

    Application Load Balancer の後ろにデプロイされる Amazon ECS クラスターを作成します。

    1. AWS CloudFormation コンソールに移動します。
    2. [スタックの作成] を選択します。
    3. [テンプレートファイルをアップロード] を選択し、amazon-ecs-nodejs-microservice/2-containerized/infrastructure/ecs.yml にある GitHub プロジェクトから ecs.yml ファイルを選択し、[次へ] を選択します。
    4. スタック名として BreakTheMonolith-Demo と入力します。他のパラメータに次の値があることを確認します。
      1. Desired Capacity = 2
      2. InstanceType = t2.micro
      3. MaxSize = 2
    5. [次へ] を選択します
    6. [スタックオプションの設定] ページで、デフォルトのオプションをそのまま使用し、下にスクロールして [次へ] を選択します。
    7. [BreakTheMonolith-Demo の確認] ページでページの一番下までスクロールし、チェックボックスをオンにして Capabilities ステートメントを確認し、[スタックの作成] を選択します。

    「CREATE_IN_PROGRESS」のステータスのスタックが表示されます。画面の右上にある更新ボタンをクリックすると、進行状況を確認できます。このプロセスにかかる時間は通常 5 分以内です。

    スタックを作成

    ⚐注意: 必要に応じて、AWS コマンドラインインターフェイス (AWS CLI) を使用して AWS CloudFormation スタックをデプロイできます。ターミナルで amazon-ecs-nodejs-microservices/3-microservices フォルダから次のコードを実行し、[region] を AWS リージョンに置き換えます。

    $ aws cloudformation deploy \
       --template-file infrastructure/ecs.yml \
       --region [region] \
       --stack-name BreakTheMonolith-Demo \
       --capabilities CAPABILITY_NAMED_IAM
  • ステップ 2: クラスターが実行されていることをチェックする

    Amazon ECS がクラスターを検証する
    • クラスタ BreakTheMonolith-Demo を選択し、次に [タスク] タブを選択して、実行中のタスクがないことを確認します。
    Amazon ECS クラスターのタスク
    • [ECS インスタンス] タブを選択して、AWS CloudFormation テンプレートによって作成された 2 つの Amazon EC2 インスタンスがあることを確認します。
      ⚐注意: ECS エージェントが古い旨のメッセージが表示された場合は、[詳細] を選択して ECS エージェントを更新する手順を確認してください。
    Amazon ECS インスタンス
  • ステップ 3: タスク定義を記述する

    タスク定義は、Amazon ECS がクラスター全体にアプリケーションコンテナをデプロイする方法を指定します。

    • Amazon ECS の左側のナビゲーションメニューから、[タスク定義] を選択します。
    • [新しいタスク定義を作成] を選択します。
    • [起動タイプの互換性の選択] ページで、[EC2] のオプションを選択し、[次のステップ] を選択します。
    • [タスクおよびコンテナ定義の設定] ページで、以下を実行します。
      • [タスク定義名] フィールドに api と入力します。
      • [コンテナ定義] までスクロールし、[コンテナの追加] を選択します。
      • [コンテナの追加] ウィンドウで以下のとおり操作します。
        • 定義されていないパラメータは、空白のままにするか、デフォルト設定のままにすることができます。
        • [コンテナ名] フィールドに api と入力します。
        • [イメージ] フィールドに、[account-ID].dkr.ecr.[region].amazonaws.com/api:v1 と入力します。
          [account-ID] および [region] を特定の情報に置き換えます。v1 タグが、モジュール 1 でイメージをタグ付けしてプッシュするために使用した値と一致することを確認してください。これは、前のモジュールで作成された ECR リポジトリイメージの URL です。
        • [メモリ制限] フィールドで、[ハード制限] が選択されていることを確認し、値として 256 を入力します。
        • [ポートマッピング] で、ホストポート = 0 およびコンテナポート = 3000 と指定します。
        • ENVIRONMENT までスクロールして、CPU ユニット = 256 と指定します。
    • [追加] をクリックします。
      [タスクおよびコンテナ定義の設定] ページに戻ります。
    • ページの一番下までスクロールして、[作成] を選択します。

    タスク定義がコンソールにリストされます。

    タスク定義
  • ステップ 4: Application Load Balancer を設定する: ターゲットグループ

    Application Load Balancer (ALB) により、サービスが受信トラフィックを受け入れることができるようになります。ALB は、クラスターで実行されているコンテナインスタンスをターゲットグループとして使用して、これらのコンテナインスタンスにトラフィックを自動でルーティングします。

    VPC 名をチェックする: AWS アカウントを初めて使用する場合を除き、VPC が複数存在する可能性があります。ターゲットグループを正しい VPC で設定することが重要です。

    • EC2 コンソールの [ロードバランサー] セクションに移動します。
    • demo という名前のロードバランサーを見つけます。
    • [demo] の横にあるチェックボックスをオンにしてロードバランサーの詳細を表示します。
    • [説明] タブで、VPC 属性を見つけます (vpc-xxxxxxxxxxxxxxxxx の形式です)。
      ⚐注意: ALB ターゲットグループを設定する場合、次のステップで VPC 属性が必要になります。
    VPC 属性

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

    • EC2 コンソールの [ターゲットグループ] セクションに移動します。
    • [ターゲットグループを作成] を選択します。
    • 次の [ターゲットグループ] のパラメータを設定します (以下にリストされていないパラメータについては、デフォルト値のままとします)。
      • [ターゲットグループ名] に api と入力します。
      • [プロトコル] で、[HTTP] を選択します。
      • [ポート]に 80 と入力します。
      • VPC の場合は、ロードバランサーの説明からの値と一致する値を選択します。これは、大抵の場合デフォルトの VPC ではありません
      • [詳細ヘルスチェック設定] にアクセスし、必要に応じて次のパラメータを編集します。 
        • [正常なしきい値] に 2 を入力します。
        • [異常なしきい値] に 2 を入力します。
        • [タイムアウト] に 5 を入力します。
        • [間隔] に 6 を入力します。
    • [作成] を選択します。
    ターゲットグループを作成
  • ステップ 5: Application Load Balancer を設定する: リスナー

    ALB リスナーは、ALB に送られる接続リクエストをチェックします。

    ALB にリスナーを追加する

    • EC2 コンソールの [ロードバランサー] セクションに移動します。
    • [demo] の横にあるチェックボックスをオンにしてロードバランサーの詳細を表示します。
    • [リスナー] タブをクリックします。
    • [リスナーを追加] を選択し、必要に応じて次のパラメータを編集します。
      • [プロトコル: ポート] で、[HTTP] を選択して 80 を入力します。
      • [デフォルトのアクション] で、[転送先] を選択し、[ターゲットグループ] フィールドに api と入力します。
    • [保存する] をクリックします。
    ALB に対するリスナー
  • ステップ 6: サービスとしてモノリスをデプロイする

    モノリスをサービスとしてクラスターにデプロイします。

    • Amazon ECS コンソールに移動し、左側のメニューバーから [クラスター] を選択します。
    • クラスター BreakTheMonolith-Demo、[サービス] タブ、[作成する] の順にクリックします。
    • [サービスを設定する] ページで、以下のパラメータを編集します (および、以下にリストされていないパラメータのデフォルト値を保持します)。 
      • [起動タイプ] で [EC2] をクリックします。
      • [サービス名] として api と入力します。 
      • [タスク数] に 1 を入力します。
      • [次のステップ] を選択します。
    • [ネットワークの設定] ページの [ロードバランシング] セクションで、[Application Load Balancer] を選択します。
      [サービス IAM ロール] および [ロードバランサー名] の追加のパラメータが表示されます。
      • [サービス IAM ロール] には [BreakTheMonolith-Demo-ECSServiceRole] を選択します。
      • [ロードバランサー名] で、demo が選択されていることを確認します。
    • [ロードバランスするコンテナ] セクションで、[ロードバランサーに追加] を選択します。
      api:3000 というラベルの付いた追加情報が表示されます。
    • api:3000 セクションで、次の操作を行います。
      • [プロダクションリスナーポート] フィールドで、[80:HTTP] を選択します。
      • [ターゲットグループ名] に api グループを選択します。
      • [次のステップ] を選択します。
    • [Auto Scaling の設定] ページで、デフォルト設定のままにして、[次のステップ] を選択します。
    • [確認] ページで設定を確認し、[サービスの作成] を選択します。
    • サービスが作成されたら、[サービスの表示] を選択します。
    Amazon ECS サービス API

    よくできました。 サービスが実行できるようになりました。コンテナが正常として登録され、トラフィックを受信し始めるまで 1 分ほどかかる場合があります。

  • ステップ 7: モノリスをテストする

    サービスがインターネットから利用可能かどうかをチェックし、ping を実行してデプロイメントを検証します。

    サービス URL の検索方法:

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


    サービスの各部分を表示する:
    node.js アプリケーションは、URL に基づいて各ワーカーにトラフィックをルーティングします。ワーカーを表示するには、以下のようにワーカー名 api/[worker-name] を DNS 名の末尾に追加します。

    • http://[DNS name]/api/users
    • http://[DNS name]/api/threads
    • http://[DNS name]/api/posts

    URL の最後にレコード番号を追加して、特定のレコードまでドリルダウンすることもできます。例えば、「http://[DNS name]/api/posts/1」または「http://[DNS name]/api/users/2」のようにします。

    ユーザーの demo