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

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

https://qiita.com/suzuki0430/items/2745e9ca0ead8db982f9

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

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

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

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/80b3ff2c-de3a-1174-3675-7c353d96e0fe.png" width="350">

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

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

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

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

###タスク定義
`ECS > タスク定義 > 新しいタスク定義の作成`からタスク定義を作成します。
まずは"起動タイプの互換性の選択"からFargateを選択します。
![スクリーンショット 2021-06-23 7.31.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/ddae9cc9-0187-6366-259a-a8bccbfef43e.png)

タスク定義名、タスクロール、タスクサイズを設定します。
タスクロールについては前の記事で作成した`ecsTaskExecutionRole`を適用します。
このロールには、ECRからコンテナイメージをプルしてCloudWatchにログを発行する権限が付与されています。
![スクリーンショット 2021-06-23 7.38.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/d14c308f-d84c-0e87-a00b-9d2b36daa52e.png)

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

![スクリーンショット 2021-06-23 7.40.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/e3e67fc4-416d-ebd2-aad5-f4a6f25196af.png)

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

https://hub.docker.com/r/gkoenig/simplehttp

###タスク実行
タスク定義をもとにタスクを実行してみます。
タスクを実行したいクラスターを選択して、起動タイプ、タスク定義、VPC、サブネット、セキュリティグループなどを設定します。
![スクリーンショット 2021-07-03 9.34.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/11654e11-9df5-5859-e8a0-939614b78edb.png)

セキュリティグループの設定では、インバウンドルールとしてカスタムTCPタイプでポート範囲8000を設定します。
![スクリーンショット 2021-07-03 9.34.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/c9405503-e0a1-78b1-c852-ff19acd3ea7f.png)

このようなタスクが実行されます。
![スクリーンショット 2021-07-03 9.40.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/a5e12c82-286b-00e9-923d-01161ad701ec.png)

`[パブリックIP]:8000`にアクセスすると正しくレスポンスを返します。
![スクリーンショット 2021-07-03 9.41.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/6d7549bd-6507-83a6-ffe9-1823ee030082.png)

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

起動タイプ、サービス名、タスクの数などを設定します。
今回、タスクの数は2にします。
![スクリーンショット 2021-07-03 10.04.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/cdd8ea31-3023-20df-9ff6-fa9af31cdb99.png)

ネットワーク構成(VPC、サブネット、セキュリティグループ、ロードバランシングなど)の設定を行います。
![スクリーンショット 2021-07-03 10.07.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/7f67a64d-e294-c792-b6a2-dd80a144c370.png)

セキュリティグループには"タスク実行"で作成した`simplehttp-access`を指定します。
![スクリーンショット 2021-07-03 10.06.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/b393c54e-f23e-9439-51bb-2dbbd86241a4.png)

Auto Scaling(サービスの必要数の調整)の設定も行うことができますが、今回は"調整しない"設定にします。
![スクリーンショット 2021-07-03 10.10.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/c9e040bc-7236-f445-b940-2a19fecba67e.png)

これで指定したタスク数(2)の分タスクが実行されます。
![スクリーンショット 2021-07-03 10.11.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/a09ed6c6-8b49-b801-d865-45209fe04293.png)

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

###タスク定義
起動タイプの互換性でEC2を選択します。
![スクリーンショット 2021-07-03 10.18.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/2cef60e4-a0dc-ce29-82f8-74bd6d8e0782.png)

タスク定義名、タスクロール、ネットワークモードなどを設定します。
![スクリーンショット 2021-07-03 10.26.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/6b79a28f-b787-0ac9-5bf8-63a32a3cc56a.png)

"コンテナの追加"でコンテナ名、イメージ、ポートマッピングなどを設定します。
ホストポートにポート0を指定することで、ホストポートはコンテナインスタンスのポート範囲から動的に選択されます。
![スクリーンショット 2021-07-03 10.42.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/b05e05ab-7d6b-7d55-91ab-48285f8d41fc.png)

###タスク実行
EC2起動タイプで作成したクラスターを指定します。
![スクリーンショット 2021-07-03 11.00.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/17b651bb-fbd0-8d89-42ea-0bd18e262470.png)

以下のタスクが実行されます。
![スクリーンショット 2021-07-03 11.16.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/67bae6fd-0260-3c88-4c29-1671a1b770fe.png)

外部リンクをクリックしても開けないので、EC2インスタンスのセキュリティグループでインバウンドルールのタイプを"すべてのTCP"にします。
またSSH接続できるように、SSHのインバウンドルールも追加します。
![スクリーンショット 2021-07-03 13.06.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/cd90fca6-ce2a-d2e6-4ec5-39f5658cdebf.png)

これでパブリックIPにアクセスできるようになります。
![スクリーンショット 2021-07-03 12.59.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/cce44d3c-b62b-b846-3d98-1190a01f0dee.png)

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

```
$ ssh -i ~/.ssh/udemysample.pem ec2-user@ec2-13-114-33-141.ap-northeast-1.compute.amazonaws.com
```
実行されているコンテナが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起動タイプのときと同様に、起動タイプなどを設定します。
![スクリーンショット 2021-07-03 13.24.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/306a9cf8-fb96-ae20-9a80-bf8a757e11c1.png)

ロードバランサーやAuto Scalingの設定はそのままでサービスを作成すると、以下のようにタスクが実行されます。
![スクリーンショット 2021-07-03 13.38.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/c8a8fa21-ca2c-8cd6-19f9-165dfd65db97.png)

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

#参考資料
https://www.udemy.com/share/103fe82@PkdKZFlYTFYJcEBSOGJNfT1t/

https://business.ntt-east.co.jp/content/cloudsolution/column-171.html

https://d1.awsstatic.com/webinars/jp/pdf/services/20200422_BlackBelt_Amazon_ECS_Share.pdf

https://zenn.dev/yoshinori_satoh/articles/2021-02-13-eks-ecs-compare