本連載では、以下のイメージ構成に沿ってアプリケーション開発を進めています。

開発するアプリケーションの構成イメージ

前回は、コンテナを実行するためのECSクラスタを作成し、ECSコンテナの定義まで完了しました。今回はいよいよ、ECSサービスを実行します。

ECSサービスの実行

ECSタスクの定義と同様、ネットワークインタフェースをコンテナにアタッチするなどのサービス実行に必要な権限を持つロールが必要になります。前回、ECSタスクを定義する際に行ったIAMロール作成と同様の手順で、「AmazonECSServiceRolePolicy」をアタッチしたIAMロールを作成しておいてください。

なお、ECSを初めて起動する場合、ロールは以降の手順を実施していくなかで「AWSServiceRoleForECS」という名前で自動作成されます。

さて、ECSサービスの実行では、ECSクラスタ上にコンテナを起動します。「ECS」サービスのメニューから「クラスター」を選択し、コンテナを実行するクラスタを選択します。

「クラスター」画面でコンテナを実行するクラスタを選択する

続いて、「サービス」タブにある「作成」ボタンを押下します。

「サービス」タブにある「作成」ボタンを押下する

ここで以下の要領に従って、ECSサービス定義の設定を行います。

入力項目 説明
起動タイプ FargateかEC2起動型か選択します。ここでは、EC2起動型を選択します
タスク定義 サービスとして実行するタスク定義を設定します。ここでは、前回設定したタスク定義を選択します
クラスタ サービスをLaunchするクラスタを選択します。パブリック/プライベートに対応するクラスタを選択します
サービス名 サービスの名前として設定する任意の名称を入力します
サービスタイプ サービスタイプを選択します。REPLICAは、クラスタ全体でタスクの数として指定した数のコンテナを実行するオプションで、DAEMONはECSクラスタのインスタンスの増減に合わせて実行コンテナを増減させるオプションです。クラスタインスタンス1台ごとに1つの実行コンテナを維持します。詳細は、「サービススケジューラの概念」を参照してください
タスクの数 クラスタで実行するコンテナ数を設定します
最小ヘルス率 コンテナの最小実行数の割合を設定します
最大率 コンテナの最大実行数の割合を設定します
デプロイメントタイプ コンテナをアップデートする場合の戦略を選択します。ローリングアップデートするかAWS CodeDeployを使用したブルーグリーンデプロイメントを選択できます。詳細は「Amazon ECS デプロイタイプ」を参照してください
配置テンプレート コンテナを配置する戦略を選択します。詳細は「Amazon ECSタスク配置戦略」を参照してください
ヘルスチェックの猶予時間 ECSコンテナを起動してからのヘルスチェックの猶予時間を設定します。Springアプリケーションを起動するのに数秒~数十秒を要するので、その辺りを考慮した値を設定しましょう
ELBタイプ ECSコンテナに処理を分散させるロードバランサーを指定します。ここではALBを指定してください
サービス用IAMロールの選択 ECSサービス実行用のロールを設定してください。前述した通り、初回ECSを起動する場合は、「新しくロールを作成する」を選択すると、「AWSServiceRoleForECS」が作成されます。なお、詳細は「Amazon ECSのサービスにリンクされたロールの使用」を参考にしてください
ELB名 第5回で作成したALBを選択します。コンテナアプリケーションに合わせて、パブリック/プライベート各々サブネットと対応したALBを選択してください
リスナーポート ALB作成時に設定していたポートが選択されます
リスナープロトコル ALBを作成時に設定していたプロトコルが選択されます
ターゲットグループ名 ALBに設定されているターゲットグループを選択します。複数サービスがある場合はここでターゲットグループをコンテナに関連づけることになります
ターゲットグループのプロトコル ALBを作成時に設定していたプロトコルが選択されます
パスパターン 選択したターゲットグループにより自動指定されます
ヘルスチェックパス 選択したターゲットグループにより自動設定されます
サービス検出統合の有効化 2018年9月に東京リージョンで追加されたRoute53を使ったサービス検出/ディスカバリー機能を有効化するオプションです。詳細は「オプションサービス検出を使用するようにサービスを設定する」に記述がありますが、今回はALBのパスルーティングを使用して、コンテナを識別/負荷分散するので、設定をオフにしてください
ServiceAutoScaling AutoScaling機能を有効化する場合、オプションを設定します

サービスの設定(起動タイプ~ELB名)

サービスの設定(リスナーポート~ServiceAutoScaling)

入力項目を確認し、「サービスの作成」ボタンを押下します。

入力した項目を確認したら、「サービスの作成」ボタンを押下する

同様にプライベートサブネットのアプリケーションコンテナもサービスを実行します。パブリックサブネットのALBのDNSに以下のBFFアプリケーションのパスを加え、アプリケーションが正しく実行されるか確認します(URL中、「xxxxxx」の部分は自身の環境のALBのDNS名に合わせてアクセスしてください)。

●BFFアプリケーションのURL
http://xxxxxxxx.ap-northeast-1.elb.amazonaws.com/backend-for-frontend/index.html

アプリケーションが正しく実行されることを確認

なお、ECS起動タイプ型であれば、正しくコンテナが実行されない場合、ECSクラスタにSSHログインし、「docker ps -a」を実行することでコンテナの実行を確認できます。また、コンテナ実行時のログは/var/log/ecs/ecs-agent.log_XXXXで確認できます。トラブルシューティングはこうしたログを参照してください。

まとめ

第4回から7回にわたり、AWS ECS上でSpringアプリケーションを構築する方法を説明してきました。ネットワーク構成やロードバランサ、コンテナの定義など、さまざまなことを考慮する必要はありますが、AWS ECSを使うことで、クラウド環境でセキュリティを保ちつつ、可用性の高いアプリケーションを構築できることがおわかりいただけたのではないでしょうか。

また、第6回で説明したように、Springアプリケーションを実装して別のECSコンテナアプリケーションを直接呼び出すのではなく、ALBのパスベースのルーティング機能を使い、サービスを呼び出す構成にしておけば、以下のようなメリットを享受することができます。

  • 呼び出したいアプリケーションのコンテナのIPやポートを意識しなくて済む
  • ヘルスチェックによるコンテナアプリケーション監視が行える
  • コンテナのオートリカバリを実現できる(ヘルスチェックでNGだとコンテナが再起動する)
  • 複数のコンテナが実行されていた場合に処理を分散できる
  • CloudWatchによるリソース監視ができる

こうした構成は、エンタープライズアプリケーションをクラウドネイティブ化する場合に十分有用なアーキテクチャです。

著者紹介


川畑 光平(KAWABATA Kohei)

某システムインテグレータにて、金融機関システム業務アプリケーション開発・システム基盤担当を経て、現在はソフトウェア開発自動化関連の研究開発・推進に従事。

Red Hat Certified Engineer、Pivotal Certified Spring Professional、AWS Certified Solutions Architect Professionalなどの資格を持ち、アプリケーション基盤・クラウドなどさまざまな開発プロジェクト支援にも携わる。

本連載の内容に対するご意見・ご質問は Facebook まで。