さくらのクラウドでterraform - プライベート監視サーバ構築

### はじめに 
さくらのクラウドでさまざまなシステム環境をterraformで構築していきます。
今回はzabbixベースのプライベート監視サーバ環境です。

### 本記事の主旨
さくらのクラウドでは監視サービスの選択肢が限られています。
[シンプル監視](https://manual.sakura.ad.jp/cloud/appliance/simplemonitor/index.html) というインターネット環境からの外形監視サービスはあるのですが、クラウド内のプライベートNW環境の監視は対応できません。
このため、プライベートNW環境を監視するにはさくらのクラウド外の監視SaaSを使用したりユーザ自身で監視サーバを構築する必要があります。 
※メール通知等クラウド外のインターネット環境と通信する場合はFWの穴あけ対応等も必要です。

そこで、今回はさくらのクラウド上にプライベート監視サーバをterraformで構築してみます。
これからクラウド環境を作る方、既にクラウド環境がある方それぞれに対応可能なよう構成しているので、ぜひご活用ください。

### 構成イメージ/構築のポイント
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258955/121f1003-803d-439e-97a3-b7b2e8f6b86a.png)

プライベート監視サーバという事で、サーバの上位NWはスイッチに接続する構成を想定しています。
**①既存スイッチへ追加するモード**と、インターネット向けの接続環境を含めた**②VPCルータ付きで新規構築するモード**の2通りを使い分ける事ができます。

* ①の構成について
    * 既存のスイッチを利用する場合はスイッチのリソースコードを指定する事に加え、既存NW内のデフォルトゲートウェイも指定する必要があります。
    * 初期構築処理の都合、インターネット環境と通信が発生します。このため②構成のようにVPCルータ等でNAT経由でインターネットへ通信可能な環境を前提としています。

* ②の構成について
    * 赤点線枠の通りリソースが作成されます。
    * 監視対象のサーバは新規作成されたスイッチに接続頂き監視NWとして利用するか、作成したVPCルータ経由で外部公開/インターネットVPN接続頂いても構いません。
        * 外部公開する際はポートフォワードのみとなるためご注意ください。

### 構築作業

#### 事前準備
まだ作成していない場合は会員IDの作成、クラウドアカウントの発行を済ませましょう。
https://cloud.sakura.ad.jp/flow/
また、terraformを実行するにあたり、クラウドアカウントに対応した編集/削除権限をもったAPIキーを発行しておきます。
https://manual.sakura.ad.jp/cloud/api/apikey.html#id3

また、terraformの実行環境を作業端末に構築しておいてください。
※動作確認バージョンは後述のgithubリポジトリを参照してください。

#### terraform構築の準備
以下リポジトリにコードを置いています。
https://github.com/tskaz/sakura_tf/tree/main/01_zabbix-server
readmeの案内に沿ってコード一式を作業端末へ展開してください。

variables.tfファイル内の [sw_already_exisits] の値を変更する事で構成図① or ②どちらを構築するか切り替える事ができます。

