自転車操業になりつつある「初老丸の独り Advent calendar 2015」の十六日目の記事です。
tl;dr
前の記事でやり残した宿題をひとつずつ片づける。
今回は…
- Docker と ECS container agent をインストールするまでを自動化(出来るはず)
を試す。
作業にあたって
どこが自動化できそうか
- Docker のインストール
- ECS container agent のインストール
戦略
- AMI を作る
- EC2 起動時に User Data を利用する
EC2 の User Data をやってみる
参考
引き続き、上記の記事を参考にさせていただく。有難うございます。
教材
引き続き、上記の教材を利用する。
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
とりあえず構築できたっぽいが、一応、マネジメントコンソールからも確認してみる。
セットアップ出来た。
ひとまずは
ひとまずは Docker Engine と ECS container agent のインストールすることが出来たので、ひとまずは目的達成ということで。
最新の Docker Engine を使うという前提であれば User Data で諸々実行するの方が良いような気がする。
元記事はこちら
「(ショロカレ 16 日目)Amazon ECS の個人的な疑問を紐解いていくメモ(2)~ ECS Container agent が始めからインストールされている環境を作る」