先人の知恵
ほとんどは上の記事の通りでいけます。神。
ただ、 Ubuntu, Docker, ecs-agent のバージョンがそれぞれ上がっていることにより、何点か変更が必要なので、そこをフォローしてみます。
- Installing the Amazon ECS Container Agent – Amazon EC2 Container Service
- Docker – Installation on Ubuntu
これらの公式ドキュメントは既にそれぞれの最新に対応してます。
Role for tasks への対応
- ECSタスクのためのIAMロールによってコンテナ利用アプリケーションをより安全にする | Amazon Web Services ブログ
- IAM Roles for Tasks – Amazon EC2 Container Service
この ECS の新機能により、コンテナーインスタンスの Role とは別に タスク用の Role (Trust Relationship の Principal は ecs-tasks.amazonaws.com
)を割り当てられるようになりました。
これを使うにあたり、 Amazon Linux 以外では iptables
を使ってネットワークを曲げる必要があります。
$ sudo sysctl -w net.ipv4.conf.all.route_localnet=1 $ sudo iptables -t nat -A PREROUTING -p tcp -d 169.254.170.2 --dport 80 -j DNAT --to-destination 127.0.0.1:51679 $ sudo iptables -t nat -A OUTPUT -d 169.254.170.2 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 51679
net.ipv4.conf.all.route_localnet=1
は適当にファイルを作って永続化しておきます。/etc/sysctl.d/95-enable-nat.conf
net.ipv4.conf.all.route_localnet = 1
execdriver
マウントパスの変更
ecs-agent
の長い長い起動コマンドのうちの以下の行です。
--volume=/var/run/docker/execdriver/native:/var/lib/docker/execdriver/native:ro \
Docker が 1.11 以降である場合、ホスト側のパスを変更する必要があります。
Ubuntu 16.04 に Docker 1.12 をインストールした場合、ここに指定するべきは
--volume=/var/run/docker/libcontainerd:/var/lib/docker/execdriver/native:ro \
です。
systemd
への対応
Ubuntu は 15 以降 upstart
ではなく systemd
が標準になったのでこれに対応します。
と言っても大した事はないです。適当な位置に起動用スクリプトを置いておき、それを叩くような .service
ファイルを作るだけです。
/opt/misc/bin/ecs-agent
#!/bin/bash start() { docker ps -a | grep ecs-agent if [ $? = 0 ]; then docker restart ecs-agent else export AWS_DEFAULT_REGION=$(ec2metadata --availability-zone | sed -e 's/.$//') export ECS_CLUSTER=$(aws ec2 describe-tags --filter "Name=resource-id,Values=$(ec2metadata --instance-id)" "Name=key,Values=EcsCluster" --query "Tags[*].[Value]" --output text) 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/libcontainerd:/var/lib/docker/execdriver/native:ro \ --net=host \ --env=ECS_LOGFILE=/log/ecs-agent.log \ --env=ECS_LOGLEVEL=info \ --env=ECS_DATADIR=/data \ --env=ECS_CLUSTER=$ECS_CLUSTER \ --env=ECS_ENABLE_TASK_IAM_ROLE=true \ --env=ECS_AVAILABLE_LOGGING_DRIVERS=["json-file","awslogs"] \ amazon/amazon-ecs-agent:latest fi } stop() { docker stop ecs-agent } case "$1" in start) start ;; stop) stop ;; *) echo "Usage: ecs-agent (start|stop)" exit 1 ;; esac exit $?
/etc/systemd/system/ecs-agent.service
[Unit] Description=ecs-agent [Service] Type=oneshot WorkingDirectory=/opt/misc/bin/ ExecStart=/opt/misc/bin/ecs-agent start ExecStop=/opt/misc/bin/ecs-agent stop RemainAfterExit=yes [Install] WantedBy=network-online.target
$ sudo chmod +x /opt/misc/bin/ecs-agent $ sudo systemctl daemon-reload $ sudo systemctl enable ecs-agent
リブートして確認してみましょう。
ubuntu@ip-172-31-26-135:~$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d892a247688d amazon/amazon-ecs-agent:latest "/agent" 36 minutes ago Up 36 minutes ecs-agent
ubuntu@ip-172-31-26-135:~$ sudo systemctl status ecs-agent ● ecs-agent.service - ecs-agent Loaded: loaded (/etc/systemd/system/ecs-agent.service; enabled; vendor preset: enabled) Active: active (exited) since Fri 2016-08-26 19:46:46 JST; 35min ago Process: 1743 ExecStart=/opt/misc/bin/ecs-agent start (code=exited, status=0/SUCCESS) Main PID: 1743 (code=exited, status=0/SUCCESS) Tasks: 0 Memory: 0B CPU: 0 CGroup: /system.slice/ecs-agent.service Aug 26 19:46:44 ip-172-31-26-135 ecs-agent[1743]: 953909e9e1a5: Pull complete Aug 26 19:46:44 ip-172-31-26-135 ecs-agent[1743]: b8482e34df6d: Verifying Checksum Aug 26 19:46:44 ip-172-31-26-135 ecs-agent[1743]: b8482e34df6d: Download complete Aug 26 19:46:45 ip-172-31-26-135 ecs-agent[1743]: 465ca331a4fe: Pull complete Aug 26 19:46:45 ip-172-31-26-135 ecs-agent[1743]: a3a270f9aa99: Pull complete Aug 26 19:46:45 ip-172-31-26-135 ecs-agent[1743]: b8482e34df6d: Pull complete Aug 26 19:46:45 ip-172-31-26-135 ecs-agent[1743]: Digest: sha256:ad59bd654c6f9a889264fdf21dcb538b4ca8c7f10b86f141ef7203d19f46f443 Aug 26 19:46:45 ip-172-31-26-135 ecs-agent[1743]: Status: Downloaded newer image for amazon/amazon-ecs-agent:latest Aug 26 19:46:45 ip-172-31-26-135 ecs-agent[1743]: d892a247688dbc13304d21b1a054a34e841db0803f8e7e6a812660f003bb4d3d Aug 26 19:46:46 ip-172-31-26-135 systemd[1]: Started ecs-agent.
やったね。
ついでに Roles for task が使えるのか確認。
ubuntu@ip-172-31-26-135:~$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 37269ca69a41 ubuntu:latest "sleep 300" About a minute ago Up About a minute ecs-mytask-3-ubuntu-aae8f5eea0bab9c7f601 d892a247688d amazon/amazon-ecs-agent:latest "/agent" About an hour ago Up About an hour ecs-agent ubuntu@ip-172-31-26-135:~$ sudo docker exec -it 37269ca69a41 /bin/bash root@8bc619ee3a75:/# curl 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI {"RoleArn":"arn:aws:iam::12345678xxxx:role/orenotask","AccessKeyId":"ASxxxxxxxxxxxxxxxxx","SecretAccessKey":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","Token":"xxxxxxxxxxxx//////////xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","Expiration":"2016-08-26T17:47:38Z"}
ほほー。
雑感
Docker と ECS の進化が早すぎてハゲそう。