ECS Fargate でZabbixを構築

# 背景
コンテナ間の接続検証としていずれEC2からECSへ予定のzabbixを対象にした。
ECSはdocker-compose.ymlのlinksが使えない。
ECSのデフォルト値や細かい設定は省略する。

# EC2

## ロードバランサーを作成

![ecs-zabbix_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249425/8561fb81-d757-f8f2-6330-da8754f65099.png)

 * ロードバランサー名: infra-test-web
  * AWS Certificate Managerに証明書作成済みならSSL 証明書に追加する。
  * DNS名はRoute53でCNAMEして短くする
  * infra-test-web-2099560009.ap-northeast-1.elb.amazonaws.com　→　ecs-zabbix.domain.com

![ecs-zabbix_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249425/ed460911-ef12-8a11-3e01-45f66f71b169.png)

 * ターゲットグループ: infra-test-web-tg


# ECS

## 1. タスク定義: zabbix-server&agent

* タスク定義名: infra-test-zabbix-server
* 互換性が必要: FARGATE

#### 1-1. コンテナー: zabbix-server
  * コンテナ名: infra-test-zabbix-server
  * イメージ: zabbix/zabbix-server-mysql:centos-4.4.1
  * ポートマッピング: 10051 tcp
  * 環境変数
   * DB_SERVER_HOST = mysql.domain.com
   * MYSQL_DATABASE = zabbix
   * MYSQL_USER = zabbix
   * MYSQL_PASSWORD = zabbix_pwd

#### 1-2 コンテナ: zabbix-agent
 * コンテナ名: infra-test-zabbix-agent
 * イメージ: zabbix/zabbix-agent:centos-4.4.1
 * ポートマッピング: 10050 tcp
 * 環境変数
  * ZBX_SERVER_HOST = infra-test-zabbix-server.local

## サービスの作成: zabbix-server
 * サービス名: infra-test-zabbix-server
 * サービスの検出のエンドポイント infra-test-zabbix-server.local <- これが大事！ウェブコンテナから指定するエンドポイントになる


## 2. タスク定義: zabbix-web

* タスク定義名: infra-test-zabbix-web
* 互換性が必要: FARGATE

* コンテナー
 * コンテナ名: infra-test-zabbix-web
 * イメージ: zabbix/zabbix-web-apache-mysql:centos-4.4.1
 * ポートマッピング: 80 tcp
 * 環境変数
 * DB_SERVER_HOST = mysql.domain.com <- RDSが使えて便利
 * MYSQL_DATABASE = zabbix
 * MYSQL_USER = zabbix
 * MYSQL_PASSWORD = zabbix_pwd
 * TZ = Asia/Tokyo
 * ZBX_SERVER_HOST = infra-test-zabbix-server.local

## サービスの作成
![ecs-zabbix_4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249425/06248aa1-9873-b808-db25-eba4092975f3.png)

 * サービス名: infra-test-zabbix-web
 * ネットワーク構成: 事前に作成したロードバランサーのinfra-test-webを選択

##クラスター完成
![ecs-zabbix_3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249425/43e076b6-4a04-4c36-d308-0acb650c9dbe.png)


# 確認

* https://ecs-zabbix.domain.com/

* 初期設定ではZabbix ServerのAgentは自身になっているのでzabbix_agentコンテナ名に変更。
* Zabbixホストのエージェントインターフェース
 * DNS名: zabbix_agent
 * 接続方法: DNS

![ecs-zabbix_5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249425/77ce4f53-9b72-8cab-0200-d77d3b36ae45.png)


# 参考にしたスクリプト

* docker-compose.yml
 
```yml
version: "3"
services:
  zabbix_db:
    image: mysql:5.7
    environment:
      - MYSQL_DATABASE=${DB_NAME}
      - MYSQL_USER=${DB_USER}
      - MYSQL_PASSWORD=${DB_USER_PASSWORD}
      - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
  zabbix_server:
    image: zabbix/zabbix-server-mysql:${OS}-${VERSION}
    environment:
      - DB_SERVER_HOST=zabbix_db
      - MYSQL_DATABASE=${DB_NAME}
      - MYSQL_USER=${DB_USER}
      - MYSQL_PASSWORD=${DB_USER_PASSWORD}
      - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
      - ZBX_DEBUGLEVEL=${LOG_LEVEL}
    ports:
      - "10051:10051"
    links:
      - zabbix_db
  zabbix_web:
    image: zabbix/zabbix-web-apache-mysql:${OS}-${VERSION}
    environment:
      - ZBX_SERVER_HOST=zabbix_server
      - DB_SERVER_HOST=zabbix_db
      - MYSQL_DATABASE=${DB_NAME}
      - MYSQL_USER=${DB_USER}
      - MYSQL_PASSWORD=${DB_USER_PASSWORD}
      - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
      - PHP_TZ=${TIME_ZONE}
    ports:
      - ${HTTP_PORT}:80
    links:
      - zabbix_server
      - zabbix_db
  zabbix_agent:
    image: zabbix/zabbix-agent:${OS}-${VERSION}
    privileged: true
    environment:
      - ZBX_SERVER_HOST=zabbix_server
    expose:
      - "10050"
    links:
      - zabbix_server
```

* .env

```bash
OS=centos
VERSION=4.4.1
#VERSION=5.0.0
DB_NAME=zabbix
DB_USER=zabbix
DB_USER_PASSWORD=zabbix
DB_ROOT_PASSWORD=zabbix
HTTP_PORT=38080
TIME_ZONE=Asia/Tokyo
LOG_LEVEL=3

```


#参考
* [ECSのサービスディスカバリーが東京にやってきて、コンテナ間通信の実装が簡単になりました！](https://dev.classmethod.jp/cloud/aws/ecs-service-discovery/)
* [docker-composeを使ってZabbixの環境を作成する](https://qiita.com/puripuri_corgy/items/5f2a38903c674fc080ee)