ようへいの日々精進XP

よかろうもん

最近ギョームでやったこと (4) 〜 CloudWatch Alarm を ChatOps で運用出来るようにしてみた 〜

tl;dr

引き続き, ギョームでやったことの振り返りです. (決して, こればっかりやっているわけではありませぬ)

YAMAP では, 各種システムの監視はメトリクスは CloudWatch で, 通知は CloudWatch Alarm を主に利用していますが, 最近, 定期的に発生する障害ではない CloudWatch Alarm の通知をなんとかしないと考えていました.

障害ではない CloudWatch Alarm とは, 例えば, 定期的なバッチ処理によって一時的にデータベースサーバーのレプリカラグやスケジュールされたメンテナンスによる一時的なサーバー停止等が挙げられます. このような場合, Datadog をはじめ類似の監視ツールでは, スケジュールを設定して一時的に通知や監視そのものを止める等の機能が備わっているという認識です. (スケジュールダウンタイムとか)

ところが, CloudWatch Alarm には残念ながらスケジュールダウンタイム的な機能を見つけることができなかったので, 社内で稼働している hubot (tengu) と cronbot を合わせてスケジュールダウンタイム的な機能を実装してみた振り返りとなります.

作った hubot script

github.com

このスクリプトを 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 ではもっと多いです.)

f:id:inokara:20190721212758p:plain

アラームの一覧が長くなる可能性があったので, スニペットで出力するようにしました.

  • AlarmName はアラーム名
  • Status は現在のステータス
  • ActionsEnabled は通知が有効 (true) か, 無効 (false)

以下の通知の無効, 有効については, Action Enabled パラメータの値を hubot を介して true, false を変更します.

docs.aws.amazon.com

CloudWatch Alarm の無効化

通知を一時的に無効にしたい場合に以下のように唱えます.

hage cloudwatch alarm disable Test Alarm

この例では Test Alarm の通知を無効にします. 以下のように出力されます.

f:id:inokara:20190721213407p:plain

念の為, 一覧を確認してみます.

f:id:inokara:20190721213706p:plain

ちゃんと, ActionsEnabled が false になっていることが確認できました.

CloudWatch Alarm の有効化

無効にしていた通知を有効にする場合場合に以下のように唱えます.

hage cloudwatch alarm enable Test Alarm

先程, 通知を無効にした Test Alarm を有効にします. 以下のように出力されます.

f:id:inokara:20190721213917p:plain

一覧を確認してみます.

f:id:inokara:20190721214008p:plain

これを定期的に操作する

YAMAP では, 以前の記事にも書きましたが, https://github.com/ttskch/slack-cron/ (以後, cronbot) を利用しています.

inokara.hateblo.jp

この 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) を書いてしまっているので, ちゃんと勉強したいなと考えています.