ECSのチュートリアルを見ながらやってみた

[チュートリアル: ECS CLI を使用して EC2 タスクのクラスターを作成する](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ECS_CLI_tutorial_EC2.html)を参考に学習をしてみた。自分なりに解釈を加えたので、間違っている場合もありますのでその際は、ご指摘下さい。

##:sunny:ECSの概要

こちらの図を拝借して・・・

[ECS Getting Start](https://ap-northeast-1.console.aws.amazon.com/ecs/home?region=ap-northeast-1#/firstRun)


<img width="786" alt="スクリーンショット 2018-08-14 20.26.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/79473/c7ecac32-a2a2-912e-fbfc-1ad135c52e6d.png">

**Cluster:** ECSを束ねるもの、よくあるサーバ群の普通のClusterを想像すれば良い

**Service:** ECSのタスク定義(Task definition)で指定した数のインスタンスを起動させ同時に実行、更に維持させる。例えばTaskが落ちた際にはServiceで指定した数より小さくなるため自動で一つタスクが自動起動する

**Task definition:** DockerイメージやCPUメモリ、linkなどを定義するもの

##:sunny:事前作業
予め以下の2つを作っておく
・VPCを1つ
-今回は `10.0.0.0/16` で作った

・作成したVPC内にサブネットを2つ(別のAZで)
- `ap-northeast-1a` に `10.0.0.0/24`と `ap-northeast-1c` に `10.0.1.0/24` を作成した。

##:sunny:Amazon ECS クラスター名を設定
まずは、Amazon ECS CLI で使用する Amazon ECS クラスター名を設定。この情報はローカル環境(今回はMAC)の `~./ecs/config` に保存される

```
$ ecs-cli configure --cluster ClusterA --region ap-northeast-1 --default-launch-type EC2 --config-name clustername
```

`--config-name` は `clustername` は後で使用するので覚えておくこと。忘れたら `~./ecs/config` の内容を見る


##:sunny:クラスタの作成
【前提条件】
・keypairは「webkey.pem」(これは予めaws consoleで作成しておくこと)
・2台のt2.mediumを作成する。

```
$ ecs-cli up --keypair webkey.pem \
--capability-iam \
--size 2 \
--instance-type t2.medium \
--cluster-config clustername \
--vpc vpc-0fcXXXXXXXXXXXXXX \
--subnets subnet-0eef76fXXXXXXXXX,subnet-07a826YYYYYYYYYY 


INFO[0000] Using recommended Amazon Linux AMI with ECS Agent 1.20.1 and Docker version 18.03.1-ce
INFO[0000] Created cluster                               cluster=ClusterA region=ap-northeast-1
INFO[0001] Waiting for your cluster resources to be created...
INFO[0001] Cloudformation stack status                   stackStatus=CREATE_IN_PROGRESS
INFO[0062] Cloudformation stack status                   stackStatus=CREATE_IN_PROGRESS
INFO[0122] Cloudformation stack status                   stackStatus=CREATE_IN_PROGRESS
Security Group created: sg-0a599d11111111111
Cluster creation succeeded.
```

これはCloudformationで作成される。

ちなみに上記は1台で作ったが4台にしたい場合は、 `scale` オプションで変更を行う。
`scale` を使って変更できる内容は [ECS Scale](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/cmd-ecs-cli-scale.html) を参照

```
$ ecs-cli scale --size 4 --capability-iam
```

のように `scale` をつける。この場合、最初に作成したEC2インスタンスはダウンすることなく追加2台で合計4台となる

##:sunny: docker-compose.yml を作成
ここでDockerのコンテナを作成する、 `docker-compose.yml` を作成する。
これはDockerでお馴染みのファイルである。これと `Dockerfile` を組み合わせて次回はやってみようと思う。

```
version: '3'
services:
  wordpress:
    image: wordpress
    ports:
      - "80:80"
    links:
      - mysql
    logging:
      driver: awslogs
      options: 
        awslogs-group: kumonavi-wordpress
        awslogs-region: ap-northeast-1
        awslogs-stream-prefix: wordpress
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
    logging:
      driver: awslogs
      options: 
        awslogs-group: kumonavi-mysql
        awslogs-region: ap-northeast-1
        awslogs-stream-prefix: mysql
```

次に `ecs-param.yml` を作成する。これはCPUやメモリの情報を記したもので `docker-compose.yml` が Version3の場合は作成する必要がある。

```
version: 1
task_definition:
  services:
    wordpress:
      cpu_shares: 100
      mem_limit: 524288000
    mysql:
      cpu_shares: 100
      mem_limit: 524288000
```

##:sunny:サービスを作成する。
今回は `docker-compose.yml` に記載したwordpressのWEB+DBを作成する。

下記の `up` コマンドは `create` と `start` の合わせ技です。 `create` で サービスの定義を作成し、 `start` でタスク定義から 1 つの Amazon ECS タスクを開始します。

```
$ ecs-cli compose service  up  --cluster-config kumonavicluster

INFO[0000] Using ECS task definition                     TaskDefinition="ecs:2"
INFO[0000] Created an ECS service                        service=ecs taskDefinition="ecs:2"
INFO[0000] Updated ECS service successfully              desiredCount=1 serviceName=ecs
INFO[0015] (service ecs) has started 1 tasks: (task AAAA-22222ー333333
-1111111111).  timestamp="2018-08-15 00:52:25 +0000 UTC"
INFO[0090] Service status                                desiredCount=1 runningCount=1 serviceName=ecs
INFO[0090] (service ecs) has reached a steady state.     timestamp="2018-08-15 00:53:42 +0000 UTC"
INFO[0090] ECS Service has reached a stable state        desiredCount=1 runningCount=1 serviceName=ecs

```

##:sunny:サービスを2つにする

```
$ ecs-cli compose service scale 2
```

##:sunny:確認作業

```
$ ecs-cli ps
Name                                            State                Ports                     TaskDefinition
485cb1ed-1e40-11111-2222-a5e47aw31253a/mysql      RUNNING                                        ecs:3
485cb1ed-1e40-11111-2222-a5e47a22223a/wordpress  RUNNING              1.1.2.2:80->80/tcp  ecs:3
4f4d1431-df3d-11111-2222-69f432222268/mysql      RUNNING                                        ecs:3
4f4d1431-df3d-4616-a9a8-69f43b22228/wordpress  RUNNING              1.1.3.3:80->80/tcp   ecs:3
```


##:sunny:お掃除
最後はきれいにします。

まずはサービスを削除します。

```
ecs-cli compose service rm --cluster-config cluster-name
```

次にクラスターを削除します。

```
ecs-cli down --force --cluster-config cluster-name
```