やっと on time な「初老丸の独り Advent calendar 2015」の十五日目の記事です。

tl;dr

Amazon ECS で個人的な疑問を紐解いていきたい。

今日の疑問

疑問

  • ECS-Optimized Amazon Linux 以外の Linux に ECS container agent をインストール出来るのか?
  • 出来れば最新の Docker で ECS container agent を利用したいです

答え

  • 安心してください、インストールできますよ

ECS container agent 自体が Docker コンテナということもあり Docker が動いていればインストールできそうです。以下のようにドキュメントにも Amazon Linux 以外の Linux 環境にインストールする手順も記載されています。

また、以下のように Ubuntu 環境にインストールされている方もいらっしゃいます。

stormcat.hatenablog.com

今回は上記の記事などを参考に ECS container agent を ECS-Optimized Amazon Linux 以外の Linux にインストールしてみる。

試す

教材

github.com

今後の疑問解決か出来るだけこちらのリポジトリを利用する。

ざっくり手順

  1. EC2 を構築する
  2. ECS クラスタを作成する
  3. EC2 に Docker Engine をインストールする
  4. ECS Container agent をインストールする
  5. ひとまずクラスタの状態を確認するところまで

EC2 を構築する、ECS のクラスタを作成する

EC2 の OS は terraform を利用して Ubuntu Server 14.04 LTS を利用する。

尚、教材で利用する各種コマンドは make コマンドにまとめている。

$ cd oreno-ecs/terraform
$ make

Makefile for ECS

Usage: make [task]

Tasks:
tf-plan                         ....... Execute terraform plan
tf-apply                        ....... Execute terraform apply
tf-destroy                      ....... Execute terraform destroy

実行前に Makefile を修正する必要があるので注意。

$ vim Makefile
TF_PLAN := terraform plan 
             -var 'access_key=AKxxxxxxxxxxxxxxxxxx' 
             -var 'secret_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' 
             -var 'ssh_key_name=your-key-name' 
             -var 'subnet=subnet-xxxxxxxx' 
             -var 'securiy_group=sg-xxxxxxxx'

TF_APPLY := terraform apply 
             -var 'access_key=AKxxxxxxxxxxxxxxxxxx' 
             -var 'secret_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' 
             -var 'ssh_key_name=your-key-name' 
             -var 'subnet=subnet-xxxxxxxx' 
             -var 'securiy_group=sg-xxxxxxxx'

自分の環境に合わせて上記の情報を修正する。修正したら以下のようにterraform planterraform apply を実行する。

$ make tf-plan
Refreshing Terraform state prior to plan...


The Terraform execution plan has been generated and is shown below.
Resources are shown in alphabetical order for quick scanning. Green resources
will be created (or destroyed and then created if an existing resource
exists), yellow resources are being changed in-place, and red resources
will be destroyed.

(snip)

$ make tf-apply

(snip)

aws_iam_role.ecs_iam_role: Refreshing state... (ID: ecs_iam_role)
aws_iam_role_policy.ecs_iam_role: Refreshing state... (ID: ecs_iam_role:ecs_iam_role)
aws_iam_instance_profile.ecs_iam_role: Refreshing state... (ID: ecs_iam_role)
aws_instance.oreno_tf_test: Refreshing state... (ID: i-xxxxxxxx)

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

  EC2 IP address  = xxx.xxx.xxx.xxx
  EC2 Instance ID = i-xxxxxxxx
  ECS Cluster Name = oreno-cluster

EC2 が起動したら ssh でログイン出来るか確認しておく。

Docker をインストールする

以下のドキュメントに従って Docker をインストールする。

docs.docker.com

2015 年 12 月 15 日時点の Docker バージョンは 1.9.1 となる。

#
# apt-key の追加
#
$ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

#
# source リストを作成
#
$ sudo vim /etc/apt/sources.list.d/docker.list
# 以下を追加する
deb https://apt.dockerproject.org/repo ubuntu-trusty main

#
# apt-get update
#
$ sudo apt-get update

#
# Docker をインストール
#
$ sudo apt-get install docker-engine

#
# ubuntu ユーザーでも docker コマンドをたたけるように ubuntu ユーザーを docker グループに所属させる
#
$ sudo usermod -aG docker ubuntu
# いったん、ログアウト

ubuntu ユーザーを docker グループに所属させた後に、一旦、ログアウトすることをお忘れなく…。

ECS container agent をインストールする

こちらのドキュメントを参考にして ECS container agent をインストールする。

#
# ECS container agent がコンテナ内からマウントするためのマウントポイントを作成する
#
$ sudo mkdir -p /var/log/ecs
$ sudo mkdir -p /var/lib/ecs/data

