この記事は公開されてから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
これで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インスタンスが活用できるのではと思います。