tl;dr
引き続き, ギョームでやったことの振り返りです. (決して, こればっかりやっているわけではありませぬ)
YAMAP では, 各種システムの監視はメトリクスは CloudWatch で, 通知は CloudWatch Alarm を主に利用していますが, 最近, 定期的に発生する障害ではない CloudWatch Alarm の通知をなんとかしないと考えていました.
障害ではない CloudWatch Alarm とは, 例えば, 定期的なバッチ処理によって一時的にデータベースサーバーのレプリカラグやスケジュールされたメンテナンスによる一時的なサーバー停止等が挙げられます. このような場合, Datadog をはじめ類似の監視ツールでは, スケジュールを設定して一時的に通知や監視そのものを止める等の機能が備わっているという認識です. (スケジュールダウンタイムとか)
ところが, CloudWatch Alarm には残念ながらスケジュールダウンタイム的な機能を見つけることができなかったので, 社内で稼働している hubot (tengu) と cronbot を合わせてスケジュールダウンタイム的な機能を実装してみた振り返りとなります.
作った hubot script
このスクリプトを hubot の scripts ディレクトリ以下に放り込みます. また, AWS のリソースにアクセスする為のアクセスキーやシークレットアクセスキーは環境変数に設定しておく必要があります. さらに, スクリプトを見て頂くとお判りになると思いますが, ap-northeast-1
(東京リージョン) 決め打ちになっていますので, 必要に応じで変更が必要になります.
... module.exports = (robot => { const cw = new AWS.CloudWatch({ region: 'ap-northeast-1' }) ...
動かし方
CloudWatch Alarm の一覧を取得
設定されている CloudWatch Alarm の一覧を取得する場合に以下のように唱えます.
hage cloudwatch alarm list
以下のように出力されます. (以下のリストは検証用の CloudWatch Alarm 一覧です. YAMAP ではもっと多いです.)
アラームの一覧が長くなる可能性があったので, スニペットで出力するようにしました.
- AlarmName はアラーム名
- Status は現在のステータス
- ActionsEnabled は通知が有効 (
true
) か, 無効 (false
)
以下の通知の無効, 有効については, Action Enabled
パラメータの値を hubot を介して true
, false
を変更します.
CloudWatch Alarm の無効化
通知を一時的に無効にしたい場合に以下のように唱えます.
hage cloudwatch alarm disable Test Alarm
この例では Test Alarm
の通知を無効にします. 以下のように出力されます.
念の為, 一覧を確認してみます.
ちゃんと, ActionsEnabled が false
になっていることが確認できました.
CloudWatch Alarm の有効化
無効にしていた通知を有効にする場合場合に以下のように唱えます.
hage cloudwatch alarm enable Test Alarm
先程, 通知を無効にした Test Alarm
を有効にします. 以下のように出力されます.
一覧を確認してみます.
これを定期的に操作する
YAMAP では, 以前の記事にも書きましたが, https://github.com/ttskch/slack-cron/ (以後, cronbot) を利用しています.
この cronbot と組み合わせてスケジュールダウンタイム的なことをやっています.
0 1 * * * hage cloudwatch alarm disable Test Alarm 0 5 * * * hage cloudwatch alarm enable Test Alarm
上記の例だと, 深夜 1 時に Test Alarm
の通知を無効にして, 早朝 5 時に有効にする設定です. 一応, これでうまく動いています.
以上
まだまだ hubot には慣れません (JavaScript なのか CoffeeScript なのかの区別もまだはっきりしないです) が, こんな感じで出来るだけ手数を少なくインフラの運用をしていければなあと考えております. 引き続き, よろしくお願いいたします.
ちなみに, なんとなく JavaScript (CoffeeScript) を書いてしまっているので, ちゃんと勉強したいなと考えています.