ECSを使ったコンテナデプロイ：ECSを使ったサーバーレスアプリケーションのデプロイと動作確認

## はじめに
この記事では、前回 ECR に Docker イメージをプッシュした続きとして、ECS を利用してそのイメージをデプロイし、実際に動作させるまでの流れをまとめています。

https://qiita.com/free-honda/items/fc8de2af0abfc3be9eb9

ITスクールで Docker の基本を学んだことが、今回の自宅検証で非常に役立ちました。

:::note warn
**ECR（Elastic Container Registry）を学び始めたばかりの私が、将来の自分への備忘録として、学んだ知識や作業手順を記録しています。**
:::

環境構築やイメージ管理の基礎を理解していたおかげで、次のステップである ECS（Elastic Container Service）の学習がスムーズに進みました。

## ECR・ECSについての知識整理
ECR (Elastic Container Registry) は、AWS が提供する Docker イメージを保存・管理するためのコンテナレジストリサービスです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/04ee6cda-c2db-1b77-1cd7-63c706b4a831.png)

引用画像：https://zenn.dev/yoshii0110/articles/1de56128d7be2c

イメージをプッシュ（登録）しておけば、ECS などの AWS サービスから簡単に利用できます。

一方で、ECS (Elastic Container Service)は、AWS のコンテナオーケストレーションサービスとなっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/a9a92d4f-2516-d5ab-de67-27124c46eca4.png)

引用画像：https://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/deploy-java-microservices-on-amazon-ecs-using-amazon-ecr-and-aws-fargate.html

クラスター上でコンテナを実行するための「タスク定義」や、それを永続的に実行する「サービス」の管理が可能です。

## ECSにおける基本構成

ECS の仕組みを理解するためには、クラスター、タスク定義、サービスの関係を把握することが重要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/794fc34d-d081-459c-6f60-102d1ab65cb0.png)
引用画像：https://zenn.dev/issy/articles/zenn-ecs-overview

### ⓵クラスター (Cluster)
クラスターは、コンテナを実行するための基盤のようなもので、以下の役割を担います。

:::note
- **コンテナを実行するリソースをグループ化する。**
- **Fargate または EC2 を使用して、必要な計算リソースを提供する。**
:::

### ⓶サービス (Service)
サービスは、タスク定義に基づき、クラスター上でタスクをスケーリングや管理するための機能です。

:::note
**サービスを利用することで、特定のタスクを継続的に実行したり、障害時に自動復旧させたりすることができます。**
:::

### ⓷⓸タスクとタスク定義 (Task Definition)
タスク定義は、どのコンテナイメージを使用するか、リソースの割り当て、ネットワーク設定などを定義した「設計図」の役割を果たします。

:::note
**この設計図をもとにタスクが実行されます。**
:::

## 実際にやってみた
ここでは、前回作成した「My Web App」の Docker イメージが ECR に登録されている状態を前提に進めます。

https://qiita.com/free-honda/items/fc8de2af0abfc3be9eb9

### ECSクラスターの作成
まず、ECS サービスページに移動し、サイドメニューから「クラスター」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/a89d28e4-d641-f0a3-c3de-8078c32f6d31.png)

次に「クラスターの作成」ボタンをクリックし、クラスター名として ``my-ecs-cluster`` を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/b9c215b1-6b18-4813-4861-a1d9a24bb6c2.png)

インフラストラクチャのタイプとして「AWS Fargate (サーバーレス)」を選び、「作成」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/3c8b6303-5c2f-6812-0fe2-808a911b33a8.png)

これで、正常に ``my-ecs-cluster`` が作成されていることが確認できました。

### タスク定義の作成

次に、ECS ページのサイドメニューから「タスク定義」を選び、「新しいタスク定義の作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/78fdf119-80fa-b015-2eb6-4991a799fa7e.png)

タスク定義ファミリーは ``my-app-task`` とし、起動タイプとして「AWS Fargate」（コンテナのサーバーレスコンピューティング）を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/3417ddf1-ed5f-6e3d-1635-084f12143034.png)

