CoreOSをECS(EC2 Container Service)クラスタに追加する
ども、大瀧です。
プレビューが始まった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
これで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インスタンスが活用できるのではと思います。