AWS上でコンテナでのWebアプリの構築(2.ECS+FargateでECRのコンテナイメージを元にコンテナを起動)

AWS上でコンテナでのWebアプリの構築(1.CodeBuildでコンテナイメージをビルド・ECRへPush) の記事の続きです。
今回は「ECS+FargateでECRのコンテナイメージを元にコンテナを起動」について記事にまとめます。

概要

今回は、下記の赤枠の部分について進めます。

ECSはUIが新UIに変わっており、2022年1月時点でのUIで手順を書き記していきます。

ECS設定に必要なもの

ECSの設定に必要なものは主に下記です。

  1. タスク定義・コンテナ定義
    1. 起動するコンテナやその環境変数、コンテナ実行環境などの設定を行います。
  2. クラスター
    1. 「タスク」や「サービス」をまとめるグループのようなものです。
  3. サービス
    1. タスク定義を使って、起動するタスクの数(つまりコンテナ数)や、ロードバランサを使って待ち受けるか、などの実行する内容を設定します。

タスク定義・コンテナ定義作成

  1. まず、ECSの画面から「タスク定義」より、タスクを作成します。

  2. 下記のように起動するコンテナを定義します。

  3. 以下は特に変更をせずにそのまま「次へ」を押します。

  4. コンテナを実行する環境を下記のように定義します。今回は確認用なので、最小の構成で定義しました。

  5. 次のページに進むと確認画面なので、そのまま「作成」ボタンを押して完了します。

  6. 完了すると、下記のように作成されたタスク定義が表示されます。

クラスター作成

  1. 下記画面からクラスターを作成します

  2. 下記のように入力します。ネットワーキングなどはここではデフォルトのままにしますが、実際の案件では、設計に従って、VPCを設定することになります。

  3. クラスターの作成はこれで完了です。

クラスターにてサービス作成

続いて、先程作成したタスク定義を使って、クラスターにてサービスを作成します。

タスクとサービスの違い

クラスターでは「タスク」と、「サービス」が設定できます。

  • タスク
    • 指定した処理を1回(コンテナのプロセスが停止するまで)実行する機能
    • 単発でバッチ処理等を動かす場合は、「タスク」を使います
  • サービス
    • 停止せずに継続的にタスクを実行する機能
    • Webアプリなど継続的に起動しておくものは「サービス」を使います

実際に設定してみるとわかるのですが、「サービス」を動かすと、「タスク」が1つもしくは複数起動する状態になります。
今回はWebアプリを動作させることを想定しているので「サービス」を作成し、コンテナを稼働させます。

設定方法

  1. 作成したクラスターの画面から「デプロイ」ボタンを押して、サービスの設定をしていきます。

  2. 下記のように先程作成したタスク定義を指定します。タスク定義にはリビジョンがあるので、先程作成したタスク定義のうち、利用するリビジョンを指定してください。サービス名は任意文字列で入力してください。

  3. 通常、Webアプリを公開する際はロードバランサを使うと思いますので、ここでロードバランサの設定をします。(ここでロードバランサの新規作成もできるので楽です。)今回は確認なので80ポート(HTTP)で待ち受けるようにしますが、通常のALBの設定と同様で、HTTPSにすることもできそうです。

  4. ネットワーキングの設定は、下記のようにしました。すべてデフォルトのリソースを指定しています。デフォルトで用意されているセキュリティグループで、もしアウトバウンドルールで80ポートが拒否されている場合、別途許可してください。(そうでないと、アクセスが拒否されるので)

  5. 先程の画面で「デプロイ」ボタンを押すと、下記のようにデプロイ(=コンテナイメージの取得、コンテナイの起動)が始まります。初回なのでしばらくかかります。

サービス起動確認

  1. 下記のように、サービスが表示され、「1/1 実行中のタスク」と表示されていれば、無事コンテナが起動できています。

  2. ロードバランサ経由でWebアプリにアクセスできるかどうか確認します。下記ロードバランサの画面から、ロードバランサのDNS名をコピーします。

  3. 実際にブラウザでアクセスし、下記のように画面が表示されることが確認できました。(apacheの設定をとくにいじっていないので、apacheデフォルトの「It works!」が表示されます)

ECSを使ってコンテナが起動できた

これで、前回用意したコンテナイメージ使って、コンテナを起動することができました。
次回は「CodePipelineで、自動でECSにコンテナをデプロイ」について記事にまとめます。