ようへいの日々精進XP

よかろうもん

Amazon ECS + registrator + consul でサービスの自動登録超シンプルパターン(HAProxy を使った例)

気づいたら面白そうなことが出来そうな事をつまみ食いしていたので組み合わせて試してみました。

概要

絵が一番わかりやすし。

f:id:inokara:20150625005005p:plain

ECS で登録したタスクで起動したコンテナアプリケーションを registrator で consul にサービスを自動登録して consul-template で haproxy の設定を書き出す。


参考


準備

Amazon ECS 環境の用意

inokara.hateblo.jp

上の記事でちょこっと ECS を触ってみました。

registrator の用意

inokara.hateblo.jp

上の記事でちょこっと registrator を触ってみました。


haproxy と consul と consul-template の用意

事前に...

consul と consul-template はダウンロードしておこう。

haproxy の用意

sudo yum -y install haproxy

consul の起動

consul agent -server -bootstrap -data-dir=/tmp/consul &

haproxy のテンプレートファイルを用意

  • /tmp/haproxy.cfg.ctmpl
global
    daemon
    maxconn 256

defaults
    mode tcp
    timeout connect 5000ms
    timeout client 60000ms
    timeout server 60000ms

listen http-in
    bind *:8000{{range service "centos"}}
    server {{.ID}} {{.Address}}:{{.Port}} check{{end}}

consul-template の起動

sudo consul-template -consul 127.0.0.1:8500 -template "/tmp/haproxy.cfg.ctmpl:/etc/haproxy/haproxy.cfg:service haproxy restart" &

やっと本題

ECS の task

  • simple-web-service.json
[
  {
    "environment": [],
    "name": "centos",
    "image": "centos:centos6",
    "cpu": 10,
    "portMappings": [{
      "containerPort": 8000
      }],
    "memory": 10,
    "command": [
      "/bin/sh", "-c", "hostname -s > /tmp/index.html ; cd /tmp/ ; python -m SimpleHTTPServer 8000"
    ],
    "essential": true
  }
]

task を定義。

 aws ecs register-task-definition --family kappa-test --container-definitions file://simple-web-service.json --output json

task の実行

aws ecs run-task --cluster kappa-test-cluster --task-definition kappa-test:5 --count 2 --output json

コンテナインスタンス側では以下のようなログが出力される。

[ec2-user@ip-xx-x-x-xxx consul-template_0.10.0_linux_amd64]$     
2015/06/24 15:07:51 [INFO] agent: Synced service 'ip-xx-x-x-xxx:ecs-kappa-test-5-centos-e4cdd7a4c7e180d5cb01:8000'
2015/06/24 15:07:51 registrator: added: 25a2be61b30e ip-xx-x-x-xxx:ecs-kappa-test-5-centos-e4cdd7a4c7e180d5cb01:8000
Stopping haproxy: [  OK  ]
Starting haproxy: [  OK  ]
2015/06/24 15:07:53 [INFO] agent: Synced service 'ip-xx-x-x-xxx:ecs-kappa-test-5-centos-9890fa90b5a8f4e29a01:8000'
2015/06/24 15:07:53 registrator: added: 3c98ceec24b4 ip-xx-x-x-xxx:ecs-kappa-test-5-centos-9890fa90b5a8f4e29a01:8000
Stopping haproxy: [  OK  ]
Starting haproxy: [  OK  ]

[ec2-user@ip-xx-x-x-xxx consul-template_0.10.0_linux_amd64]$

確認もろもろ

  • コンテナ
[ec2-user@ip-xx-x-x-xxx consul-template_0.10.0_linux_amd64]$ docker ps
CONTAINER ID        IMAGE                            COMMAND                CREATED             STATUS              PORTS                        NAMES
3c98ceec24b4        centos:centos6                   "/bin/sh -c 'hostnam   2 minutes ago       Up 2 minutes        0.0.0.0:32782->8000/tcp      ecs-kappa-test-5-centos-9890fa90b5a8f4e29a01
25a2be61b30e        centos:centos6                   "/bin/sh -c 'hostnam   2 minutes ago       Up 2 minutes        0.0.0.0:32781->8000/tcp      ecs-kappa-test-5-centos-e4cdd7a4c7e180d5cb01
9cdaec7ca88b        amazon/amazon-ecs-agent:latest   "/agent"               About an hour ago   Up About an hour    127.0.0.1:51678->51678/tcp   ecs-agent
  • consul に登録されているサービス
[ec2-user@ip-xx-x-x-xxx consul-template_0.10.0_linux_amd64]$ curl -s localhost:8500/v1/catalog/services?pretty
{
    "amazon-ecs-agent": [],
    "centos": [],
    "consul": []
}
[ec2-user@ip-xx-x-x-xxx consul-template_0.10.0_linux_amd64]$ curl -s localhost:8500/v1/catalog/service/centos?pretty=true
[
    {
        "Node": "ip-xx-x-x-xxx",
        "Address": "xx.x.x.xxx",
        "ServiceID": "ip-xx-x-x-xxx:ecs-kappa-test-5-centos-e4cdd7a4c7e180d5cb01:8000",
        "ServiceName": "centos",
        "ServiceTags": null,
        "ServiceAddress": "",
        "ServicePort": 32781
    },
    {
        "Node": "ip-xx-x-x-xxx",
        "Address": "xx.x.x.xxx",
        "ServiceID": "ip-xx-x-x-xxx:ecs-kappa-test-5-centos-9890fa90b5a8f4e29a01:8000",
        "ServiceName": "centos",
        "ServiceTags": null,
        "ServiceAddress": "",
        "ServicePort": 32782
    }
]
  • haproxy へのアクセス
[ec2-user@ip-xx-x-x-xxx consul-template_0.10.0_linux_amd64]$ curl localhost:8000
3c98ceec24b4
[ec2-user@ip-xx-x-x-xxx consul-template_0.10.0_linux_amd64]$ curl localhost:8000
25a2be61b30e
[ec2-user@ip-xx-x-x-xxx consul-template_0.10.0_linux_amd64]$ curl localhost:8000
3c98ceec24b4
[ec2-user@ip-xx-x-x-xxx consul-template_0.10.0_linux_amd64]$ curl localhost:8000
25a2be61b30e

気づいてみたら

以下の記事と似たようなことをやっていましたとさ。

上記の記事では registrator も Docker コンテナでやっているようだけど、ECS のコンテナインスタンスがシンプルな Amazon Linux なので registrator をそのままインストールしてもいいかなあと思ったりした。自腹が続く限りは...今度は複数台のコンテナインスタンスでやってみたい。