自転車操業になりつつある「初老丸の独り Advent calendar 2015」の十六日目の記事です。

tl;dr

前の記事でやり残した宿題をひとつずつ片づける。

今回は…

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

を試す。

作業にあたって

どこが自動化できそうか

  • Docker のインストール
  • ECS container agent のインストール

戦略

  • AMI を作る
  • EC2 起動時に User Data を利用する

EC2 の User Data をやってみる

参考

stormcat.hatenablog.com

引き続き、上記の記事を参考にさせていただく。有難うございます。

教材

github.com

引き続き、上記の教材を利用する。

User Data のスクリプト

すごく雑だが…以下のようなスクリプトを作ってみる。

#!/usr/bin/env bash

apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" > /etc/apt/sources.list.d/docker.list
apt-get update
apt-get install -y docker-engine
mkdir -p /var/log/ecs
mkdir -p /var/lib/ecs/data

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

terraform で一発構築

する為に、以下のように EC2 構築用の terraform テンプレートに組み込んでみる。

#
# AWS Launch EC2 instance
#
resource "aws_instance" "oreno_tf_test" {
  count = 1
  instance_type = "${var.instance_type}"
  ami = "${lookup(var.aws_amis, var.region)}"
  subnet_id = "${var.subnet}"
  associate_public_ip_address = true
  vpc_security_group_ids = ["${var.securiy_group}"]
  iam_instance_profile = "${aws_iam_role_policy.ecs_iam_role.name}"
  key_name = "${var.ssh_key_name}"
  tags = {
    Name = "${lookup(var.tag_names, count.index)}"
  }
  user_data = < /etc/apt/sources.list.d/docker.list
apt-get update
apt-get install -y docker-engine
mkdir -p /var/log/ecs
mkdir -p /var/lib/ecs/data

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="${aws_ecs_cluster.oreno_ecs_cluster.name}" 
amazon/amazon-ecs-agent:latest
EOT
}

若干、力技っぽいけど…これで試してみる。

構築

$ 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

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

(snip)

Plan: 5 to add, 0 to change, 0 to destroy.

#
# terraform apply
#
$ make tf-apply

(snip)

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

The state of your infrastructure has been saved to the path
below. This state is required to modify and destroy your
infrastructure, so keep it safe. To inspect the complete state
use the `terraform show` command.

State path: terraform.tfstate

Outputs:

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

確認

$ oreno-ecs/ecs-cli
$ make

Makefile for ECS

Usage: make [task]

Tasks:
ecs-up                          ....... ECS Cluster up
ecs-list                        ....... list up ECS Clusters. Require environment variable 'OUTPUT'
ecs-list-container-instances    ....... list up ECS Container instances. Require environment variable 'OUTPUT' and 'ECS_CLUSTER'
ecs-describe-container-instances....... describe ECS Container instances. Require environment variable 'OUTPUT' and 'ECS_CLUSTER' and 'ECS_ARN'

#
# ECS Cluster の一覧を確認
#
$ make OUTPUT=text ecs-list
CLUSTERARNS     arn:aws:ecs:ap-northeast-1:xxxxxxxxxxxxxxx:cluster/oreno-cluster

#
# ECS Cluster Container Instance の一覧を確認
#
$ make OUTPUT=text ECS_CLUSTER=oreno-cluster ecs-list-container-instances
CONTAINERINSTANCEARNS   arn:aws:ecs:ap-northeast-1:xxxxxxxxxxxxxxxxx:container-instance/b7ed2bdf-0ee9-4c1e-9ff2-c3aa066abbcb

#
# ECS Cluster Container Instance の詳細を確認
#
$ make OUTPUT=text ECS_CLUSTER=oreno-cluster ECS_ARN=b7ed2bdf-0ee9-4c1e-9ff2-c3aa066abbcb ecs-describe-container-instances
CONTAINERINSTANCES      True    arn:aws:ecs:ap-northeast-1:xxxxxxxxxxxxxxxxx:container-instance/b7ed2bdf-0ee9-4c1e-9ff2-c3aa066abbcb i-xxxxxxxx 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

とりあえず構築できたっぽいが、一応、マネジメントコンソールからも確認してみる。

20151216231226

セットアップ出来た。

ひとまずは

ひとまずは Docker Engine と ECS container agent のインストールすることが出来たので、ひとまずは目的達成ということで。

最新の Docker Engine を使うという前提であれば User Data で諸々実行するの方が良いような気がする。

元記事はこちら

(ショロカレ 16 日目)Amazon ECS の個人的な疑問を紐解いていくメモ(2)~ ECS Container agent が始めからインストールされている環境を作る