【自分用メモ】ECS Workshop - Cats and Dogs-をやってみた感想

今までコンテナに触れたことがなく、触りたい触りたいと思っていたのですが、なかなか手が出せていませんでした。
そんな時、[jp-contents-hub](https://aws-samples.github.io/jp-contents-hub/)の存在を知り、ECSのハンズオンも多数あることを知りました。

ハンズオンは手順書に記載されている通りにやれば出来てしまうから思考停止でやってしまうことがよくあり、「結局何も身につかないんじゃないか」と思って今まで敬遠していましたが、最近転職活動をしていた中で色々思うところがあり、下記のような結論に達しました。

```
最初から完璧じゃなくてええねん！！！！！
```

最初から「何かを身につけたい」とか「完璧に理解しよう」と思って物事を始めると億劫になって何も出来ないor続かない‥というのが私のいつものパターンでした。
なのでまずはハンズオンをやってみて、その過程で心を動かされたことをつらつらと書き留めていくことにしました。
心を動かされたことの定義は「へぇ......」と思ったことです。トリビアの泉のあのボタンが心の中にあるイメージです。
頭で理解したことは結局忘れるけど、「へぇ.....」と思ったことは結構覚えていたり引き出すことができるので、「へぇ....」を書き留めていくのです。
(なので、下記に出てくるheh1、heh2...のhehは、「へぇ」という意味です。)

# heh1 DockerFile
Dockerイメージをビルドする時に必要となる設定ファイル。
ハンズオンでは下記のようなDockerFileを使っていた。

FROM句はコンテナのベースとなるイメージを指定する。下記の例ではngixと指定しているが、そうするとDockerイメージをビルドする時にngixを構築してくれるっぽい。実際、ビルドコマンド実行したらngixをインストールしたり設定していた。

```Dockerfile
FROM nginx
EXPOSE 80
RUN apt-get update -y && \
  apt-get upgrade -y && \
  apt-get install -y curl && \
  cd /tmp && \
  apt-get install awscli -y && \
  rm -rf /tmp/* && \
  rm -rf /var/lib/apt/lists/*
COPY ./default.conf /etc/nginx/conf.d/default.conf
COPY ./index.html /usr/share/nginx/html/index.html
CMD nginx -g "daemon off;"
```

# heh2 ECSは内部的にCloudFormationを使っている。
びっくりしたよね。

![スクリーンショット 2022-10-01 14.31.16.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100334/18fe2f41-bc89-dacb-8889-c807d3a07da0.jpeg)

# heh3 ECSクラスターはコンテナ本体ではない
クラスターとは、サービスの集合体のようなイメージと理解した。
クラスターとかサービスとかタスクとかごちゃごちゃしすぎてよくわからん.....

# heh4 タスク定義には複数のコンテナを含むことができる
今まで1タスクに1コンテナだと思ってた
![スクリーンショット 2022-10-01 15.06.38.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100334/690dcd47-11b2-fe2f-833c-dd9d3e76f149.jpeg)

# heh5 Fargate起動モードではタスクレベルでCPUとメモリを指定する必要がある
Fargate起動モード=サーバレスを実現したい時に使用するモード....というイメージがあったため
明示的に指定する必要があるとは思っていなかった。
でもよく考えるとLambdaもメモリサイズ指定しなきゃいけなかったし似たようなものなのか？

![スクリーンショット 2022-10-01 15.31.59.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100334/7fca6e14-7f8c-c7e4-ef26-2adaa77af56d.jpeg)


# heh6 「サービスの起動」で初めてコンテナが起動される

タスク定義を指定したり
![スクリーンショット 2022-10-01 15.45.56.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100334/944d6bec-008f-a4c8-58d6-35d2990d8ae7.jpeg)

使用するALBを指定したり
![スクリーンショット 2022-10-01 15.47.24.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100334/79e04a1f-dbdb-3c0d-04f1-e580a63bd675.jpeg)

どのALBターゲットグループに追加するか選択したりした
![スクリーンショット 2022-10-01 15.48.06.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100334/ffca029a-9ce6-ac71-f967-4486c6672108.jpeg)

# heh7 デプロイサーキットブレーカーという機能が便利そう
サービスデプロイ時に異常発生した場合、正常に動いていたバージョンに自動ロールバックしてくれるっぽい。
最初見た時は、マイクロサービスのサーキットブレーカーパターンを自動で実装してくれるのかと思ってたけどそれとは違うっぽい。

# heh8 サービス起動時、FargateはVPCやサブネットを指定する必要がある
タスク定義のネットワークモードが「awsvpc」の時は設定する必要があるらしい。
(Fargateのネットワークモードはawsvpcしか指定出来ない。)
![スクリーンショット 2022-10-01 16.08.36.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100334/3693a180-4759-96a7-fc75-bd899abdcc21.jpeg)

EC2起動モードの時はVPCやサブネットを指定する必要なかったのだが、なぜ？
→タスク定義のネットワークモードがdefaultの場合、自動で設定してくれるっぽい
![スクリーンショット 2022-10-01 16.12.59.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100334/27c49e29-66e9-b926-b54b-2323fd7916f6.jpeg)

Classmethod様の[ECSでEC2インスタンスを利用する際のネットワークモードについて調べてみた](https://dev.classmethod.jp/articles/ecs-networking-mode/)が分かりやすそう。

# heh9 コンテナとマイクロサービスアーキテクチャの親和性がなんとなくわかった。
今回のハンズオンで作成したアプリケーションは下記のような感じ。

トップ画面
![スクリーンショット 2022-10-01 16.26.06.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100334/becdd722-0bda-a666-1f28-068886bbf467.jpeg)

「I love CATS」をクリックするとCATS画面に遷移する
![スクリーンショット 2022-10-01 16.27.09.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100334/4d74f143-fef5-7183-9e2e-25f7b7387fa9.jpeg)

「I love DOGS」をクリックするとDOGS画面に遷移する
![スクリーンショット 2022-10-01 16.27.56.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100334/29ca6e70-9a10-b697-7c8a-87134897015c.jpeg)

トップ画面、DOGS画面、CATS画面はそれぞれ別のコンテナで動いている
![スクリーンショット 2022-10-01 16.32.00.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100334/4842e439-b4fc-f896-4e6e-ac3e13976ead.jpeg)

つまりトップ画面、DOGS画面、CATS画面がそれぞれ独立したアプリケーションのイメージ。
→従来の3つの画面が一体化したアプリケーションと比べると、改修する場合も全体に手を加える必要はなく、個別のアプリケーションを改修しDockerイメージをビルドし、デプロイすれば良い。

# heh10 Autoscalingを設定すると勝手にCloudWatchアラームも設定してくれる
Service Auto Scaleを設定した。
webへのリクエスト数が4000以上になるとスケールアウトするように設定したらCloudWatchアラームも閾値が同条件で自動生成されていた。
![スクリーンショット 2022-10-02 8.27.55.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100334/103217d5-f6cc-9b03-0ee1-53fc4e4c93e5.jpeg)

# heh11 Apache Benchが便利
AutoScaleのテストのため、下記のコマンドを実行した。
今までJmeterしか知らなかったので、気軽にテストしたいならApache Benchで良いなと思った。
```shell
ab -c 200 -n 200 -t 30 demogo-alb-1967437663.us-east-1.elb.amazonaws.com/
```
>Apache Bench (ab) は Apache HTTP Server に同梱されている web サーバーの性能テストツールであり、Cloud9 にはデフォルトでインストールされています。c オプションは同時に並列実行する数を指定でき、n オプションは生成するリクエスト数を表しています。また、t オプションはサーバーからのレスポンスの待ち時間を指定しています。

# 残った疑問点
ECSのAutoScalingタイプには2つあった。Service AutoScaleとCluster AutoScale。違いは何か？
前者はコンテナを増減させる、後者はEC2をインスタンスごと増減させる？
後者については[Deep Dive on Amazon ECS Cluster Auto Scaling](https://aws.amazon.com/jp/blogs/containers/deep-dive-on-amazon-ecs-cluster-auto-scaling/)が参考になるらしい。読めたら読もう。


# 感想
今回のハンズオンをやったことで、特にheh9に記載したコンテナの独立性について実感できたのが良かったように思えます。CI/CDと相性が良い理由もなんとなく分かりましたが、こちらもハンズオンを実施し実感したいです。
でもApp MeshやApp RunnerやLightsailなど、聞いたことはあるが手をつけていないサービスも実践してみたいですね。