大量サーバー群でも大丈夫！さくらのクラウド+Terraform+Slackでシンプル監視

## 概要

[Terraform for さくらのクラウド](https://github.com/yamamoto-febc/terraform-provider-sakuracloud)での[シンプル監視](http://cloud-news.sakura.ad.jp/simplemonitor/)の使い方です。

さくらのIPなら無料+外部のIPでも月間21円という安さで使えるため大量に使いたいところですが、
その場合、Slack通知先の変更などを各監視先ごとに設定するのが面倒です。

そこで[Terraform for さくらのクラウド](http://qiita.com/yamamoto-febc/items/ae92cd258cf040957487)を使えば大量の監視先でも柔軟に管理できるためオススメです。

## さくらのクラウド シンプル監視とは

指定のドメイン or IPアドレスに対して様々なプロトコルを通じて死活監視を行い、
障害発生時(+復旧時)に電子メールやSlackで通知を行ってくれるサービスです。

参照:[さくらのクラウドニュース:シンプル監視](http://cloud-news.sakura.ad.jp/simplemonitor/)

![simplemon2-768x546.png](https://qiita-image-store.s3.amazonaws.com/0/20668/d8ea45bf-3b86-8688-1a09-7331aa48d09b.png)

大きな特徴として、

  - さくらのIPアドレスなら無料 :bangbang:

というのがあります。

(この辺りは[こちらの記事](http://qiita.com/jh1vxw/items/c3d9b2d329187d1dca90)が詳しいです。)

## 参考情報

以下を読んでおくのがオススメです。
[Terraform for さくらのクラウド スタートアップガイド](http://qiita.com/yamamoto-febc/items/ae92cd258cf040957487)

## 必要なもの

  1. `Terraform`と`Terraform for さくらのクラウド`の実行環境([こちら](http://qiita.com/yamamoto-febc/items/ae92cd258cf040957487#terraformのセットアップ)を参考に構築してください)

  1. さくらのクラウドAPIキー([こちら](http://qiita.com/yamamoto-febc/items/ae92cd258cf040957487#さくらのクラウドapiキー取得)を参考に準備してください。)

  1. SlackのWebhook URL

## 使い方

tfファイルを作成して`terraform apply`します。

## tfファイルの書き方

tfファイルの基本的な記載方法は以下のようになります。

```simplemonitor.tf

# プロバイダ設定(APIキーを記載)
provider "sakuracloud" {
    token = "[ACCESS_TOKEN]"
    secret = "[ACCESS_TOKEN_SECRET]"
}

# 監視設定
resource "sakuracloud_simple_monitor" "foobar" {
    target = "[target FQDN] or [target IPAddress]"
    health_check = {
        protocol = "http"
        delay_loop = 120
        path = "/"
        status = "200"
    }
    notify_email_enabled = false
    notify_slack_enabled = true
    notify_slack_webhook = "https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX"
}

```

### プロバイダ設定

```simplemonitor.tf(プロバイダ設定)
# プロバイダ設定(APIキーを記載)
provider "sakuracloud" {
    token = "[ACCESS_TOKEN]"
    secret = "[ACCESS_TOKEN_SECRET]"
}
```

さくらのクラウドのコントロールパネルで取得したAPIキーの情報を記載します。

### 監視設定 

以下の項目を記載します。

  * `target` : 対象のFQDNまたはIPアドレスを記載します。
  * `health_check` : 監視方法を設定します(後ほど詳細を解説します)。
  * `notify_email_enabled` : Eメールでの通知の有効/無効を記載します(true or false)。
  * `notify_slack_enabled` : Slack通知の有効/無効を記載します(true or false)。
  * `notify_slack_webhook` : SlackのWebhook URLを記載します。

Eメールでの通知先はここでは設定できません。さくらのクラウドコントロールパネルから設定してください。

### 監視方法(プロトコル)別の記載方法について

監視を行うプロトコルによって`health_check`項目の記載方法が異なります。

#### pingの場合

```simplemonitor.tf(ping監視の場合)
    health_check = {
        protocol = "ping"
        delay_loop = 120
    }
```

  * `protocol` : "ping"を指定します
  * `delay_loop`: 監視間隔を秒数で指定します。最小`60`から最大`3600`の間で指定してください。

#### http/httpsの場合

```simplemonitor.tf(http/https監視の場合)
    health_check = {
        protocol = "http"     # or "https"
        path = "/"
        status = "200"
        delay_loop = 120
    }
```

  * `protocol` : httpまたはhttpsを指定します
  * `path` : 監視対象となるページのURLを指定します。例: /index.html
  * `status` : `path`へのリクエストに対するレスポンスのステータスコード期待値を指定します。
  * `delay_loop`: 監視間隔を秒数で指定します。最小`60`から最大`3600`の間で指定してください。

#### tcp/ssh/smtp/pop3の場合

```simplemonitor.tf(tcp/ssh/smtp/pop3監視の場合)
    health_check = {
        protocol = "tcp"     # or ssh / smtp / pop3
        port = "22"
        delay_loop = 120
    }
```

  * `protocol` : tcp/ssh/smtp/pop3のいづれかを指定します。
  * `port` : 監視対象のポート番号を指定します。
  * `delay_loop`: 監視間隔を秒数で指定します。最小`60`から最大`3600`の間で指定してください。

#### DNSの場合

```simplemonitor.tf(DNS監視の場合)
    health_check = {
        protocol = "dns"
        qname = "example.com"
        expected_data = "192.168.0.1"
        delay_loop = 120
    }
```

  * `protocol` : "dns"を指定します。
  * `qname` : 監視対象のFQDNを指定します。
  * `expected_data ` : DNS応答の期待値を指定します。省略した場合、レスポンスに何らかのAレコードが含まれているかをチェックします。
  * `delay_loop`: 監視間隔を秒数で指定します。最小`60`から最大`3600`の間で指定してください。

#### SNMPの場合

```simplemonitor.tf(SNMP監視の場合)
    health_check = {
        protocol = "snmp"
        community = "community"
        snmp_version = "1" # or "2c"
        oid = ".1.3.6.1.2.1.2.2.1.8.2"
        expected_data = "2"
        delay_loop = 120
    }
```

  * `protocol` : "snmp"を指定します。
  * `community ` : コミュニティ名を指定します。
  * `snmp_version ` : 対象のSNMPバージョンを指定します。(1 or 2c)
  * `oid ` : 監視対象のOIDを指定します。
  * `expected_data ` : 期待値を指定します。
  * `delay_loop`: 監視間隔を秒数で指定します。最小`60`から最大`3600`の間で指定してください。

## tips

 * 複数のIPアドレスをまとめて監視したい場合

Terraformの`variable`機能と`count`、`element関数`で実現します。

まず監視対象のIPアドレスを`variable`でカンマ区切りの文字列として定義します。
定義した`variable`は`${var.定義名}`とすれば参照できます。

```simplemonitor.tf(対象アドレス定義部分)
variable "target_ip_list"{
    default = "192.168.0.1,192.168.0.2,192.168.0.3,192.168.0.4,192.168.0.5"
}
```

**現在(terraform 0.6.16)は使用できませんが、次バージョン(0.7以降)は以下の記述ができるようになる予定です**

```simplemonitor.tf(terraform-0.7以降の書き方)
variable "target_ip_list"{
    default = [
        "192.168.0.1",
        "192.168.0.2",
        "192.168.0.3",
        "192.168.0.4",
        "192.168.0.5"
    ]
}
```

次に、リソース定義部分で`count`の指定を行うことで、必要数分の監視設定を作成できます。
先ほど定義した`target_ip_list`を`split`関数で分解して利用します。

```simplemonitor.tf(countの指定部分)

resource "sakuracloud_simple_monitor" "foobar" {
    # (中略)
    
    # 先ほど定義したtarget_ip_listの個数分作成する
    count = "${length(split("," , var.target_ip_list))}" 
}

```

最後に、監視対象のIPアドレスを以下のように指定します。

```simplemonitor.tf(IPアドレスの指定部分)
resource "sakuracloud_simple_monitor" "foobar" {
    # (中略)
    target = "${element( split("," ,var.target_ip_list) , count.index )}"
}
```

`element`関数は、指定のリストから指定のインデックスにある値を取得する関数です。
`count.index`と指定することで現在の自分自身のインデックスが取得可能です。

全体としては以下のようになります。

```simplemonitor.tf(count併用全体)
variable "target_ip_list"{
    default = "192.168.0.1,192.168.0.2,192.168.0.3,192.168.0.4,192.168.0.5"
}

resource "sakuracloud_simple_monitor" "foobar" {
    count = "${length(split("," , var.target_ip_list))}"
    target = "${element( split("," ,var.target_ip_list) , count.index )}"

    health_check = {
        protocol = "http"
        delay_loop = 120
        path = "/"
        status = "200"
    }
    notify_email_enabled = false
    notify_slack_enabled = true
    notify_slack_webhook = "https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX"
}
```

tfファイルは単純なテキストファイルなため、gitなどでバージョン管理するのがオススメです。
あとはtfファイルを作ってガンガン監視しちゃってください。

CI環境を構築しておき、監視対象のサーバーが追加されたらCIで`terraform apply`をキックするなんていうのも面白いですね :bangbang:

以上です。