CoreOSをECS(EC2 Container Service)クラスタに追加する

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

ども、大瀧です。
プレビューが始まったAmazon ECS(EC2 Container Service)は、AWS上で複数のDockerコンテナ実行をサポートするマネージドサービスです。コンテナ向けに最適化されたLinuxディストリビューションのCoreOSをECSで管理できるとのことなので、試してみました。

CoreOSインスタンスの起動

  • 動作確認したバージョン: CoreOS alpha 534.1.0 (ami-deb5d7b6 : CoreOS-alpha-534.1.0-hvm)
  • AWSリージョン: N.Virginia(us-east-1)

ECSでは、Dockerコンテナを実行するEC2インスタンスをクラスタでグループ化して管理するので、CoreOSのEC2インスタンスをクラスタに追加することで、ECSによるCoreOSの管理を実現します。CoreOSのドキュメントに設定が示されているので、今回はこれを試してみます。

EC2インスタンスの起動ウィザードでCoreOSのAMIを検索、選択し、[Step 3: Configure Instance Details]画面で、以下2点を設定します。

  • [IAM Role]はECSインスタンス向けのものを選択(ロールの設定はこちらの記事を参照)
  • [User Data]([Advanced Details]をクリックして展開)に以下を指定します。Environment=ECS_CLUSTERの値を、あらかじめ準備したECSクラスタ名に変更します。
#cloud-config

coreos:
 units:
   -
     name: amazon-ecs-agent.service
     command: start
     runtime: true
     content: |
       [Unit]
       Description=Amazon ECS Agent
       After=docker.service
       Requires=docker.service

       [Service]
       Environment=ECS_CLUSTER=<your_cluster_name>
       Environment=ECS_LOGLEVEL=warn
       ExecStartPre=-/usr/bin/docker kill ecs-agent
       ExecStartPre=-/usr/bin/docker rm ecs-agent
       ExecStartPre=/usr/bin/docker pull amazon/amazon-ecs-agent
       ExecStart=/usr/bin/docker run --name ecs-agent --env=ECS_CLUSTER=${ECS_CLUSTER} --env=ECS_LOGLEVEL=${ECS_LOGLEVEL} --publish=127.0.0.1:51678:51678 --volume=/var/run/docker.sock:/var/run/docker.sock amazon/amazon-ecs-agent
       ExecStop=/usr/bin/docker stop ecs-agent

coreos-ecs01

これでOKです。CoreOSインスタンスを起動し、しばらく待ちます。

動作確認

aws ecsコマンドで動作を確認します。aws ecs list-container-instancesコマンドでECSインスタンスをリストすると、CoreOSインスタンスが追加されていることが確認できます。

$ aws ecs list-container-instances --cluster MyCluster --output json --region us-east-1
{
    "containerInstanceArns": [
        "arn:aws:ecs:us-east-1:XXXXXXXXXXXX:container-instance/1392930a-7306-4892-8141-cc44ab8af2e8",
        "arn:aws:ecs:us-east-1:XXXXXXXXXXXX:container-instance/3e7d23ad-a477-4fb3-9a5c-09f8ce7ba76d",
        "arn:aws:ecs:us-east-1:XXXXXXXXXXXX:container-instance/af673653-5d11-4148-be3a-585765a65e88"
    ]
}
$

現時点では、インスタンスの種類(Amazon LinuxなのかCoreOSなのか)を区別するプロパティはないようなので、ContainerInstanceArnに対してひとつずつaws ecs describe-container-instancesコマンドを実行し、EC2のインスタンスIDから判断する必要があるようです。

$ aws ecs describe-container-instances --container-instances arn:aws:ecs:us-east-1:XXXXXXXXXXXX:container-instance/af673653-5d11-4148-be3a-585765a65e88 --region us-east-1 --cluster MyCluster --output json | grep ec2InstanceId
            "ec2InstanceId": "i-XXXXXXXX",
$

では、Dockerコンテナ(ECSタスク)を実行します。デモとしてこちらの記事で定義したsleep360:1タスクを10個実行します。

$ aws ecs run-task --cluster MyCluster --task-definition sleep360:1 --count 10 --region us-east-1
  :
$

CoreOSインスタンスにSSH接続し、docker psコマンドでコンテナの一覧を確認してみます。CoreOS AMIの接続ユーザーは、coreユーザーです。

$ ssh core@54.175.XX.XX
CoreOS (alpha)
core@ip-172-31-9-129 ~ $ docker ps
CONTAINER ID        IMAGE                             COMMAND             CREATED              STATUS              PORTS                        NAMES
9c6431c748bb        busybox:latest                    "sleep 360"         About a minute ago   Up About a minute                                ecs-sleep360-1-sleep-8afcce89deb1c4ac1300
c8aedb49faa3        busybox:latest                    "sleep 360"         About a minute ago   Up About a minute                                ecs-sleep360-1-sleep-9ec8d39de1ccfbc13500
a66c3ad1c052        busybox:latest                    "sleep 360"         About a minute ago   Up About a minute                                ecs-sleep360-1-sleep-defdc6e2c1d3c5b1d501
bab61a2b4fdb        amazon/amazon-ecs-agent:0dec3e3   "/agent"            3 minutes ago        Up 3 minutes        127.0.0.1:51678->51678/tcp   ecs-agent
core@ip-172-31-9-129 ~ $

実行したタスクのいくつかが実行されていることがわかります!

まとめ

CoreOSをECSのクラスタに追加する方法をご紹介しました。ECSのコンテナ管理機能は、CoreOSのfleetに相当すると思うので、ECSにまだ実装されていないflannel(Docker向け仮想ネットワークサービス)などを利用するために、CoreOSインスタンスが活用できるのではと思います。