このモジュールでは、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 Elastic Container Service の使用には追加料金がかかりません。アプリケーションを保存して実行するために作成した AWS リソース (例 : EC2 インスタンスまたは EBS ボリューム) の料金のみが発生します。


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

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

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

    1. AWS CloudFormation コンソールに移動します。
    2. [スタックの作成] を選択します。
    3. [テンプレートを Amazon S3 にアップロード] を選択し、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. 次のページの最下部にあるボックスにチェックを入れ、[作成] を選択します。オレンジ色で [作成中] と記載されているスタックが表示されます。進捗度をチェックするには、画面の右上にある更新ボタンを選択できます。このプロセスにかかる時間は通常 5 分以内です。
    スタックの作成

    ⚐ 注意: AWS CLI を使用して AWS CloudFormation スタックをデプロイすることもできます。このコードにリージョンを追加し、コンピュータの amazon-ecs-nodejs-microservices/3-microservices フォルダからターミナルで実行してください。

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

    クラスターのチェック
    • クラスターをクリックし、[タスク] タブを選択します。タスクは実行されていません。
    タスク
    • [ECS インスタンス] タブを選択すると、AWS CloudFormation テンプレートが作成した 2 つの EC2 インスタンスが表示されます。
    ECS インスタンス
  • ステップ 3: タスク定義を記述する

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

    • Amazon ECS コンソールの左側にある [タスク定義] メニューに移動します。
    • [新しいタスク定義の作成] を選択します。
    • タスク定義名を api にします。
    • [コンテナの追加] を選択します。
    • 以下のパラメータを指定します。
      • パラメータが定義されていない場合は、空のままにする、またはデフォルト設定のコンテナ名 = api、イメージ = [account-id].dkr.ecr.[region].amazonaws.com/api:v1 (これは前のステップからの ECR リポジトリイメージの URL です) にしてください。
      • :v1 タグが、モジュール 1 でイメージをタグ付けしてプッシュするために使用した値と一致することを確認してください。メモリ = ハード制限: 256、ポートマッピング = ホストポート: 0、コンテナポート: 3000、CPU ユニット = 256
    • [追加] を選択します。
    • [作成] を選択します。
    • [タスク定義] がコンソールに表示されます。
    タスク定義
  • ステップ 4: Application Load Balancer を設定する: ターゲットグループ

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

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

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

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

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

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

    ALB にリスナーを追加する

    • EC2 コンソールの [ロードバランサー] セクションに移動します。
    • demo という名前のロードバランサーがすでに存在しているのが確認できます。
    • チェックボックスをオンにしてロードバランサーの詳細を表示します。
    • [リスナー] タブを選択します。
    • [リスナーの作成] を選択します。
      • プロトコル = HTTP
      • ポート = 80
      • デフォルトのターゲットグループ = api
    • [作成] をクリックします。
    ALB に対するリスナー
  • ステップ 6: サービスとしてモノリスをデプロイする

    このステップでは、モノリスをサービスとしてクラスターにデプロイします。

    • Amazon ECS コンソールの左側にある [クラスター] メニューに移動します。
    • クラスター BreakTheMonolith-Demo-ECSCluster を選択します。
    • [サービス] タブで [作成] を選択します。
    • サービスをサービス名 = api、タスクの数 = 1 に設定します (デフォルト値は変更しないでください)。
    • [ELB の設定] を選択します。
      • ELB タイプを Application Load Balancer にします。
      • IAM ロールには BreakTheMonolith-Demo-ECSServiceRole を選択します。
      • ロードバランサーの ELB 名に demo を選択します。
      • [ELB に追加] を選択します。
    • サービスをターゲットグループに追加します。
      • リスナーポート = 80: HTTP
      • ターゲットグループ名に 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