ECSのメトリックス(クラスタ毎のCPUとメモリ。サービス毎のCPUとメモリ)が取れるようになったようなので試してみたことのメモ。
今回はクラスタのCPUとメモリを取得。
【AWS発表】EC2 Container Serviceの新しいメトリクス: ClusterとService
参考
- [Docker コンテナのメトリクス監視について雑にメモる](http://inokara.hateblo.jp/entry/201Docker コンテナのメトリクス監視について雑にメモる5/08/04/135820)
- CloudWatch で Amazon ECS のメトリクスが見れるようになったとのことなので確認してみた雑なメモ
負荷のかかるDockerを作る
負荷のかかるDockerをまずはローカルで作ります。
yesコマンドを実行し続けるDockerfileを作成
FROM ubuntu:latest
MAINTAINER toshihirock
CMD yes > /dev/null
ビルド、実行
# build
$docker build -t toshihirock/stress-cpu:latest .
# run
$docker run -d --name stress-cpu toshihirock/stress-cpu
Dockerの負荷を確認してみる
$docker stats --no-stream=true stress-cpu
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O
stress-cpu 71.23% 204.8 kB/1.046 GB 0.02% 1.457 kB/738 B
良い感じ。
終わったので削除。
# stop
$docker stop stress-cpu
# delete
$docker rm stress-cpu
イメージをDocker Hubに登録
$docker login
$docker push toshihirock/stress-cpu
ECSで使うIAMロールの設定
ECSで使うIAMロールをあらかじめ作成しておきます。
- ECSの許可
- CloudWatchの許可
を行う必要があります。(以前に作ったECSのIAMロールを使おうとしたらCloudWatchへの許可がなかったため、メトリックスが取れなかった。。。)
ECSで試す
CLIからやります。
詳細は以前に書いたので今回はざっくり。
CLIでECS(EC2 Container Serviceを)を試す
# creaete cluster
$aws ecs create-cluster --cluster-name MyCluster
# launch instance and register cluster using userdata
$aws ec2 run-instances \
--image-id ami-8aa61c8a \
--instance-type t2.micro \
--subnet-id subnet-d949e1ae \
--iam-instance-profile Name=ecs-full-access \
--user-data IyEvYmluL2Jhc2gNCmVjaG8gRUNTX0NMVVNURVI9TXlDbHVzdGVyID4+IC9ldGMvZWNzL2Vjcy5jb25maWc= \
--security-group-ids sg-baca56df \
--key-name HogefugakKey \
|jq -r '.Instances[].InstanceId'
# create task file
$vi stress-cpu-task.json
[
{
"image": "toshihirock/stress-cpu",
"name": "stress-cpu",
"cpu": 10,
"memory": 500,
"essential": true,
"environment": []
}
]
# register task
$aws ecs register-task-definition --family stress-cpu --container-definitions file://stress-cpu-task.json
$aws ecs run-task --cluster MyCluster --task-definition stress-cpu:1
コンソールで確認し、stress-cpuのタスクが実行されていて、少し経過したらクラスタメリトックスにCPUほぼ100%使っている感じになればOKです。(この時のキャプチャを撮り忘れました。。。。)
インスタンスを追加してみる
負荷が高いのでインスタンスを一つ追加して変化を確認します。
$aws ec2 run-instances \
--image-id ami-8aa61c8a \
--instance-type t2.micro \
--subnet-id subnet-d949e1ae \
--iam-instance-profile Name=ecs-full-access \
--user-data IyEvYmluL2Jhc2gNCmVjaG8gRUNTX0NMVVNURVI9TXlDbHVzdGVyID4+IC9ldGMvZWNzL2Vjcy5jb25maWc= \
--security-group-ids sg-baca56df \
--key-name HogefugakKey \
|jq -r '.Instances[].InstanceId'
確かにインスタンス追加後にがくっと減っていますね。(起動後すぐに減っているのは一度確認したため。。。)
思ったこと
つらつら書きますが、間違ってたらコメントいただけると嬉しいです。
- 今回の機能を使えば負荷に応じてEC2のオートスケールが可能
- ただし、単純にEC2がオートスケールするでタスク(Docker)が新規に増えて負荷が分散されるわけではないので何かしら仕組みなりが必要
- そうなるとそもそも単純なシステムの場合、OpsWorksを使うなりの方がシンプルで分かりやすい?
どういう時にECSを使うと便利なのか自分自身でいまいち消化できてないのでもう少し勉強します。。。