目的

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

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.