#
# ECS container agent をインストールする(docker run する)
#
$ docker run --name ecs-agent 
--detach=true 
--restart=on-failure:10 
--volume=/var/run/docker.sock:/var/run/docker.sock 
--volume=/var/log/ecs/:/log 
--volume=/var/lib/ecs/data:/data 
--volume=/sys/fs/cgroup:/sys/fs/cgroup:ro 
--volume=/var/run/docker/execdriver/native:/var/lib/docker/execdriver/native:ro 
--publish=127.0.0.1:51678:51678 
--env=ECS_LOGFILE=/log/ecs-agent.log 
--env=ECS_LOGLEVEL=info 
--env=ECS_DATADIR=/data 
--env=ECS_CLUSTER=oreno-cluster 
amazon/amazon-ecs-agent:latest

#
# インストールされたことを確認
#
$ docker  ps

よし、よし。

諸々確認

例のごとく make コマンドにまとめてある。

$ cd oreno-ecs/ecs-cli
$ make

Makefile for ECS

Usage: make [task]

Tasks:
ecs-up                          ....... ECS Cluster up
ecs-list                        ....... list up ECS Clusters
ecs-list-container-instances    ....... list up ECS Container instances. Require environment variable 'ECS_CLUSTER'
ecs-describe-container-instances....... describe ECS Container instances. Require environment variable 'ECS_CLUSTER' and 'ECS_ARN'
  • aws cli で ECS クラスタを確認する
$ make ecs-list
CLUSTERARNS     arn:aws:ecs:ap-northeast-1:251150836600:cluster/oreno-cluster
  • aws cli でコンテナインスタンスを確認する
$ make ECS_CLUSTER=oreno-cluster ecs-list-container-instances
CONTAINERINSTANCEARNS   arn:aws:ecs:ap-northeast-1:xxxxxxxxxxxxxx:container-instance/55bcab9a-1983-4b5c-bfba-3b5668e29034
  • aws cli でコンテナインスタンスの詳細
$ make OUTPUT=text ECS_CLUSTER=oreno-cluster ECS_ARN=55bcab9a-1983-4b5c-bfba-
3b5668e29034 ecs-describe-container-instances
CONTAINERINSTANCES      True    arn:aws:ecs:ap-northeast-1:xxxxxxxxxxxxxx:container-instance/55bcab9a-1983-4b5c-bfba-3b5668e29034 i-xxxxxxx   0       0       ACTIVE
ATTRIBUTES      com.amazonaws.ecs.capability.privileged-container
ATTRIBUTES      com.amazonaws.ecs.capability.docker-remote-api.1.17
ATTRIBUTES      com.amazonaws.ecs.capability.docker-remote-api.1.18
ATTRIBUTES      com.amazonaws.ecs.capability.docker-remote-api.1.19
ATTRIBUTES      com.amazonaws.ecs.capability.docker-remote-api.1.20
ATTRIBUTES      com.amazonaws.ecs.capability.logging-driver.json-file
ATTRIBUTES      com.amazonaws.ecs.capability.ecr-auth
REGISTEREDRESOURCES     0.0     1024    0       CPU     INTEGER
REGISTEREDRESOURCES     0.0     992     0       MEMORY  INTEGER
REGISTEREDRESOURCES     0.0     0       0       PORTS   STRINGSET
STRINGSETVALUE  22
STRINGSETVALUE  2376
STRINGSETVALUE  2375
STRINGSETVALUE  51678
REGISTEREDRESOURCES     0.0     0       0       PORTS_UDP       STRINGSET
REMAININGRESOURCES      0.0     1024    0       CPU     INTEGER
REMAININGRESOURCES      0.0     992     0       MEMORY  INTEGER
REMAININGRESOURCES      0.0     0       0       PORTS   STRINGSET
STRINGSETVALUE  22
STRINGSETVALUE  2376
STRINGSETVALUE  2375
STRINGSETVALUE  51678
REMAININGRESOURCES      0.0     0       0       PORTS_UDP       STRINGSET
VERSIONINFO     191dbd5 1.7.0   DockerVersion: 1.9.1

Docker のバージョンは1.9.1 として認識されている。ちなみに、--output text は見にくいかも。

  • マネジメントコントロールから ECS クラスタを確認する

Docker のバージョンも認識されている。

20151216083848

以上

疑問は…

解けました。

余談

ECS-Optimized Amazon Linux で用意したクラスタで Docker バージョンなどを確認すると以下のように Docker バージョンは少し古い。そして、ECS Container agent のバージョンもちょっと古い。(古いというか Docker バージョンに合わせたバージョンとなるようだ)

20151216090908

やり残し

  • Docker と ECS container agent をインストールするまでを自動化(出来るはず)

元記事はこちら

(ショロカレ 15 日目)Amazon ECS の個人的な疑問を紐解いていくメモ(1)~ ECS container agent を ECS-Optimized Amazon Linux 以外の Linux にインストールする