AWS ECS/Fargete/Cluster/Task/Serviceを触って理解する

2年くらい前にもECSのメモをQiitaに書いているのですが、
個人的に内容微妙で嫌いですし、AWSのUIも新しくなったので書き直そうと思います。

https://qiita.com/ohtsuka-shota/items/ed5be87ff05652713c81

# 環境イメージ
クラスターは図示していませんが、環境としては以下になります。
Docker Hubからnextcloudのコンテナイメージをpullするようなtaskを作って、それをFargateを使ってデプロイしていきます
![growi-ページ56.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/1db507b7-6650-4528-8d8e-26a6d4c8a5c7.png)



# Task作成
## Taskとは？

1. **タスク定義**:
   - タスクは、タスク定義に基づいて実行されます。タスク定義は、タスクを構成するコンテナの設定（イメージ、リソース要求、環境変数、ボリューム、ネットワーク設定など）を含むJSON形式の文書です。
   - タスク定義は、複数のリビジョンを持つことができ、アプリケーションの変更に応じて新しいリビジョンを作成して管理できます。

2. **コンテナ**:
   - タスクは、1つまたは複数のコンテナを含むことができます。各コンテナは、特定のアプリケーションやサービスを実行します。
   - コンテナ間での通信やデータ共有が必要な場合、タスク内のコンテナ同士は同じネットワークで接続されます。

3. **リソースの指定**:
   - タスク定義では、各コンテナに対してCPUやメモリのリソースを指定できます。これにより、タスクが実行される際のリソース管理が行われます。

4. **ネットワーク設定**:
   - タスクは、AWS VPC内で実行され、ネットワーク設定（例えば、プライベートIPアドレスやポート番号）を持つことができます。これにより、他のサービスやコンテナとの通信が可能になります。

## 作成
ECSの管理画面を開いて左のタブからタスク定義を押下すると以下のような画面が表示されます。
新しいタスク定義の作成ボタンを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/a93d1a6f-c836-4840-a86c-11c285321e25.png)

以下のような設定で作成します。
タスク定義ファミリーは任意のものを記載。
起動タイプはFargateにします。コンテナに使用するCPUやメモリもここで設定が出来ます。
今回は試験なのでデフォで。

コンテナのイメージURIは"nextcloud:latest"としました。
こうすることで、Docker Hubからイメージをpullしてくるようです。
ポートマッピングはとりあえず80で。
※Fargateを使用する場合、docker run ～ -p 8080:80の用にホスト側のポートは決められないらしい。タスク自体が独自のIPアドレスを持ち、他のタスクやサービスと独立する環境になるためそういう仕様になっているみたい・・・
![screencapture-ap-northeast-1-console-aws-amazon-ecs-v2-create-task-definition-2025-06-14-18_18_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/7606c515-572c-4d6a-adc3-7ebdf29fe470.png)


起動タイプをFargateにすることで、開発者はコンテナの開発だけに注力することが出来ます。
EC2を選択すると、EC2の管理もする必要が出てきます。最も要件次第だと思いますが。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/ad70864e-31f7-4809-9620-507920127923.png)
引用：以下のBlack Belt

https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2024_Amazon_ECS_Introduction_0831_v1.pdf

また、コンテナイメージの記載によって、コンテナリポジトリの向きが変わるのは以下のサイトに記載されているので参考なりました。
ECRやDocker Hubの他、GCPもいけるようです。

https://dev.classmethod.jp/articles/try-a-registry-other-than-ecr-in-ecs/

タスクが作成されたことがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/19052ce1-4b9f-49e5-9079-6dcf12179fa9.png)


# Cluster作成
## Clusterとは？
「クラスター」は、コンテナを管理するためのリソースの集合体です。具体的には、以下のような役割や特徴があります。

### クラスターの主な機能

1. **リソースの管理**:
   - クラスターは、EC2インスタンスやFargateのリソースをまとめて管理します。これにより、コンテナを実行するための計算リソースを効率的に利用できます。

2. **タスクの実行**:
   - クラスター内でタスクを実行することができます。タスクは、特定のアプリケーションやサービスを実行するためのコンテナの集合です。

3. **スケーリング**:
   - クラスターは、必要に応じてリソースをスケールアップまたはスケールダウンすることができます。これにより、負荷に応じた柔軟なリソース管理が可能です。

4. **高可用性**:
   - 複数のアベイラビリティゾーンにまたがるクラスターを構成することで、高可用性を確保できます。

5. **サービスの統合**:
   - クラスターは、複数のサービスを管理するための基盤となります。各サービスは、クラスター内のリソースを使用してタスクを実行します。

## 作成
画面左のクラスタータブを押下します。
デフォルトだと何も作成されていないので、作成していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/e33157d1-d2a0-4d73-919b-21b925b59646.png)

こんな感じで作成していきます。
基本デフォルトで作成しました。
![screencapture-ap-northeast-1-console-aws-amazon-ecs-v2-create-cluster-2025-06-14-18_14_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/45c85772-6c5d-4179-a734-cfb17faa2105.png)

