概要
Terraform for さくらのクラウドでのシンプル監視の使い方です。
さくらのIPなら無料+外部のIPでも月間21円という安さで使えるため大量に使いたいところですが、
その場合、Slack通知先の変更などを各監視先ごとに設定するのが面倒です。
そこでTerraform for さくらのクラウドを使えば大量の監視先でも柔軟に管理できるためオススメです。
さくらのクラウド シンプル監視とは
指定のドメイン or IPアドレスに対して様々なプロトコルを通じて死活監視を行い、
障害発生時(+復旧時)に電子メールやSlackで通知を行ってくれるサービスです。
大きな特徴として、
- さくらのIPアドレスなら無料
というのがあります。
(この辺りはこちらの記事が詳しいです。)
参考情報
以下を読んでおくのがオススメです。
Terraform for さくらのクラウド スタートアップガイド
必要なもの
-
Terraform
とTerraform for さくらのクラウド
の実行環境(こちらを参考に構築してください) -
さくらのクラウドAPIキー(こちらを参考に準備してください。)
-
SlackのWebhook URL
使い方
tfファイルを作成してterraform apply
します。
tfファイルの書き方
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"
}
プロバイダ設定
# プロバイダ設定(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の場合
health_check = {
protocol = "ping"
delay_loop = 120
}
-
protocol
: "ping"を指定します -
delay_loop
: 監視間隔を秒数で指定します。最小60
から最大3600
の間で指定してください。
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の場合
health_check = {
protocol = "tcp" # or ssh / smtp / pop3
port = "22"
delay_loop = 120
}
-
protocol
: tcp/ssh/smtp/pop3のいづれかを指定します。 -
port
: 監視対象のポート番号を指定します。 -
delay_loop
: 監視間隔を秒数で指定します。最小60
から最大3600
の間で指定してください。
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の場合
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.定義名}
とすれば参照できます。
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以降)は以下の記述ができるようになる予定です
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
関数で分解して利用します。
resource "sakuracloud_simple_monitor" "foobar" {
# (中略)
# 先ほど定義したtarget_ip_listの個数分作成する
count = "${length(split("," , var.target_ip_list))}"
}
最後に、監視対象のIPアドレスを以下のように指定します。
resource "sakuracloud_simple_monitor" "foobar" {
# (中略)
target = "${element( split("," ,var.target_ip_list) , count.index )}"
}
element
関数は、指定のリストから指定のインデックスにある値を取得する関数です。
count.index
と指定することで現在の自分自身のインデックスが取得可能です。
全体としては以下のようになります。
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
をキックするなんていうのも面白いですね
以上です。