31
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

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

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

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

参考

Get Startted

Screen Shot 2015-06-22 at 10.54.32 PM.png

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

Step1 Welcome to Amazon ECS

Screen Shot 2015-06-22 at 10.57.12 PM.png

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

Step2 Create Task Definition from sample

Screen Shot 2015-06-22 at 10.59.21 PM.png

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

Data Volume と Data Volume Container

Docker でデータのポータビリティをあげ永続化しよう

本サンプルでではどのような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

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

  • Run Tasks Once
  • Create a service

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

Desired number of TasksService 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

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

Screen Shot 2015-06-22 at 11.40.12 PM.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

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

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

Screen Shot 2015-06-22 at 11.52.36 PM.png

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

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

Screen Shot 2015-06-22 at 11.58.06 PM.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)

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

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

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

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
Sign upLogin
31
Help us understand the problem. What are the problem?