Amazon EC2 Container Service (ECS): ECSエージェントの動作を確認する

はじめに

本ブログではAmazon EC2 Container Service (ECS)について、これまでに以下の記事を書きました。

今回は、ECSクラスタを構成するECSエージェント(が導入されたEC2インスタンス)が、実際どんな動きになっているのかを確認してみました。

やってみた

ECSエージェントの導入方法

チュートリアルでは、ECS-Optimized Amazon Linux(amzn-ami-2014.09.1-amazon-ecs-optimized-preview2 - ami-34ddbe5c)をLaunchする際に、UserDataに以下のように記述するようにとなっています。

#!/bin/bash
echo ECS_CLUSTER=MyCluster >> /etc/ecs/ecs.config

ECSエージェントの動き

ECSエージェントがセットアップされたEC2にログインしてみると、/etc/ecsの中に、UserDataで作成したecs.configがあります。

$ cd /etc/ecs
$ ls -alF
合計 16
drwxr-xr-x  2 root root 4096 12月 19 02:04 ./
drwxr-xr-x 64 root root 4096 12月 19 02:04 ../
-rwxr-xr-x  1 root root 3658 12月 17 00:15 ecs-init*
-rw-r--r--  1 root root   22 12月 19 02:04 ecs.config

上記にあるecs-initが起動スクリプトです。これは/etc/init/ecs.confによってUpstartでdaemon化されてます。

$ cd /etc/init
$ ls -alF | grep ecs
-rwxr-xr-x  1 root root  794 12月 17 00:15 ecs.conf*
$ sudo initctl list | grep ecs
ecs start/running, process 2407

ecs-initにより、docker runが実行されています。

$ ps aux | grep "docker run"
root      2422  0.0  0.6 218068  6528 ?        Sl   02:05   0:00 docker run --name ecs-agent -v /var/run/docker.sock:/var/run/docker.sock -v /var/log/ecs:/log -p 127.0.0.1:51678:51678 --env-file /etc/ecs/ecs.config -e ECS_LOGFILE=/log/ecs-agent.log amazon/amazon-ecs-agent:latest

$ docker ps
CONTAINER ID        IMAGE                            COMMAND             CREATED             STATUS              PORTS                        NAMES
3bee360f185a        amazon/amazon-ecs-agent:latest   "/agent"            5 minutes ago       Up 5 minutes        127.0.0.1:51678->51678/tcp   ecs-agent

ECSのログは/var/log/ecsに出力されています。

$ cd /var/log/ecs
$ ls -alF
合計 28
drwxr-xr-x 2 root root  4096 12月 19 02:05 ./
drwxr-xr-x 6 root root  4096 12月 19 02:05 ../
-rw-r--r-- 1 root root 13037 12月 19 02:23 ecs-agent.log
-rw-r--r-- 1 root root   306 12月 19 02:05 ecs-init.log

それぞれのログの内容はこんな感じ。

$ tail -5 ecs-agent.log
t=2014-12-19T02:21:24+0000 lvl=info msg="Starting websocket poll loop" module=acs stack="[github.com/aws/amazon-ecs-agent/agent/acs/poll.go:112 agent/agent.go:82 github.com/aws/amazon-ecs-agent/agent/utils/utils.go:92 agent/agent.go:121]"
t=2014-12-19T02:22:24+0000 lvl=dbug msg="Got a message from acs websocket" module=acs message="{\"type\":\"HeartbeatMessage\",\"message\":{\"healthy\":true}}"
t=2014-12-19T02:22:24+0000 lvl=info msg="Message = " module=acs message="{MessageType:HeartbeatMessage Message:{Tasks:[] MessageId:}}"
t=2014-12-19T02:22:24+0000 lvl=dbug msg="Unmarshalled message as" module=acs tasks=<nil> skip=true err=nil
t=2014-12-19T02:23:07+0000 lvl=dbug msg="Got event from docker daemon" module=TaskEngine event="&{Status:die ID:6063a9c5a4e3e19c2f238aef511612c8c0cb9a93143cb26d044f24c5572de5e0 From:amazon/amazon-ecs-agent:latest Time:1418955787}"

$ tail -5 ecs-init.log
ecs-init [Fri Dec 19 02:05:00 UTC 2014]: pre-start
ecs-init [Fri Dec 19 02:05:03 UTC 2014]: Loading Amazon EC2 Container Service Agent from file /var/cache/ecs/ecs-agent.tar
ecs-init [Fri Dec 19 02:05:04 UTC 2014]: start
ecs-init [Fri Dec 19 02:05:04 UTC 2014]: Starting Amazon EC2 Container Service Agent

このamazon/amazon-ecs-agentはDocker Hubにありますamazon_amazon-ecs-agent_Repository___Docker_Hub_Registry_-_Repositories_of_Docker_Images

amazon-ecs-agentのソースはgithubで公開されています。

aws_amazon-ecs-agent

このGithubのREADMEに、Environment一覧があります。チュートリアルではECS_CLUSTERしか設定していませんが、ECS_LOGLEVELでログの出力レベルを変えたり、AWS_ACCESS_KEY_IDを設定してIAM Roleを使わずにECSエージェントを動かすことも出来ます。

aws_amazon-ecs-agent 2

このamazon-ecs-agetのDockerfileはamazon-ecs-agent/scripts/dockerfiles/にあります。Dockerfiles.buildでGolangで書かれたamazon-ecs-agentをbuildしており、Dockerfile.releaseでbuildされたバイナリを組み込んだscratchコンテナが定義されています。実際にamazon-ecs-agentのコンテナとして動くのはこのイメージなので、シングルバイナリなコンテナとして動いているようですね。

amazon-ecs-agent_Dockerfile_release_at_master_·_aws_amazon-ecs-agent

実際にdocker execしてみようとしたのですが、(当然ですが)psコマンドも無いような状態です。

$ sudo docker exec 3bee360f185a /bin/ps
2014/12/19 03:01:08 docker-exec: failed to exec: exec: "/bin/ps": stat /bin/ps: no such file or directory

さいごに

そもそもscratchを初めて知りました。こんな仕組みがあったんですね。ECSについては更に調査してみたいと思います!