ECS
の巻
ゼロから
ElasticContainerService

ゼロからはじめる 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 >
レポジトリに好きな名前を設定 >
表示されたコマンド 4つのコマンドを端末で実行する

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

クラスター削除時にエラー発生

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).