Zabbix をバージョンアップしたらメンテナンスの設定を間違えて関係各所をざわつかせてしまった話


最近はゲームでも小説でもなんでも、タイトルが長いものが流行ですよね。

# はじめに

はじめまして。
オークファン入社歴二年目、インフラエンジニア歴二年目の @aucfan-0540 です。
業務では主に AWS を用いたインフラ環境の構築等に携わっています。
アドベントカレンダーを書くのは二回目です。
昨年度はこんな記事を書きました。
https://qiita.com/aucfan-0540/items/01e33583fe76318fb3b1


今回は`Zabbix` のバージョンアップ時にメンテナンス期間の設定を間違え、大量のアラートを発生させると同時に関係各所をざわつかせてしまった時の話を自分への戒めとして記事に残そうと思います。
よろしくお願いします。

# やりたかったこと

弊社では一部サーバーの監視に AWS の EC2 インスタンス上に構築した`Zabbix 4.4`を使用していました。
ある日の定例で「`Zabbix 4.4`はサポートが終了しているからそろそろバージョンを上げたいよね」という話が持ち上がり、その作業を私が担当することになりました。

特にバージョンの指定などなかったので、当時最新だった`Zabbix 6.0`にしたいなあと思い調べてみたところ、現在使用している`AmazonLinux 2`のインスタンスでは`RHEL8`系のみ対応の`Zabbix 6.0`は動かせない！ ということがわかったので、AWS のマーケットプレイスから代替の OS を探し、紆余曲折の末に`AlmaLinux`を使うことにしました。更に`Zabbix 6.0`は`MySQL 8.0`のみ対応だったため、インスタンスに接続した`RDS`の`MySQL`のバージョンもあげることになりました。

徒然なるままに書き連ねましたが、最終的な変更点が下記です。

【現行】 

| OS | zabbix | zabbix-agent | mysql |
| --- | --- | --- | --- |
| AmazonLinux2 | 4.4.10 | 4.4.10 | 5.7.27 |

【バージョンアップ後】 

| OS | zabbix | zabbix-agent | mysql |
| --- | --- | --- | --- |
| AlmaLinux | 6.0.9 | 6.0.9| 8.0.30 |

# なにをしたのか？

アップグレートを行うにあたり、既存の外部スクリプトがきちんと動くか等諸々の検証が必要になったので、まずは検証用のリソースから作ることにしました。

## 隙のない検証手順

いま見返すと隙だらけですが、当時はそう信じて疑いませんでした。

 1. `RDS`のスナップショットを作成する
 1. スナップショットから`RDS`を複製する
 1. `AMI`を用いて現行の`Zabbix`サーバーの複製を作成する
 1. 複製した`RDS`に同じく複製した`Zabbix`を接続し、もろもろ`Zabbix 6.0`用の検証
 1. 一通りうまくいったら本番反映だ！


# アラーム大騒ぎ（第一回目）

必要なリソースを作成し、インスタンスへ SSH 接続後に以下を実行しました。

```console
systemctl start zabbix-server
```

コマンドを実行したのとほとんど同じタイミングで`Zabbix`のアラートと連携している Slackチャンネル が騒ぎはじめました。詳細を見てみると、Web 監視をしていた数多のサービスが失敗（`test.fail`）を返しているようです。

その時は自分のせいだとは思っていなかったので「なにか障害が起きているのかな…？」と`Zabbix`のアップデート作業を一時中断し、アラートの上がっているサーバーへ接続して様子を探ることにしました。

作業を中断するために`systemctl stop zabbix-server`を実行してしばらく後にアラームが鳴りやんだので、偶然だなあと思いつつも、その時はあまり深く考えませんでした。自分が関与している可能性をあまり考えたくなかったというのもあります。


#  アラーム大騒ぎ（第二回目）

翌日、再び検証用のインスタンスで`Zabbix`を起動しました。案の定またアラームが鳴り響きました。内容は前回とまったく同じです。
こんなことが二回続くとさすがに偶然とは思えなかったので、頻発するアラームに戸惑っている slack チャンネルで自供をしました。

