目的
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 を選択。※新規作成
クラスター削除時にエラー発生
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).