【AWS】ECS構築の基礎 −タスク定義・サービス編−


はじめに

前の記事で簡易的なECSクラスタを作成しました。
その続きとして、今回はタスク定義やサービスについて学びました。

タスク定義とは

タスク定義はDockerコンテナの実行方法や起動タイプなどをECSに伝えるために必要なJSON形式のメタデータです。
タスク定義に基づいて実行されるコンテナ群のことをタスクといいます。

タスク定義には以下の情報が含まれます。

  • コンテナイメージ名
  • コンテナとホスト間のポートマッピング
  • 必要CPU/RAM
  • 環境変数
  • ネットワーク情報
  • IAMロール(タスクごとに定義)
  • CloudWatchなどのログ設定

サービスとは

サービスは以下の内容を設定する役割を持ちます。

  • タスク定義のコピー数を指定(何個のタスクを実行すべきかを補助)
  • ELBとの連携(受信トラフィックを各コンテナに分散)

実装

Fargate起動タイプ、EC2起動タイプでそれぞれタスク定義とサービスの設定を行います。

Fargate起動タイプ

タスク定義、タスク実行、サービスの順に触っていきます。

タスク定義

ECS > タスク定義 > 新しいタスク定義の作成からタスク定義を作成します。
まずは"起動タイプの互換性の選択"からFargateを選択します。

タスク定義名、タスクロール、タスクサイズを設定します。
タスクロールについては前の記事で作成したecsTaskExecutionRoleを適用します。
このロールには、ECRからコンテナイメージをプルしてCloudWatchにログを発行する権限が付与されています。

作成したタスク定義の画面から"コンテナの追加"を選択します。
コンテナ名、イメージ、ポートマッピングを設定します。

今回は以下のhttpサーバのイメージを使用します。

タスク実行

タスク定義をもとにタスクを実行してみます。
タスクを実行したいクラスターを選択して、起動タイプ、タスク定義、VPC、サブネット、セキュリティグループなどを設定します。

セキュリティグループの設定では、インバウンドルールとしてカスタムTCPタイプでポート範囲8000を設定します。

このようなタスクが実行されます。

[パブリックIP]:8000にアクセスすると正しくレスポンスを返します。

サービス作成

次にサービスを作成します。

起動タイプ、サービス名、タスクの数などを設定します。
今回、タスクの数は2にします。

ネットワーク構成(VPC、サブネット、セキュリティグループ、ロードバランシングなど)の設定を行います。

セキュリティグループには"タスク実行"で作成したsimplehttp-accessを指定します。

Auto Scaling(サービスの必要数の調整)の設定も行うことができますが、今回は"調整しない"設定にします。

これで指定したタスク数(2)の分タスクが実行されます。

EC2起動タイプ

Fargate起動タイプと同様に、タスク定義、タスク実行、サービスの順に触っていきます。

タスク定義

起動タイプの互換性でEC2を選択します。

タスク定義名、タスクロール、ネットワークモードなどを設定します。

"コンテナの追加"でコンテナ名、イメージ、ポートマッピングなどを設定します。
ホストポートにポート0を指定することで、ホストポートはコンテナインスタンスのポート範囲から動的に選択されます。

タスク実行

EC2起動タイプで作成したクラスターを指定します。

以下のタスクが実行されます。

外部リンクをクリックしても開けないので、EC2インスタンスのセキュリティグループでインバウンドルールのタイプを"すべてのTCP"にします。
またSSH接続できるように、SSHのインバウンドルールも追加します。

これでパブリックIPにアクセスできるようになります。

以下のコマンドでEC2インスタンスにSSH接続します。

$ ssh -i ~/.ssh/udemysample.pem [email protected]

実行されているコンテナが2つあることがわかります。

[ec2-user@ip-172-16-1-109 ~]$ docker container ls
CONTAINER ID        IMAGE                            COMMAND             CREATED             STATUS                 PORTS                     NAMES
e9c78ecc79e9        gkoenig/simplehttp:latest        "/simpleHTTP"       2 hours ago         Up 2 hours             0.0.0.0:32768->8000/tcp   ecs-td-simplehttp-ec2-1-simplehttp-container-b8d997e9d4d1938e5900
4b198bf1e129        amazon/amazon-ecs-agent:latest   "/agent"            2 hours ago         Up 2 hours (healthy)                             ecs-agent

サービス作成

Fargate起動タイプのときと同様に、起動タイプなどを設定します。

ロードバランサーやAuto Scalingの設定はそのままでサービスを作成すると、以下のようにタスクが実行されます。

マニュアルで実行したタスクと異なり、サービスで実行したタスクを停止すると、再度タスクが実行されます。

参考資料