Amazon EC2 Container Service(ECS)で静的Webサイトをデプロイする

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

とか言ってたら使えるようになりました! ECSの始め方については大瀧Amazon EC2 Container Service (ECS)を試してみたをご覧ください。

今回は静的Webサイトをコンテナ化して、ECSでデプロイしてみました。

やってみた

静的Webサイトを自家製コンテナ化する

まずは静的Webサイト用のコンテナを作成します。以下のように、nginxを使うDockerfileを作成します。

$ mkdir nginx
$ cd nginx
$ vi Dockerfile
FROM nginx
COPY html /usr/share/nginx/html

静的WebサイトのコンテンツはCOPYで指定しているhtmlフォルダに配置します。

$ mkdir html
$ vi html/index.html
<html>
<head><title>Amazon ECS deployed!</title></head>
<body><h1>Amazon ECS deployed!</h1></body>
</html>

ではdocker buildコマンドでコンテナ化します。この時にタグ付けするリポジトリ名は、Docker Hubのアカウント名を指定します。今回の場合は"smokeymonkey"です。

$ sudo docker build -t smokeymonkey/mynginx .
Sending build context to Docker daemon 3.584 kB
Sending build context to Docker daemon
Step 0 : FROM nginx
nginx:latest: The image you are pulling has been verified
Status: Downloaded newer image for nginx:latest
 ---> e46b3488b010
Step 1 : COPY html /usr/share/nginx/html
 ---> 6087f675aa81
Removing intermediate container 3a6bb24345c2
Successfully built 6087f675aa81

ちゃんとbuildされていることを確認します。

$ sudo docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
smokeymonkey/mynginx   latest              6087f675aa81        4 minutes ago       91.74 MB

自家製コンテナをDocker Hubへ登録する

Amazon ECS Task Definitionsに書いてある通り、ECSのタスクで指定するコンテナイメージはデフォルトでDocker Hubを参照します。なので、作った自家製コンテナをDocker Hubに登録します。まずはdocker loginでDocker Hubにログインします。

$ sudo docker login
Username: smokeymonkey
Password:
Email: smokeymonkey@example.com
Login Succeeded

次にdocker pushで、作成した自家製コンテナをDocker Hubに登録します。前述でリポジトリ名をDocker Hubのアカウント名にしたのはこのためです(アカウント名=リポジトリ名になっていないと登録できません)

$ sudo docker push smokeymonkey/mynginx
The push refers to a repository [smokeymonkey/mynginx] (len: 1)
Sending image list
Pushing repository smokeymonkey/mynginx (1 tags)
6087f675aa81: Image successfully pushed
Pushing tag for rev [6087f675aa81] on {https://cdn-registry-1.docker.io/v1/repositories/smokeymonkey/mynginx/tags/latest}

自家製コンテナをECSでデプロイする

ここからが本題。ECSのタスクファイルを作成します。imageは先ほどDocker Hubに登録した自家製コンテナを指定します。

$ vi mynginx.json
[
  {
    "image": "smokeymonkey/mynginx",
    "name": "mynginx",
    "cpu": 10,
    "memory": 500,
    "essential": true,
    "entryPoint": [
      "/bin/sh",
      "-c"
    ],
    "environment": [],
    "portMappings": [
      {
        "containerPort": 80,
        "hostPort": 80
      }
    ]
  }
]

タスクを登録します。

$ aws ecs register-task-definition --family mynginx  --container-definitions file://./mynginx.json
{
    "taskDefinition": {
        "taskDefinitionArn": "arn:aws:ecs:us-east-1:01234567890:task-definition/mynginx:1",
        "containerDefinitions": [
            {
                "environment": [],
                "name": "mynginx",
                "image": "smokeymonkey/mynginx",
                "cpu": 10,
                "portMappings": [
                    {
                        "containerPort": 80,
                        "hostPort": 80
                    }
                ],
                "entryPoint": [
                    "/bin/sh",
                    "-c"
                ],
                "memory": 500,
                "essential": true
            }
        ],
        "family": "mynginx",
        "revision": 1
    }
}

既にECS−OptimizedなEC2インスタンスを2台Launchしており、MyClusterに所属させています。登録したタスク(family="mynginx",リビジョン=1)を、MyClusterで2つ実行させます。

$ aws ecs run-task --cluster MyCluster --task-definition mynginx:1 --count 2

タスクが2つ起動していることを確認します。

$ aws ecs list-tasks --cluster MyCluster
{
    "taskArns": [
        "arn:aws:ecs:us-east-1:01234567890:task/ba30d4b6-3137-45e1-95f5-6b09a800de0f",
        "arn:aws:ecs:us-east-1:01234567890:task/d6748b0d-c8d1-4698-8011-a809a8721599"
    ]
}

この状態で各EC2インスタンスにWebブラウザからアクセスすると、静的Webサイトが表示されます!

Amazon_ECS_deployed__と_EC2_Management_Console

タスクの停止と復帰

stop-taskで、起動しているタスクを停止することができます

$ aws ecs stop-task --cluster MyCluster --task arn:aws:ecs:us-east-1:01234567890:task/ba30d4b6-3137-45e1-95f5-6b09a800de0f
$ aws ecs list-tasks --cluster MyCluster{
    "taskArns": [
        "arn:aws:ecs:us-east-1:01234567890:task/d6748b0d-c8d1-4698-8011-a809a8721599"
    ]
}

再度run-taskすることで、既に起動しているタスクはそのまま、新しいタスクが起動して、ちゃんとタスクが2つの状態に復帰します。

$ aws ecs run-task --cluster MyCluster --task-definition mynginx:1 --count 2
$ aws ecs list-tasks --cluster MyCluster
{
    "taskArns": [
        "arn:aws:ecs:us-east-1:01234567890:task/d6748b0d-c8d1-4698-8011-a809a8721599",
        "arn:aws:ecs:us-east-1:01234567890:task/e9fc0f67-5b47-43df-8e82-31f878c3cbef"
    ]
}

さいごに

操作に慣れてくると、なかなか使い勝手の良いサービスだと感じてきました。さらに面白い使い方をいろいろ考えてみたいと思います!