LoginSignup
3
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-05-30

概要

Terraform for さくらのクラウドでのシンプル監視の使い方です。

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

そこでTerraform for さくらのクラウドを使えば大量の監視先でも柔軟に管理できるためオススメです。

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

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

参照:さくらのクラウドニュース:シンプル監視

simplemon2-768x546.png

大きな特徴として、

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

というのがあります。

(この辺りはこちらの記事が詳しいです。)

参考情報

以下を読んでおくのがオススメです。
Terraform for さくらのクラウド スタートアップガイド

必要なもの

  1. TerraformTerraform for さくらのクラウドの実行環境(こちらを参考に構築してください)

  2. さくらのクラウドAPIキー(こちらを参考に準備してください。)

  3. 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機能とcountelement関数で実現します。

まず監視対象の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_listsplit関数で分解して利用します。

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:

以上です。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3