Amazon EC2 Container Service Previewを使ってみる

mazon EC2 Container Service Previewを使ってみる




先に発表されたawsのコンテナサービスECSのpreviewに申し込んでいたのですが、welcomeメールがきましたので[コチラのページ](http://docs.aws.amazon.com/AmazonECS/latest/developerguide/get-set-up-for-amazon-ecs.html
)を参考に早速触ってみます


弊社はコンテナサービスにに大注目してます

GKEの試してみたは[こちら](http://qiita.com/n0bisuke/items/d495813ff5939f0ee596)


#Create an IAM User
IAM consoleからグループを作成します

![](http://gyazo.com/dbe0ad16a1199a5077593c187aa5179e.png)

![](http://gyazo.com/213aee175018329a50160626ba6548a4.png)

とりあえずAdministratorで作成

![](http://gyazo.com/67a9192f8a5d082d32c51edf85ed2818.png)

nextからcreate groupをクリックして完了です


```
AdministratorAccess-ecs-group-201412201326
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "*",
      "Resource": "*"
    }
  ]
}
```

ユーザーを作成します

![](http://gyazo.com/69520f25c70e2ba271da21c977f79cb1.png)

ecs-testで作成してみます

![](http://gyazo.com/de8d9d8eacf7b12a0e08eb25a5973f4c.png)

Security Credentialsを確認してDownload Cresentialsしておきましょう

続いて先ほど作ったグループにecs-testユーザーを登録します

![](http://gyazo.com/4260b38dd9b18c874593dce9250e9c22.png)
ecs-groupにチェックをつけてAdd to Groupsします

続いてパスワードを設定します

![](http://gyazo.com/6e0b0c9d3c63c52451a68edd732c19e8.png)

esc-userでコンソールにログインできることを確認しておきます

#Create an IAM Role for your Container Instances

ecs-userにecs操作のroleを設定します

![](http://gyazo.com/02ce6caa8d54193a4a58f46a06d088a1.png)

Amazon EC2を選択

![](http://gyazo.com/de1b35d38d7e426ce554eb4122d9b357.png)

Custompolicyを選択して以下を入力

![](http://gyazo.com/9b83c2b04b05640c2e1dd6dbf8e483b8.png)

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "ecs:*",
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
```

nextからcreate roleします

#Create a Cluster
ecs用のcliをダウンロードしてecs-cli.zipを解凍後、

```
$ python ./install
#通常のcliと違うのか、今回はパスを通さずに実行します
$ aws configure から先ほど作成したユーザーの情報を登録してリージョンはus-east-1を指定します
$ aws ecs create-cluster --region us-east-1 --cluster-name MyCluster
```

このようなjsonが出力されます

```
{
    "cluster": {
        "clusterName": "MyCluster", 
        "status": "ACTIVE", 
        "clusterArn": "arn:aws:ecs:us-east-1:XXXXXXXXXXX:cluster/MyCluster"
    }
}
```

#Launch an Instance with the Amazon ECS AMI
EC2を起動して先ほど作ったクラスタとしてコンテナを作っていきます

コンソールから以下のAMIを探します
![](http://gyazo.com/f4e1abe5d62c40a90c95a4deac03dcf9.png)

select後、Auto-assign PublicIPと、IAM roleとAdvanced Detailsをそれぞれ画像のように設定します。

![](http://gyazo.com/68cff567c63303563048ed765a2f6021.png)

最後に鍵を作成した後、そのままlaunchします
鍵はecs-testで作成しました　


#login ecs culster

作成したインスタンスにログインしてみます


```
$ ssh ec2-user@XX.165.XXX.XXX -i /path/ecs-admin.pem
```

![](http://gyazo.com/6d81176b15ce59ced00e0b2e8381bdf5.png)

できました


#Register a Task Definition

コンテナ群をタスクとして登録します
今回はwebとdbそれぞれでコンテナとして構成したwordpressのセットをタスクとして登録、実行してみます

クラスタ

```
$ aws ecs list-container-instances --cluster MyCluster                                
{
    "containerInstanceArns": [
        "arn:aws:ecs:us-east-1:XXXXXXXXXXX:container-instance/5a393b97-f836-4764-ac5e-cb22c27be3b3"
    ]
}
```

今回はテュートリアルの通り、やってみたいと思います

task.json

```
[
  {
    "environment": [],
    "name": "sleep",
    "image": "busybox",
    "cpu": 10,
    "portMappings": [],
    "entryPoint": [
      "/bin/sh"
    ],
    "memory": 10,
    "command": [
      "sleep",
      "360"
    ],
    "essential": true
  }
]
```

登録

```
$ aws ecs register-task-definition --family sleep360 --container-definitions file://$HOME/cli/task.json

```

結果

```
$ {
    "taskDefinition": {
        "taskDefinitionArn": "arn:aws:ec2:us-east-1:XXXXX:task-definition/sleep360:1",
        "containerDefinitions": [
            {
                "environment": [],
                "name": "sleep",
                "image": "busybox",
                "cpu": 10,
                "portMappings": [],
                "entryPoint": [
                    "/bin/sh"
                ],
                "memory": 10,
                "command": [
                    "sleep",
                    "360"
                ],
                "essential": true
            }
        ],
        "family": "sleep360",
        "revision": 1
    }
}
```

実行

```
$ ecs run-task --cluster MyCluster --task-definition sleep360:1 --count 1

```

結果

```
{
    "failures": [], 
    "tasks": [
        {
            "taskArn": "arn:aws:ecs:us-east-1:XXXXXXXXXXX:task/528df7ab-1ea8-44f6-93c2-202a236ab524", 
            "overrides": {
                "containerOverrides": [
                    {
                        "name": "sleep"
                    }
                ]
            }, 
            "lastStatus": "PENDING", 
            "containerInstanceArn": "arn:aws:ecs:us-east-1:XXXXXXXXXXX:container-instance/5a393b97-f836-4764-ac5e-cb22c27be3b3", 
            "desiredStatus": "RUNNING", 
            "taskDefinitionArn": "arn:aws:ecs:us-east-1:XXXXXXXXXXX:task-definition/sleep360:1", 
            "containers": [
                {
                    "containerArn": "arn:aws:ecs:us-east-1:XXXXXXXXXXX:container/5632e756-487e-4e41-bf55-ff4e7495d0f5", 
                    "taskArn": "arn:aws:ecs:us-east-1:XXXXXXXXXXX:task/528df7ab-1ea8-44f6-93c2-202a236ab524", 
                    "lastStatus": "PENDING", 
                    "name": "sleep"
                }
            ]
        }
    ]
}

```


# おまけ　wordpressのタスク

task.jsonを作成

```
[
  {
    "image": "tutum/wordpress-stackable",
    "name": "wordpress",
    "cpu": 10,
    "memory": 500,
    "essential": true,
    "links": [
      "db"
    ],
    "entryPoint": [
      "/bin/sh",
      "-c"
    ],
    "environment": [
      {
        "name": "DB_USER",
        "value": "root"
      },
      {
        "name": "DB_PASS",
        "value": "pass"
      }
    ],
    "portMappings": [
      {
        "containerPort": 80,
        "hostPort": 80
      }
    ]
  },
  {
    "image": "mysql",
    "name": "db",
    "cpu": 10,
    "memory": 500,
    "essential": true,
    "entryPoint": [
      "/entrypoint.sh"
    ],
    "environment": [
      {
        "name": "MYSQL_ROOT_PASSWORD",
        "value": "pass"
      }
    ],
    "portMappings": []
  }
]
```

登録

```
$ aws ecs register-task-definition --family wordpress --container-definitions file://$HOME/cli/task.json

```

結果


```
{
    "taskDefinition": {
        "taskDefinitionArn": "arn:aws:ecs:us-east-1:XXX:task-definition/wordpress:1", 
        "containerDefinitions": [
            {
                "environment": [
                    {
                        "name": "DB_USER", 
                        "value": "root"
                    }, 
                    {
                        "name": "DB_PASS", 
                        "value": "pass"
                    }
                ], 
                "name": "wordpress", 
                "links": [
                    "db"
                ], 
                "image": "tutum/wordpress-stackable", 
                "essential": true, 
                "portMappings": [
                    {
                        "containerPort": 80, 
                        "hostPort": 80
                    }
                ], 
                "entryPoint": [
                    "/bin/sh", 
                    "-c"
                ], 
                "memory": 10, 
                "cpu": 1
            }, 
            {
                "environment": [
                    {
                        "name": "MYSQL_ROOT_PASSWORD", 
                        "value": "pass"
                    }
                ], 
                "name": "db", 
                "image": "mysql", 
                "cpu": 10, 
                "portMappings": [], 
                "entryPoint": [
                    "/entrypoint.sh"
                ], 
                "memory": 10, 
                "essential": true
            }
        ], 
        "family": "wordpress", 
        "revision": 1
    }
}
```

##タスクの登録を確認して実行してみます


```
$ aws ecs list-task-definitions

{
    "taskDefinitionArns": [
        "arn:aws:ecs:us-east-1:XXXXXXXXXXX:task-definition/wordpress:1"
    ]
}


```

実行

```
$ aws ecs run-task --cluster MyCluster --task-definition wordpress --count 1
```

結果


```
{
    "failures": [], 
    "tasks": [
        {
            "taskArn": "arn:aws:ecs:us-east-1:XXXXXXXXXXX:task/1bb6d92b-7d69-4809-99a1-6408475ca5e2", 
            "overrides": {
                "containerOverrides": [
                    {
                        "name": "wordpress"
                    }, 
                    {
                        "name": "db"
                    }
                ]
            }, 
            "lastStatus": "PENDING", 
            "containerInstanceArn": "arn:aws:ecs:us-east-1:XXXXXXXXXXX:container-instance/5a393b97-f836-4764-ac5e-cb22c27be3b3", 
            "desiredStatus": "RUNNING", 
            "taskDefinitionArn": "arn:aws:ecs:us-east-1:XXXXXXXXXXX:task-definition/wordpress:2", 
            "containers": [
                {
                    "containerArn": "arn:aws:ecs:us-east-1:XXXXXXXXXXX:container/e11debd8-d1e7-43f1-98ea-984a78116a67", 
                    "taskArn": "arn:aws:ecs:us-east-1:XXXXXXXXXXX:task/1bb6d92b-7d69-4809-99a1-6408475ca5e2", 
                    "lastStatus": "PENDING", 
                    "name": "wordpress"
                }, 
                {
                    "containerArn": "arn:aws:ecs:us-east-1:XXXXXXXXXXX:container/528e6dda-9213-403d-b5d9-72f1b69b8588", 
                    "taskArn": "arn:aws:ecs:us-east-1:XXXXXXXXXXX:task/1bb6d92b-7d69-4809-99a1-6408475ca5e2", 
                    "lastStatus": "PENDING", 
                    "name": "db"
                }
            ]
        }
    ]
}

``` 

#まとめ

cliからでもあまり困ることなく操作できました
とりあえず触ってみただけなので、製品版がでた時に仕様が変わったりするかもしれませんが、ウォッチして追いかけてみたいです
GKE、ECSが出揃ったところでコンテナが今アツイです。この流れにのって弊社でも積極的に使っていきたいです