Help us understand the problem. What is going on with this article?

Amazon EC2 Container Service Previewを使ってみる

More than 5 years have passed since last update.

mazon EC2 Container Service Previewを使ってみる

先に発表されたawsのコンテナサービスECSのpreviewに申し込んでいたのですが、welcomeメールがきましたのでコチラのページを参考に早速触ってみます

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

GKEの試してみたはこちら

Create an IAM User

IAM consoleからグループを作成します

とりあえずAdministratorで作成

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

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

ユーザーを作成します

ecs-testで作成してみます

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

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


ecs-groupにチェックをつけてAdd to Groupsします

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

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

Create an IAM Role for your Container Instances

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

Amazon EC2を選択

Custompolicyを選択して以下を入力

{
  "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を探します

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

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

login ecs culster

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

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

できました

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が出揃ったところでコンテナが今アツイです。この流れにのって弊社でも積極的に使っていきたいです

ktkt
liginc
上野でウェブ制作を行うクリエイティブ集団です。HP制作、プロモーション、システム開発等を行っています。
https://liginc.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away