Amazon EC2 Container Service(ECS)で静的Webサイトをデプロイする
はじめに
バン ECSはよ バン (∩`・ω・) バン ECSはよ / ミつ/ ̄ ̄ ̄/  ̄ ̄\/___/
— ʎǝʞuoɯʎǝʞoɯs (@smokeymonkey) December 18, 2014
とか言ってたら使えるようになりました! 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: [email protected] 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サイトが表示されます!
タスクの停止と復帰
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" ] }
さいごに
操作に慣れてくると、なかなか使い勝手の良いサービスだと感じてきました。さらに面白い使い方をいろいろ考えてみたいと思います!