ECSにZabbix環境をデプロイする【cloudpack大阪ブログ】


cloudpack大阪の佐々木です。
Zabbix環境をコンテナとしてECS上につくってみたので、まとめときます。

## デプロイ方法
ecs-cliとdocker-compose使ってデプロイします。

基本的なやり方はこちら
http://qiita.com/taishin/items/076a7699c787da68e396

docker-coposeはv2が使えるらしいので、今回はv2で記述しています。
http://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/cmd-ecs-cli-compose.html
> Amazon ECS CLI の最新バージョンでは、Docker 構成ファイル構文のバージョン 1 と 2 がサポートされています。

v2のリファレンス
https://docs.docker.com/compose/compose-file/compose-file-v2/

## docker-compose.yml

```yaml:docker-compose.yml
version: '2'

services:
  mysql-server:
    image: mysql
    mem_limit: 268435456
    environment:
      - MYSQL_DATABASE=zabbix
      - MYSQL_USER=zabbix
      - MYSQL_PASSWORD=zabbix
      - MYSQL_ROOT_PASSWORD=zabbix
    volumes:
        - /ecs/zabbix_mysql:/var/lib/mysql
    logging:
      driver: awslogs
      options:
        awslogs-group: "ECS-zabbix"
        awslogs-region: "us-east-1"
        awslogs-stream-prefix: "zabbix"

  zabbix-server-mysql:
    image: zabbix/zabbix-server-mysql:ubuntu-3.2-latest
    mem_limit: 134217728
    environment:
      - DB_SERVER_HOST=mysql-server
      - MYSQL_USER=zabbix
      - MYSQL_PASSWORD=zabbix
      - MYSQL_DATABASE=zabbix
    logging:
      driver: awslogs
      options:
        awslogs-group: "ECS-zabbix"
        awslogs-region: "us-east-1"
        awslogs-stream-prefix: "zabbix"
    links:
      - mysql-server
    ports:
      - 10050:10050

  zabbix-web-nginx-mysql:
    image: taishin/zabbix-web:latest
    mem_limit: 134217728
    environment:
      - DB_SERVER_HOST=mysql-server
      - ZBX_SERVER_HOST=zabbix-server-mysql
      - MYSQL_USER=zabbix
      - MYSQL_PASSWORD=zabbix
      - MYSQL_DATABASE=zabbix
      - TZ=Asia/Tokyo
      - COMPOSE_HTTP_TIMEOUT=200
    logging:
      driver: awslogs
      options:
        awslogs-group: "ECS-zabbix"
        awslogs-region: "us-east-1"
        awslogs-stream-prefix: "zabbix"
    links:
      - mysql-server
      - zabbix-server-mysql
    ports:
      - 8090:80
```


順番に説明します。

## コンテナ
下記の3つで構成するようにしました。
- mysql
- zabbix-server
- zabbix-web

Zabbixのコンテナはこちらのを使用します。
https://hub.docker.com/u/zabbix/

`zabbix-web`はそのまま使うとグラフの日本語が文字化けしますので、日本語フォントを入れて、Buildします。
Dokcerfileは下記のようになります。

```Dockerfile
FROM zabbix/zabbix-web-nginx-mysql:ubuntu-3.2-latest
RUN apt-get update -y && apt-get install -y fonts-ipafont
RUN ln -s /usr/share/fonts/opentype/ipafont-gothic/ipagp.ttf /usr/share/zabbix/fonts/ipagp.ttf
RUN sed -i -e 's/graphfont/ipagp/g' /usr/share/zabbix/include/defines.inc.php
```

ecs-cliで使うdocker-composeは`build`に対応していないので、あらかじめビルドしてどこかにアップしておく必要があります。
http://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/cmd-ecs-cli-compose.html
> 重要
build ディレクティブは現在サポートされていません。

今回は自分のdockerhubにアップしておきました。




## メモリ制限