![スクリーンショット 2022-12-02 002158.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2302869/7df9d141-7ba1-87dd-42bc-1f8cae83b466.png)

文面からわかる通り、この期に及んでまだ自分のせいだという確信を得ていません。このとき`Zabbix`を使って作業をしていたのは一人だけなんだから確実にアンタやで…という感じなんですが、本当にこの時までは自分のせいだと思っていませんでした。

## 何が原因だったのか？

ものすごく初歩的なことでお恥ずかしい限りですが、複製した`Zabbix`をメンテナンスモードにしていませんでした。
自分の中に「**本番環境から複製して切り離したリソースなんだから、本番の設定は関係ない**」という巨大な思い込みがあったためです。

複製した`Zabbix`サーバーは、起動と同時に各サービスへアクセスしようとしますが、検証用のインスタンスには当然アクセス許可が設定されていないため、Web 監視に失敗します。
加えて本番環境から複製したデータベースを使っていたので、通知の設定などもまるまる引き継がれており「**サービスには何の問題もないが、`Zabbix`がアクセスを拒否され 4xx エラーになり Web 監視が失敗、 Slack の通知が止まらなかった**」という状態になっていました。

## どうすればよかったのか？

以下のような手順で実行すれば、アラームはならなかったと思います。

 1. 起動時にアラートが上がらないよう、現行の`Zabbix`にメンテナンス期間を設定する
 1. その状態で`RDS`のスナップショットを作成する
 1. スナップショットから`RDS`を複製する
 1. `AMI`を用いて現行の`Zabbix`サーバーの複製を作成する
 1. 複製した`RDS`に同じく複製した`Zabbix`を接続し、もろもろ`Zabbix 6.0`の検証
 1. 一通りうまくいったら本番反映だ！

というわけで、メンテナンス期間を設定して`RDS`を複製、今度こそは大丈夫だろうと椅子に深く腰をかけながら`Zabbix`を起動しました。

#  アラーム大騒ぎ（第三回目）

![スクリーンショット 2022-12-02 020449.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2302869/6105b05d-7450-b3ae-6869-09b6a162e537.png)


だめでした…………。

Slack で各所へ謝罪しながら、設定したのに何がダメなんですか…と打ちひしがれていたところ、どうやらメンテナンスの設定を**データ収集あり**ではなく**データ取集なし**にしないと、メンテナンス期間であれ`Zabbix`は値を取ってこようとしてしまうみたいです。
（下記は`Zabbix 6.0`のコンソールです。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2302869/3a44d9a7-7c7a-7cfe-8052-9fae05c2ae67.png)

メンテナンス設定とデータ収集の有無は`sql`を用いても確認することができます。
`maintenance_type`が`1`なら「データ収集なし」です。

```sql
mysql> SELECT * FROM zabbix.maintenances;
+---------------+-----------------------------------------+------------------+----------------------+--------------+-------------+---------------+
| maintenanceid | name                                    | maintenance_type | description          | active_since | active_till | tags_evaltype |
+---------------+-----------------------------------------+------------------+----------------------+--------------+-------------+---------------+
|            10 | zabbix-versionup-2022                   |                1 | for zabbix versionup |   xxxxx      |  xxxxx      |             0 |
+---------------+-----------------------------------------+------------------+----------------------+--------------+-------------+---------------+
```

上記を基にメンテナンスの設定を更新し、満を持して`Zabbix`起動したところ、今度は何もアラートがなりませんでした。やった！


# まとめ

今回のことで得た知見です。

 * 本番環境から切り離した = 本番環境へ影響を及ぼさない ではない
 * バージョンアップは慎重に行う
 * 現在起こっている障害に対し、心当たりがあったらすぐに言う
 * 常に自分を疑う
 * Zabbix は難しい

# 最後に

株式会社オークファンではエンジニアを募集しております。
ご興味持っていただけた方はぜひ！