ゼロからはじめる Amazon Elastic Container Service (ECS) ver2 の巻

#目的
ECS のスケールアウトを試す

ver1 がもろもろの事情で、前提が多くなりすぎたため、
前提を整えて再挑戦

#目標
コンテナにstress ツールで負荷をかけ、高速にスケールアウトできるか試す

#期待する効果
とにかく早く起動できるのではないか？
一分に500VM が展開できる～とかになれば夢がある

#前提
Ubuntu 16系　端末｛
Docker 導入
ECS-CLI　導入
｝

アカウントへECS の許可追加
アクセスkey と シークレットkeyをメモ
コンテナ用の設定ファイルの作成

Amazon ECS の設定{
タスク定義
サービスの設定
クラスターの設定
｝

コンテナへssh　接続
sstress 実施
スケールアウトの確認


#端末での作業
##AWS アカウントへECS関連 の許可追加
下へのアクセスが必要になります
　※個別にどのIAM を許可したら良いか分からず、admin で実験
■Requires attributes
com.amazonaws.ecs.capability.docker-remote-api.1.18
ecs.capability.task-eni
ecs.capability.execution-role-awslogs
com.amazonaws.ecs.capability.logging-driver.awslogs
com.amazonaws.ecs.capability.docker-remote-api.1.21
com.amazonaws.ecs.capability.docker-remote-api.1.19

##Ubuntu のセットアップ
###ECS CLI を導入
下のサイトに従い、ECS CLI を導入
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ECS_CLI_installation.html

sudo apt -y install curl
sudo curl -o /usr/local/bin/ecs-cli https://s3.amazonaws.com/amazon-ecs-cli/ecs-cli-linux-amd64-latest
sudo chmod +x /usr/local/bin/ecs-cli
ecs-cli --version
バージョンが出力されれば成功


###Amazon CLI の導入
公式サイトを参照
https://docs.aws.amazon.com/ja_jp/streams/latest/dev/kinesis-tutorial-cli-installation.html

sudo apt install -y python-pip
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
sudo python get-pip.py
sudo pip install awscli
aws configure

アクセスkey や シークレットkey は、各自の情報をインプットして下さい
Default region name　を　us-east-1　に指定

これで完了

##Docker の導入
下の公式サイトを参照
http://docs.docker.jp/engine/getstarted/index.html

sudo curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo docker version


##Docker イメージの作成
Docker ファイルのダウンロード
sudo curl -LO https://raw.githubusercontent.com/HaHatake/ECStest/master/Dockerfile

Docker ファイルをコンテナイメージ化する。＋タグ:web を付与
docker build -t web .

Dockerイメージをコンテナとして起動
docker run -d -p 22:22 web

コンテナのip を確認する
 docker ps
 出てきたコンテナのID をメモ

docker inspect コンテナのID
 出てきたip をメモ

コンテナへssh ログイン
私の場合は、下のip だった
ssh root@172.17.0.2

パスワードは、academy_0033

ログインできたら、完了。
exit

##ECS へイメージのアップロード
下の手順で実施
Amazon ECS へログイン >
Repositories >
getstart >
レポジトリに好きな名前を設定 >
表示されたコマンド　４つのコマンドを端末で実行する

##ECS の作成
###クラスターの作成
ECS ポータル　＞　クラスター　＞　クラスターの作成　＞　ネットワーキングのみ　＞　必要なネットワーク設定を入力　＞　作成
必要数は、1、最大4つまでスケールアウトするように設計


###タスクの定義
ECS ポータル　＞　タスク定義　＞　新しいタスク定義の作成　＞　Fargate > タスク定義名など、必要な情報を入力　＞　コンテナの追加　＞


##オートスケールの作成
下のサイトを参照
https://aws.amazon.com/jp/blogs/news/automatic-scaling-with-amazon-ecs/
今回は、CPUUtilization　30 を値に最大4 までスケールアウトする設計にした。
後は、デフォルトの300秒までは、追加スケールイン/アウトしない設定で実行


##コンテナへssh ログイン
ECS ポータル　＞　クラスター　＞　タスク　＞　タスク名　にある
パブリックIP 目掛けて、ssh を実行
端末で、
ssh root@xxx.xxx.xxx.xxx

パスワードは、academy_0033 

##コンテナへCPU 負荷をかける
stress --cpu 50 --timeout 20m

負荷状況は、ECS ポータルから確認できる
ECS ポータル　＞　クラスター　＞　サービス　＞　メトリックス　＞　CPUUtilization
上のコマンドを実行すると、最大100% 平均50% 程度のCPU 利用率になる
高負荷状態になると必要数が、1から4まで自動で増えて、ssh コンテナが自動で増えているのが分かる。

増えたコンテナにログインするならば
ECS ポータル　＞　クラスター　＞　タスク　＞　タスク名　にある
パブリックIP 目掛けて、ssh を実行
端末で、
ssh root@xxx.xxx.xxx.xxx
stress ツールを終了　or　20分が経過すると、ESC によって、自動的にスケールインしてくれる




#Tips
下のサイトを参照
https://qiita.com/fist0/items/2fb1c7f894b5bdff79f4

コンテナを問答無用で削除
docker ps -aq | xargs docker rm

イメージを問答無用で削除
docker images -aq | xargs docker rmi

##二回目以降にコンテナを作成する場合
ECS コンソールから、タスク定義　＞　新しいタスク定義の作成


FARGATE の作成


タスクとコンテナの定義の設定　にて、
タスク定義名、タスクロール（デフォルト：ecsTaskExecutionRole)、タスクメモリ、タスクCPU を設定


その後、コンテナ定義にて、
コンテナの追加　＞　必要事項を入力　＞削除


Tips
コンテナのイメージ指定は、下のように ECR で実施
ECS ポータル　＞　ECR ＞　リポジトリ　リボジトリのURI 


下のように表示されればOK
ここで、エラーが出るようなら、恐らくアマゾンアカウントのIAM 許可が出ていないため、管理者へ問合せすること。


##コンテナをサービスとして登録
ECS コンソールから、クラスター　default を選択。※新規作成
![Screenshot from 2018-03-16 13-24-04.png](https://qiita-image-store.s3.amazonaws.com/0/184724/84b60766-7b62-a6fb-fc4f-05b241f7481d.png)

##クラスター削除時にエラー発生
Network vpc-0c3d8777 has some mapped public address(es). Please unmap those public address(es) before detaching the gateway.
ゲートウェイのパブリックIP をデタッチしろってことか？
VPC を調べるもElasticIP があるわけでもなく、わからぬ。。。
もしや、タスクが残っていたかと思い確認。
ECS ポータル＞タスク　を選択して、"登録解除" して、再度、クラスター削除を実行。
またもエラー
ECS ポータル＞クラスタ　＞タスク　＞すべて停止　して、再度クラウスター削除を実行。
でもダメだった。。。

タスク定義時に下のアラートが発生。まぁ、無視。
Your containers in the task will share an ENI using a common network stack. Port mappings can only specify container ports (any existing host port specifications will be removed).