タスク実行ロールには ``ecsTaskExecutionRole`` を選択します。もし存在しない場合は、必要に応じて作成してアタッチしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/7c160ee3-7594-fe16-5839-d0a4504cd1e8.png)

コンテナの詳細設定では、コンテナ名を ``my-app-container`` とし、イメージ URI には ECR にプッシュしたイメージの URI を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/5b125292-9bdb-859f-775d-f2d709e0b6ff.png)

:::note warn
**今回は検証のため、ホストポートとコンテナポートを両方 80 に設定しています。**
:::

問題がなければ「作成」ボタンをクリックし、ステータスが「ACTIVE」になっていることを確認すれば、タスク定義が正常に作成されたことになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/74ee36d7-832e-010a-edb3-3573845a84dd.png)

最初に作成した「my-ecs-cluster」から「新しいタスクの実行」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/7c0f9d0c-f821-85eb-b6f6-24d648d4d0f3.png)

ここでは、特に設定を変更せず、デフォルトのままで進めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/c2794062-24bf-4238-eeab-f42622c0fe81.png)

デプロイ設定のファミリーでは、先ほど作成した「my-app-task」を選択し、リビジョンと必要なタスク数を設定して進めます。

ネットワーキングの設定では、ご自身のVPCやサブネットを選択してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/591cfa44-f91b-ec62-db0a-f861f37b8155.png)

ここでは、インターネット接続を確認するために、セキュリティグループのインバウンドルールで80番ポートを許可します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/0864564c-17be-252b-2558-4f747cb99a17.png)

登録したタスクが「実行中」のステータスになっていることを確認できました。

### サービスの作成

次に、最初に作成した「my-ecs-cluster」のサービス画面から、クラスター上でタスクを実行するサービスを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/f6d11186-64b1-0ad6-c2a8-bf812180d6b2.png)

環境については、特に変更せずそのまま進めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/799df17b-40d4-fa33-4ce6-8d79aa0a0495.png)

アプリケーションタイプは「サービス」として、デプロイ設定のファミリーでは、先ほど作成した「my-app-task」を選択し、リビジョンと必要なタスク数を選択して進めます。

サービス名は「my-app-service」として進めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/5471766d-e119-7d19-6a39-cbc6a4771c14.png)

ネットワーキングの設定も同様に、ご自身のVPCやサブネットを選択してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/591cfa44-f91b-ec62-db0a-f861f37b8155.png)

設定内容を確認後、「サービスの作成」をクリックします。デプロイには多少時間がかかります。

## デプロイ後の動作確認

デプロイが完了したら、タスクが正常に実行されていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/111a0c45-3fbd-549e-ddde-f72ea71cb9e9.png)

ECSページの「クラスター」→「タスク」タブから、実行中のタスクを選択し、タスクのパブリックIPを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/55893b42-de56-0f24-6b1b-ff6d38626502.png)

ここで、タスクが使用しているパブリックIP（例：``52.68.45.243``）を確認したら、ブラウザでアクセスしてみます。

```bash
http://52.68.45.243/
```

実際に、前回ECRにプッシュした``index.html``ファイルの内容が表示されていることを確認できました。この確認をもって、検証は大成功です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/de03fd12-4f69-d3fd-be1a-cea35ec3494b.png)

## まとめ

今回の手順では、ECSクラスタの作成からタスクの実行、サービスの設定までを学びました。

:::note warn
**ECSのサービス間の関係性を考えながら検証するのが非常に手こずり、特にインターネット接続の確認に苦労しました。**
:::

次回は、ECSの設定をさらに深堀りし、より複雑なデプロイやトラブルシューティングにも挑戦していきたいと思います。

## 参考記事

https://qiita.com/k_dd/items/ba43ba409550ae237859

https://zenn.dev/issy/articles/zenn-ecs-overview

https://zenn.dev/yukisatoblog/articles/0350cfefd06e18