Amazon EC2 Container Service(ECS)をGUIから試してAWS側で用意したサンプルWebアプリを動かしたときのメモ。

[Amazon EC2 Container Service](https://aws.amazon.com/jp/ecs/)をGUIから試してAWS側で用意したサンプルWebアプリを動かしたときのメモ。

サンプルを利用することで2つのコンテナ(Docker)で構成された静的なWebアプリにアクセスできました。

# 参考

+ [Amazon EC2 Container Service-Getting Started](http://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_GetStarted.html)
+ [EC2 Container Serviceを使ってみる](http://qiita.com/con_mame/items/1df441d86c703a0e6fa6)


# Get Startted

![Screen Shot 2015-06-22 at 10.54.32 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/9bf1abe2-9653-9acf-fe73-f65a0498a41c.png)

最初の画面では **Get Started** を選択します

# Step1 Welcome to Amazon ECS

![Screen Shot 2015-06-22 at 10.57.12 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/07fdabb2-f0bf-8b96-4f10-f6a12b4132a6.png)

今回は独自の設定をするわけでなく、AWSの用意したサンプルを使うので**Amazon ECS sample**を選択します

# Step2 Create Task Definition from sample

![Screen Shot 2015-06-22 at 10.59.21 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/175a1a2d-3ac8-14d6-8eb8-70a4b85ec8a7.png)



次の画面では利用するコンテナ(docker)とボリュームを指定します。サンプルでは**sample-app**というhttpdのコンテナとWebアプリのhtmlを保存するコンテナの**busybox**を使っています。
仕組みなどについては下記が参考になりました。

[Data Volume と Data Volume Container](http://qiita.com/sokutou-metsu/items/b83b275198fc9594f5a4)

[Docker でデータのポータビリティをあげ永続化しよう](http://qiita.com/mopemope/items/b05ff7f603a5ad74bf55)

本サンプルでではどのようなhtmlを配置しているかについては上記画面のJSONタブを表示することで確認できます。

ちなみに以下のように設定されています。

```
{
  "family": "console-sample-app-static",
  "containerDefinitions": [
    {
      "name": "simple-app",
      "image": "httpd:2.4",
      "cpu": "10",
      "memory": "300",
      "environment": [],
      "portMappings": [
        {
          "hostPort": "80",
          "containerPort": "80"
        }
      ],
      "volumesFrom": [],
      "links": [],
      "mountPoints": [
        {
          "sourceVolume": "my-vol",
          "containerPath": "/usr/local/apache2/htdocs"
        }
      ],
      "essential": true
    },
    {
      "name": "busybox",
      "image": "busybox",
      "cpu": "10",
      "memory": "200",
      "entryPoint": [
        "sh",
        "-c"
      ],
      "environment": [],
      "command": [
        "/bin/sh -c \"while true; do echo '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p>' > top; /bin/date > date ; echo '</div></body></html>' > bottom; cat top date bottom > /usr/local/apache2/htdocs/index.html ; sleep 1; done\""
      ],
      "portMappings": [],
      "volumesFrom": [
        {
          "sourceContainer": "simple-app"
        }
      ],
      "links": [],
      "mountPoints": [],
      "essential": false
    }
  ],
  "volumes": [
    {
      "name": "my-vol",
      "host": {}
    }
  ]
}
```

# Step3 Schedule Tasks

![Screen Shot 2015-06-22 at 11.08.56 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/0e34860d-a214-a0de-31c1-64302c759205.png)

本画面ではタスクを以下のいずれかに設定します。

+ Run Tasks Once
+ Create a service

バッチ処理のような1回のみ処理を行う場合には**Run Tasks Once**を設定しますが、今回のhttpdのような永続的に実行されるものの場合、**Create a service**の方を選びます。

**Desired number of Tasks**と**Service Name**はデフォルトのままとします。

**ElasticLoadBalance**については**simple-app:80**を選択し、それ以外の設定はデフォルトとします。
ちなみに最初に上記値で**NoELB**を選択し、そのまま進めてみたのですが、クラスタの作成時に以下のようなエラーが表示されてしまいました。。。

>Created Service sample-webapp failed
> A role was passed, but no load balancers were present.

また、実際にインスタンスにSSHログインして確認しましたが、httpdとbusyboxのdockerが起動していませんでした。

```
$ docker ps -a
CONTAINER ID        IMAGE                            COMMAND             CREATED             STATUS              PORTS                        NAMES
e57e72e78e8f        amazon/amazon-ecs-agent:latest   "/agent"            11 minutes ago      Up 11 minutes       127.0.0.1:51678->51678/tcp   ecs-agent
```

# Step4 Configure Cluster

コンテナ(docker)を実行するEC2の設定を行います。

はじめに起動するインスタンス数やインスタンスタイプ、KeyPairを選択します。

![Screen Shot 2015-06-23 at 8.36.53 AM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/98db0b5f-a7a5-00a5-cdd0-93051114fa9a.png)

特に問題なければKeyPairのみ利用するものに変更します。

![Screen Shot 2015-06-22 at 11.40.12 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/e55117de-372a-44e9-5db2-48473b39b588.png)

次にアクセス元のIPアドレスを記載します。ここで指定したIPアドレスからのみ起動するhttpdにアクセスできます。特に制限をしない場合、デフォルトの**0.0.0.0/0**のままとします。

対象のEC2からECSの操作をするためにIAMロールを設定します。初めてECSを操作する場合、**Create IAM Roles**ボタンを押下することでECSを操作するためのIAMロールを作成できます。

# Launch

全体の構成を確認し、問題なければLaunchします。EC2の起動や設定などをCloudFormationを使っているようで、詳細を確認したい場合、リンクをクリックしてCloudFormationの画面で実施内容など確認できます。以下はECS上での進捗状況の確認画面となります。

![Screen Shot 2015-06-22 at 11.48.00 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/62524a58-be5e-f746-0deb-4c2b0ba2d365.png)

起動が完了すると起動したEC2やELBの情報など様々な情報が確認できます。

起動直後は**sample-webapp**のStatsuがPENDINGとなっていますが、少し時間が経つとRUNNINGに変わります。

![Screen Shot 2015-06-22 at 11.52.36 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/6fc23caf-949d-36b7-0969-7a7c204649db.png)

また、上記よりELBの画面を確認し、インスタンスがELBにアタッチされているのを確認します。アタッチ済みであればELBで設定されているURLにアクセスしてみます。

問題なければ以下のような画面が表示されます。

![Screen Shot 2015-06-22 at 11.58.06 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/b5e936d9-67a5-2df7-0efc-faa0bf2a4ddf.png)

# 対象のインスタンスにSSHログインしてみる

上記のGUIによる設定をした場合、コンテナ(docker)を動かすEC2にKeyPariの設定はされていますが、SecurityGroupの設定で22の許可がされていないため、対象のEC2にはログインできません。ECSを使えばSSHしなくても大丈夫ということだと思うのですが、何かあって調査できるようにするためにSSHログインできるようにしてみます。（運用する場合はSSHログインできない状態のままとするのが正しいと思います）

ECSの画面からdockerを動かすために起動されたEC2が確認できるのでそのEC2に設定されたSecurityGroupの22ポートを開放すればOKです。

```
$ssh ec2-user@52.69.31.141 -i hogefugaKey.pem

   __|  __|  __|
   _|  (   \__ \   Amazon ECS-Optimized Amazon Linux AMI 2015.03.d
 ____|\___|____/

For documentation visit, http://aws.amazon.com/documentation/ecs
2 package(s) needed for security, out of 2 available
Run "sudo yum update" to apply all updates.
```

`docker ps`コマンドをタイプすることでGUIで指定した2つのdockerとECSと通信を行う**ecs-agent**というdockerが動作しているのが確認できます。

```
$docker ps
CONTAINER ID        IMAGE                            COMMAND                CREATED             STATUS              PORTS                        NAMES
1e292fd54f47        busybox:latest                   "\"sh -c '/bin/sh -c   8 hours ago         Up 8 hours                                       ecs-console-sample-app-static-5-busybox-86f3a5c7add9d5fd4d00
9c7dd2d8490b        httpd:2.4                        "httpd-foreground"     8 hours ago         Up 8 hours          0.0.0.0:80->80/tcp           ecs-console-sample-app-static-5-simple-app-9aefdfbc92fcbce23600
b6cd81e19b7d        amazon/amazon-ecs-agent:latest   "/agent"               8 hours ago         Up 8 hours          127.0.0.1:51678->51678/tcp   ecs-agent
```

# お掃除

一通り確認が終わったので削除します。
ECSの画面からクラスタを削除しようとすると以下のエラーが表示され、削除ができません。。。。

> Unable to delete cluster
> The Cluster cannot be deleted while Container Instances are active.

削除するときの注意画面で「CloudFormation使ってStackの更新か削除をしてね」とあったので、CloudFormationの画面からECS作成時のStackを選択し、delete stackします。stack名は **EC2ContainerService-default-xxxxx**という形になっているかと思いますのでそのstackを**delete stack**して削除します。

CloudFromationで削除したのはあくまでStackと関連したリソースのみ(ELB,EC2,SecurityGroup etc...)でECSのクラスタ、サービスは残っているのでECSの画面から削除します。

まずは **sample-webapp** サービスを削除します。
がGUIから削除しようとすると以下のエラーが。。

>The service cannot be stopped while the primary deployment is scaled above 0.

検索すると以下の記事を発見。

[Delete a cluster : impossible ! (Via UI or CLI)](https://forums.aws.amazon.com/thread.jspa?messageID=614116)

上記記事に従ってコマンドを実施します。

```
$aws ecs update-service --service sample-webapp --desired-count 0
```

上記実施後、GUIからサービスを削除することが出来ました。。。
また、サービス削除後であればGUIからクラスタの削除も可能となります。