```
variable "sw_already_exisits" {
  default = false
}
```
それぞれの構成毎に設定する内容が異なるため、READMEの内容を参照ください。
[利用する手順](https://github.com/tskaz/sakura_tf/tree/main/01_zabbix-server#%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86)

#### terraformコマンドの実行

terraformを init/plan/apply の順で実行します。 password変数に初期値を指定しない場合はplan/applyの際に入力してください。

```
terraform init
terraform plan
terraform apply

var.password
  Enter a value: #PWを入力後Enter
```

#### terraform apply実行後の出力(Outputs)

* 構成①(sw_already_exisits:true) の場合
  * 既存スイッチNW内のIPがアサインされた状態でサーバが作成されます。
  * サーバへssh接続する場合は、ユーザ[sacloud-user]、PJフォルダ内に生成される[id_rsa_zbx01]ファイルを使用して公開鍵認証でSSH接続してください。
  * sacloud-userはsudoersへ登録済のため、sudoコマンドを使って特権ユーザとしてサーバ操作可能です。 
  * zabbixのwebフロントエンドへ接続する場合はzabbix_url_prvのアドレスへアクセスしてください。
~~~
Outputs:

server_info = {
  "hostname" = [
    "sakuracloud-dev-zabbix-zbx01",
  ]
  "ip_address" = [
    "192.168.100.100",
  ]
  "os" = "AlmaLinux 9.4 (cloudimg)"
  "ssh_cmd_example_prv" = "ssh sacloud-user@192.168.100.100 -i [ssh_key]"
  "ssh_cmd_example_pub" = ""
}
vpcrt_info = {
  "vpcrt_ip" = []
}
zabbix_url = {
  "zabbix_url_prv" = "http://192.168.100.100:8080"
  "zabbix_url_pub" = ""
~~~

* 構成②(sw_already_exisits:false) の場合
  * サーバ関連の設定、操作は構成①と同様です。
  * 新規VPCルータ配下にzabbixサーバが作成されるためインターネット経由でZabbixサーバへ接続可能なよう構築しています。
      * VPCルータのポートフォワードによりzabbixサーバに対して以下の通り転送されます。 
        * ssh(10022→22)
        * web(8080→8080)
~~~
Outputs:

server_info = {
  "hostname" = [
    "sakuracloud-dev-zabbix-zbx01",
  ]
  "ip_address" = [
    "192.168.1.100",
  ]
  "os" = "AlmaLinux 9.4 (cloudimg)"
  "ssh_cmd_example_prv" = "ssh sacloud-user@192.168.1.100 -i [ssh_key]"
  "ssh_cmd_example_pub" = "ssh sacloud-user@[VPCルータのグローバルIP] -p 10022 -i [ssh_key]"
}
vpcrt_info = {
  "vpcrt_ip" = [
    "[VPCルータのグローバルIP]",
  ]
}
zabbix_url = {
  "zabbix_url_prv" = "http://192.168.1.100:8080"
  "zabbix_url_pub" = "http://[VPCルータのグローバルIP]:8080"
}
~~~

#### Zabbix設定

zabbix_urlへログイン後、以下を参考に初期設定を実施してください。
https://www.zabbix.com/documentation/7.0/en/manual/installation/frontend

* ようこそ画面
  * 日本語パッケージインストール済のため、デフォルトの言語は[日本語(ja_JP)]を選択可能です。
* 前提条件のチェック
  * 必要パッケージはインストール済のため次ステップへ進めてください。
* データベース接続設定
  * データベースはPostgreSQLインストール済です。以下の通り設定してください。※記載以外は初期値で構いません。
    * データベースホスト：[localhost]
    * データベースユーザのPW：[zabbix]
* 設定画面
  * Zabbixサーバ名に任意の名称を入力してください。
  * タイムゾーンは[(UTC+09:00)Asia/Tokyo]を選択してください。

初期設定後は以下の認証情報(Zabbix初期値)でログインできます。
監視環境に応じてZabbix内の設定を進めてください。
* ユーザー名：Admin
* パスワード：zabbix

※参考：Zabbix Quickstart
https://www.zabbix.com/documentation/7.0/en/manual/quickstart/login

#### 環境の削除

destroyコマンドで削除します。
password変数の入力を求められる場合は任意の値(構築時と同じでなくてもOK)を入力してください。
```
terraform destroy
```

### おわりに

今回はプライベート監視サーバ環境を作ってみました。
設定値を切り替えることで複数パターン構成に対して1式のコードで対応可能にしたのは中々骨が折れましたが、、条件分岐によりリソース作成/Outputsの出力内容の調整をするためのナレッジを得られました。
監視通知用のメールサーバは[さくらのレンタルサーバ(メールボックスプラン)](https://rs.sakura.ad.jp/mail/)を使ったり[SendGrid](https://manual.sakura.ad.jp/cloud/appliance/sendgrid/index.html)の利用をご検討ください。

また、記事執筆時点では監視マネージドサービスである[モニタリングスイート](https://manual.sakura.ad.jp/cloud/appliance/monitoring-suite/index.html)がβリリースされているため、今後こちらを使った監視構成にもチャレンジしてみたいと思います。