作成が開始され、完了すると以下のような推移を示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/6fa5703f-de07-4065-a755-f81a2879db42.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/352fd31d-ba0f-473c-a978-5b86eb56a319.png)

# TaskをClusterにデプロイする
先程作成したタスクのデプロイボタンからタスクの実行を選択します。
（サービスは後程触ります。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/303ac4b8-b478-48ea-b1dd-b0afab67c12e.png)

今回は以下のような設定で作成していきます。
クラスターは先ほど作成したもの。
ネットワーキングは作成済みのVPCとパブリックサブネット、SGを指定しています。
外部からこのタスク（コンテナ）に接続したいのでパブリックIPを有効化しています。
![screencapture-ap-northeast-1-console-aws-amazon-ecs-v2-task-definitions-nextcloud-ecs-task-1-run-task-2025-06-14-18_21_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/35bdd901-e9f7-40f0-a4ff-45ea9e8ad707.png)

作成が開始されると以下のような画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/d8e5e48a-1f34-4ce4-a34d-41ba0a61f1ee.png)

少し待つとステータスが実行中になります。
タスクがリンクになっていますので、これを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/8e1dcb71-fc5e-487a-8873-c4fbcd77a631.png)

ネットワークバインドタブを開くとコンテナにアクセスするためのIPアドレスを確認することが出来ます。オープンアドレスと表記されてる部分を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/fa190364-b5a7-4473-9c23-15de6818c919.png)

コンテナで実行しているアプリにWebブラウジングできました。
タスクをデプロイすることが出来ました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/f090af3e-6088-48c2-9e54-28c0ff3b69bf.png)

# Service作成
## Serviceとは？
Amazon ECS（Elastic Container Service）における「Service」は、コンテナ化されたアプリケーションを管理するための重要なコンポーネントです。具体的には、以下のような機能があります。

1. **タスクの管理**:
   - サービスは、指定した数のタスクを常に実行するように管理します。タスクが異常終了した場合、自動的に新しいタスクを起動します。

2. **負荷分散**:
   - Application Load Balancer（ALB）やNetwork Load Balancer（NLB）と統合し、トラフィックを複数のタスクに分散します。

3. **デプロイ管理**:
   - タスク定義の新しいリビジョンを使って、アプリケーションの新しいバージョンをデプロイする際の管理を行います。

4. **高可用性**:
   - 複数のアベイラビリティゾーンにまたがってタスクを実行することで、高可用性を確保します。

5. **サービスディスカバリ**:
   - AWS Cloud Mapと統合されており、タスクのエンドポイントを動的に発見できます。

## 作成
一旦、先程クラスターにデプロイしたタスクを削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/840a626f-0e02-48ee-95ad-487fb81e532d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/9e699424-36e5-4e26-b9cb-0d04e1be8236.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/f3df52cc-e428-4770-9781-3a9e1d0c45bc.png)

タスクの画面からサービスの作成を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/d50cd2b2-c367-45e9-a463-8a1a31debde5.png)

今回は以下のように設定していきます。
デプロイ設定内のレプリカで必要タスク数を1にしていることで、タスクを1つ必ず走らせるようにしています。
ネットワーキングはタスクを作成した時と同様にコンテナをデプロイしたいVPC/サブネット/SGを選択しています。
![screencapture-ap-northeast-1-console-aws-amazon-ecs-v2-task-definitions-nextcloud-ecs-task-1-create-service-2025-06-14-18_32_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/26ea8bf3-b834-414e-abca-18f5184693f4.png)

作成中となりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/519960e4-14b1-4051-be04-41a6a320c882.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/f702cef2-a603-429a-abdb-2997199dc283.png)

作成が完了しました。
サービス名がリンクとなっているのでこれを押下してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/1528f1b5-0a42-4cd3-accd-98a6616380da.png)

サービスの詳細を確認する画面が表示されます。
タスクタブを押下すると、1つタスクがサービス経由で実行されていることがわかります。
このタスクの内容を確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/1d783218-a5d0-4c6a-81b4-e2d64d00dc49.png)

ネットワークバインドでIPアドレスが表示されているので、これにアクセスします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/e0126f9a-141f-440a-beb7-efc6f1e86b2b.png)

アプリにWebブラウジングできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/b0e5927a-b555-44d9-8acf-377db966e414.png)

このタスクを停止してみます。
サービスのレプリカで設定しているはずなので、このタスクを停止しても新しいタスクがすぐにデプロイされるはず。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/a7dad151-f9fa-4b8f-b965-f2cc5bc3c0ff.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/51c6bd28-0dea-4cd0-b360-6154629ebc03.png)

サービスのタスクタブを見てみると、新しいタスクが自動で作成されていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/7ed608e5-e80b-49f2-9157-aef6e38110d5.png)

新しいタスクを表示してみると、先ほどとは違ったIPアドレスが表示されているのでこれを押下してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/2d15d69e-ea2d-471b-b280-8cd61802329b.png)

アクセスできました。
サービスを利用すると、タスクが意図せず停止しても自動で再デプロイしてくれるようです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/e434ae6f-fb73-4cdb-93e1-80f6d91a7857.png)

前からずっと思ってましたが、ECSってKubernetesに近いような・・・