LoginSignup
17
18

More than 5 years have passed since last update.

UbuntuでAmazon ECS用のインスタンスを作る

Last updated at Posted at 2016-03-11

ECSで使うインスタンスはAmazonが公式に提供するAMIを使うのが一般的ですが、ホストの監視など構成によっては色々手を加えたい場合もあります。

提供されているAMIに手を加えてもいいんですが、せっかく?なのでUbuntuで自分で作ってみることにしました。

EC2でUbuntu 14.04を起動

まずは、適当なEC2インスタンスを上げます。最近AmazonLinuxばっかり使っていて忘れていましたが、Ubuntuのデフォルトユーザはubuntuですね。ec2-userじゃなくて。

UbuntuにDockerをインストール

https://docs.docker.com/engine/installation/linux/ubuntulinux/ を参考にUbuntuにDockerをインストール

apt-get update
apt-get install apt-transport-https ca-certificates -y
apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
echo "deb https://apt.dockerproject.org/repo ubuntu-$(lsb_release -c -s) main" > /etc/apt/sources.list.d/docker.list
apt-get update
apt-get purge lxc-docker -y
apt-cache policy docker-engine
apt-get install "linux-image-extra-$(uname -r)"  docker-engine -y

usermod -aG docker ubuntu
sed -i -e 's/GRUB_CMDLINE_LINUX=""/GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"/' /etc/default/grub

一度 reboot

reboot

ECS Container Agentをインストール

つぎはhttp://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs-agent-install.html を参考にECS Container Agentをインストール

mkdir -p /var/log/ecs /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=cluster_name \
amazon/amazon-ecs-agent:latest

AWS Consoleを確認すると登録されています。
最新版をのDockerをインストールしたので1.10.3になってます。

Screen-Shot-2016-03-11-at-23.51.40.png

ECS Container Agentを自動起動する

さて、最後にUpstartを使ってECS Container Agentを自動起動するようにします。

同時にECS Clusterの指定をEC2のTagで行える様にします。

Screen-Shot-2016-03-12-at-00.13.36.png

Tagの取得はawscli経由で行います。

apt-get install awscli -y
LC_ALL=C aws --region $(ec2metadata --availability-zone | sed -e 's/.$//') ec2 describe-tags --filter "Name=resource-id,Values=$(ec2metadata --instance-id)" "Name=key,Values=cluster" --query "Tags[*].[Value]" --output text

実行するインスタンスのRoleにec2:Describe*を許可するPolicyを加えます。

IAM → Policies → Create Policy → Create Your Own Policyの「Review Policy」画面で下記の様に入力します。

Name: EC2DescribeFullAccess
Policy Document:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ec2:Describe*",
      "Resource": "*"
    }
  ]
}

その後、インスタンスロールにポリシーを当てます。

Screen-Shot-2016-03-12-at-00.37.37.png

これでさっきのコマンドを実行すると、cluster Tagで指定した文字列が取得出来ます。

さて、Upstartの起動スクリプトです。下記のファイルを /etc/init/ecs-agent.conf に設置します。

description "ECS Agent Container"
author "masuidruve"
start on filesystem and started docker
stop on runlevel [!2345]
respawn

script
  mkdir -p /var/log/ecs /var/lib/ecs/data
  LC_ALL=C
  ECS_CLUSTER=$(aws --region $(ec2metadata --availability-zone | sed -e 's/.$//') ec2 describe-tags --filter "Name=resource-id,Values=$(ec2metadata --instance-id)" "Name=key,Values=cluster" --query "Tags[*].[Value]" --output text)
  exec docker run --name ecs-agent \
    --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=$ECS_CLUSTER \
    amazon/amazon-ecs-agent:latest
end script

post-stop script
  /usr/bin/docker stop --time 2 ecs-agent || true
  /usr/bin/docker rm ecs-agent || true
  sleep 2
end script

これで準備完了。また再起動してみます。

reboot

確認

再度ログインして、docker psを実行してecs-agentが起動しているか確認します。

CONTAINER ID        IMAGE                            COMMAND             CREATED             STATUS              PORTS                        NAMES
28f5948116a2        amazon/amazon-ecs-agent:latest   "/agent"            2 minutes ago       Up 2 minutes        127.0.0.1:51678->51678/tcp   ecs-agent

クラスタ名が正しく取得出来ているかは、下記のコマンドで確認できます。

docker inspect ecs-agent | grep "ECS_CLUSTER"

最後にAWS Consoleで確認しましょう。

宣伝

DevOps好きだ!と思っている方、一緒に働きませんか? 3,000万人の予約を支えるDevOpsエンジニア募集!でお待ちしています。

よければ、トレタメンバーのQiitaも見ていって下さい。

17
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
18