メモリ制限は下記に記述でハード制限ができます。ソフト制限はできないっぽいです。


```yaml:
    mem_limit: 268435456
```

## 永続化データ
MySQLのデータは永続化したいので、ボリュームを作成します。
下記の記述でホストOSの`/etc/zabbix_mysql`がコンテナの`/var/lib/mysql`にマウントされます。

```yaml:
    volumes:
        - /ecs/zabbix_mysql:/var/lib/mysql
```
マネジメントコンソールで見るとこんな感じです。

![Kobito.NcjJB2.png](https://qiita-image-store.s3.amazonaws.com/0/3246/243885d3-a4d6-4732-8e61-a138c47fd0d2.png "Kobito.NcjJB2.png")

![Kobito.dg0AbK.png](https://qiita-image-store.s3.amazonaws.com/0/3246/b4476ecd-d8d0-da4f-9819-3e1404692513.png "Kobito.dg0AbK.png")

amazon-ecs-optimizedのAMIを使う場合は下記も注意です。
http://qiita.com/taishin/items/cff9c3212d0f697653e4

## Log
コンテナが出力するログはCloudwatch Logsに転送します。
http://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/using_awslogs.html

docker-compose v1のときは

```yaml:
log_driver: awslogs
```
こんな記述でしたが、v2では下記のような表記になります。

```yaml:
    logging:
      driver: awslogs
      options:
        awslogs-group: "ECS-zabbix"
        awslogs-region: "us-east-1"
        awslogs-stream-prefix: "zabbix"
```
ロググループはあらかじめ作成しておく必要があります。

ストリームプレフィックスですが、  
    
- awslogs-stream-prefix をつけない場合

![Kobito.V9TWgn.png](https://qiita-image-store.s3.amazonaws.com/0/3246/dcb6f20f-5250-4e6a-0fb5-670638a3381e.png "Kobito.V9TWgn.png")

コンテナごとに乱数のストリーム名になります。

- awslogs-stream-prefix をつけた場合
![Kobito.GSxPru.png](https://qiita-image-store.s3.amazonaws.com/0/3246/7c709ae8-d089-ed93-d146-153a19a28ca1.png "Kobito.GSxPru.png")

ストリーム名が下記のフォーマットになるので、付けておいた方が分かりやすいです。

```
prefix-name/container-name/ecs-task-id
```

## ポート

ホストの8090番ポートをコンテナの80番ポートに転送しています。

```yaml:
    ports:
      - 8090:80
```

ちなみに固定ポートではなく、ダイナミックポートにする場合は下記のように書きます。

```yaml:
    ports:
      - :80
```

## デプロイ
`ecs-cli compose service up` です。

```bash:
$ ecs-cli compose service up                                                  [10:47:02]
WARN[0000] Skipping unsupported YAML option...           option name=networks
WARN[0000] Skipping unsupported YAML option for service...  option name=networks service name=zabbix-server-mysql
WARN[0000] Skipping unsupported YAML option for service...  option name=networks service name=zabbix-web-nginx-mysql
WARN[0000] Skipping unsupported YAML option for service...  option name=networks service name=mysql-server
INFO[0001] Using ECS task definition                     TaskDefinition="ecscompose-zabbix-docker:40"
INFO[0002] Created an ECS service                        service=ecscompose-service-zabbix-docker taskDefinition="ecscompose-zabbix-docker:40"
INFO[0002] Updated ECS service successfully              desiredCount=1 serviceName=ecscompose-service-zabbix-docker
INFO[0003] Describe ECS Service status                   desiredCount=1 runningCount=0 serviceName=ecscompose-service-zabbix-docker
INFO[0018] ECS Service has reached a stable state        desiredCount=1 runningCount=1 serviceName=ecscompose-service-zabbix-docker
```

マネージメントコンソールでタスク定義をいじるようり、docker-composeの方がだいぶ楽ですね。