ECSクラスタのCPUとメモリをCloudWatchメトリックスで取得してみた

ECSのメトリックス(クラスタ毎のCPUとメモリ。サービス毎のCPUとメモリ)が取れるようになったようなので試してみたことのメモ。
今回はクラスタのCPUとメモリを取得。

[【AWS発表】EC2 Container Serviceの新しいメトリクス: ClusterとService](http://aws.typepad.com/aws_japan/2015/08/new-metrics-for-ec2-container-service-clusters-services.html)

# 参考

+ [Docker コンテナのメトリクス監視について雑にメモる](http://inokara.hateblo.jp/entry/201Docker コンテナのメトリクス監視について雑にメモる5/08/04/135820)
+ [CloudWatch で Amazon ECS のメトリクスが見れるようになったとのことなので確認してみた雑なメモ](http://inokara.hateblo.jp/entry/2015/08/19/224532)


# 負荷のかかるDockerを作る

負荷のかかるDockerをまずはローカルで作ります。

yesコマンドを実行し続けるDockerfileを作成

```lang: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を)を試す](http://qiita.com/toshihirock/items/406f3c2f11a836df172c)

```
#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
```


```lang: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'
```

確かにインスタンス追加後にがくっと減っていますね。(起動後すぐに減っているのは一度確認したため。。。)

![Screen Shot 2015-08-20 at 8.05.06 AM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/d73e4486-3c9b-1305-e596-5f660dd6ce4c.png "Screen Shot 2015-08-20 at 8.05.06 AM.png")

# 思ったこと

つらつら書きますが、間違ってたらコメントいただけると嬉しいです。

+ 今回の機能を使えば負荷に応じてEC2のオートスケールが可能
+ ただし、単純にEC2がオートスケールするでタスク(Docker)が新規に増えて負荷が分散されるわけではないので何かしら仕組みなりが必要
+ そうなるとそもそも単純なシステムの場合、OpsWorksを使うなりの方がシンプルで分かりやすい?

どういう時にECSを使うと便利なのか自分自身でいまいち消化できてないのでもう少し勉強します。。。