AWS ECS(fargate)のコンテナオートスケーリングと動作確認


#はじめに
ECS(fargate)のオートスケーリングってどんな動きをするんだろう。
試してみよう！

##構成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/3d9811b5-6833-d3d6-11c1-dc683196ef70.png)

##前提条件
クライアントマシン（自分のローカルPC）に以下がインストールされていること。
・docker
・JMeter

クライアントマシンはwindows 10(64bit)を利用

#では、やっていきましょう
【AWS】：AWSコンソールでの作業
【local】：クライアントマシンでの作業
##ECRの作成【AWS】
誰でもできるので割愛します。
※アクセス許可設定お忘れなく。
##ELBの作成【AWS】
誰でもできるので割愛します。
※ELBセキュリティグループのinbound 8080 は開けておいてください。
##ECSの作成【AWS】
今回は、fargateを利用するので、リージョンは「バージニア北部」を利用します。
クラスターテンプレートは以下を利用
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/fd8b4393-5015-c885-b814-963bfb9fe6c9.png)

VPCは本記事では記載しませんが、一般的なパブリックサブネットを利用します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/c0967a05-b157-c559-e56f-26e51f16ca27.png)

##dockerイメージ(httpd)の作成【local】
コマンドプロンプトで実行
`docker pull httpd`

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/de589c4f-8d2c-3e91-503c-11a0510d01c3.png)

動かしてみる
`docker run -d -p 8080:80 httpd`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/e6ef79c9-3d27-77c3-b5fd-5d1eafbed7b6.png)

以下をwebブラウザに入力して確認
http://localhost:8080/

動いてますね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/2e2903cb-9a9a-48b4-2732-37a39007bd5a.png)

##dockerイメージをECRに投入【local】
・ECRにログイン
コマンドプロンプトで以下実行
`aws ecr get-login --no-include-email --region us-east-1`

↑のコマンドで取得したloginコマンドをさらに実行

dockerイメージへのタグ付け
`docker tag httpd:latest xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/osak:httpd`

ECRへのpush
`docker push xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/osak:httpd
`

ECRへの投入が完了しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/64f1d539-b06f-cbde-d688-ca82e18b991b.png)


##ECSでタスク定義の作成【AWS】
ECRのdockerイメージをベースにしたタスクを作ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/a7de3dc8-4e3e-9879-fb32-e45921bb16a8.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/9937e588-7c81-44a7-0898-ef0adac2c208.png)

必要なメモリ量とcpuの設定する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/d6a4d23a-695c-cf77-a4f1-9038208f3d0d.png)

コンテナ追加時に、先程ECRに登録したdockerイメージを設定する。
コンテナポートは80を指定。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/7a3ab9f8-467c-2271-16fd-439f976c48af.png)


##ECSでサービスの作成【AWS】
作成したタスクを動かすためのサービスを作成する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/c7decb4b-4311-b4f3-ff0c-d594616eb8b7.png)

ネットワーク構成
　ＶＰＣとセキュリティグループについては、適当なパブリックサブネットを選択。
　本記事には明記しません。

ロードバランサー設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/6bb03a7d-d811-46a9-4fdc-b575d7dd14d9.png)


ロードバランサーのドメインの8080ポートにアクセスが来た場合、
コンテナの80ポートに流す設定をする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/907e2a55-b125-94d7-b979-6703b6e6ce06.png)

オートスケーリング設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/629524f8-8553-7db2-62f6-2fd69b49fbb8.png)

今回は、CPU使用率が30%を超えたらオートスケーリングするよう設定します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/bbcbaccf-2d71-9177-3046-21bfccdbc592.png)


##動作確認①【local】
以上でECS(fargate)上にhttpdのコンテナが立ち上がるようになっています。
早速クライアントマシンから確認してみましょう。

webブラウザに以下urlを入力します。

`http://<サービスで設定したELBのドメイン>:8080/`
※サンプル
`http://xxxxxxxxxxxxxxxxxx.us-east-1.elb.amazonaws.com:8080/`

ブラウザに以下が表示されればOK
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/5af7467c-1572-4294-00fb-49302d60c1af.png)

準備は完了。
オートスケーリングさせてみましょう。

##JMeterで負荷をかける【local】
以下を参考
> https://www.skyarch.net/blog/?p=12594

・スレッドグループ作成

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/13fc4371-53e5-d406-7bb3-cb2d2bad6a79.png)

・HTTPリクエスト設定
「サーバ名またはIP」にはELBのドメイン名を入力
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/3ad8b6ee-bc24-fd00-30ca-ddad234e5da7.png)

「結果をツリーで表示」「統計レポート」を追加。

##動作確認②【AWS】【local】
これで、全ての準備が整いました。
さっそく爆撃してオートスケーリングを確認していきましょう。

■初期状態

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/bcaf27fd-118e-345f-d024-8d21f976f0ca.png)

JMeterの再生ボタンを押下。
大量のHTTPリクエスト(GET)処理が走ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/9e9992b2-f27d-612f-85a1-414109378ff3.png)

■数分後
Cloudwatchにてアラームが発生します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/b8f06c62-f913-0bc6-a257-e3a73a828b3a.png)

コンテナの数が、自動で3に増えました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/fd82a1c4-5b65-2dfa-4e04-8515cb071fd3.png)

一度はCPU50%を超えていましたが、
オートスケーリングにより、CPUが安定しました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/3894059e-27f6-d6e1-5196-76884172791e.png)

■JMeterを停止後
自動で元の性能にもどりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/289d90f3-4ce6-8448-fa9c-d2210bf2a810.png)

#まとめ
・オートスケーリングの手軽さが凄い
EC2クラスターの場合は、EC2のスケーリングも考えなければなりませんでしたが、
fargateの場合は、単純にタスクにいくらCPU・メモリを割り当てるか。
どこまでコンテナを増やすかに注力できるので非常に便利そうです。