祝 CloudWatch Anomaly Detection が GA になりました!

2019.10.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは 園部です。

オープンプレビュー となっていました CloudWatch Anomaly Detection が GA となりました!

今回、オープンプレビュー時との差異を中心に、やってみたいと思います!

オープンプレビュー時に関しては、弊社メンバーが記事にしてくれています。

CloudWatchにAnomaly detection(異常検出)が追加されました(Open preview)

最後に、 Anomaly Detection と Outlier Detection について、調べた内容を整理してみます。

CloudWatch Anomaly Detection

異常検出は、選択したメトリクスの履歴値を分析し、毎時、毎日、毎週繰り返される予測可能なパターンを探します。 次に、将来の予測を改善し、正常な動作と問題のある動作をより明確に区別するのに役立つ最適なモデルを作成します。 必要に応じてモデルを調整および微調整し、同じ CloudWatch メトリクスに対して複数のモデルを使用することもできます。

引用元: 新規 – Amazon CloudWatch anomaly detection – 異常検出

オープンプレビュー時と比べて、最後に記載されている 「 必要に応じてモデルを調整および微調整 」 が新しく加わっているようです。

やってみた

それでは、ドキュメントを参考にやってみます!

概要

今回、CloudWatch Anomaly Detection の機能を確認することを重視して、以下の順番でやっていきます。

  1. EC2 を 1台起動
  2. CPUUtilization をターゲットに Anomaly Detection を有効(モデルの作成)
  3. Anomaly Detection の結果・反映を確認
  4. CPU が急激に上昇するように、EC2 インスタンスへ負荷をかけます
  5. Anomaly Detection の結果・反映を確認
  6. モデルを調整
  7. Anomaly Detection を削除

1. EC2 を 1台起動

Amazon Linux2 のインスタンスを1台起動します。

2. CPUUtilization をターゲットに Anomaly Detection を有効(モデルの作成)

オープンプレビュー時は、アラーム作成時に Anomaly Detection を有効にしていましたが、グラフから有効にすることが可能となりました。

個人的には、最初からアラーム作成するよりもグラフで有効にした後に、様子を見た上でアラーム設定を行う方が自然ではあるかと思います。(アラーム作成するけど、アクションは設定しないというのも良いかもしれません)

インスタンスに変更は加えておらず、ログインもしていないため、CPU 使用率はほぼ 0 を推移しています。

グラフ化したメトリクス から アクション にある 左端のアイコンを選択します。

元々のメトリクスの下に、 Anomaly Detection が有効になった行が追加となります。

3. Anomaly Detection の結果・反映を確認

しばらくすると、線グラフにオーバレイする形で、Anomaly Detection band が表示されます。 グラフの時間範囲によっては Anomaly Detection の凡例に 「!」 が表示されることがあります。

記載されている時間帯に関しては、モデル( Anomaly Detection で作成したモデル)によって作成された近似値ですよと書かれています。

グラフ化したメトリクス に追加されたレコードを見ると 詳細 欄に Anomaly Detection を用いた数式が記されています。

m1 は、今回指定した メトリクス(CPUUtilization) を指しています。 次の 2 は Anomaly Detection で異常値とする幅を指定しています。(デフォルトで 2 が設定されます)ここは、アラームを作成する際に、表示される 異常検出のしきい値 と連動しています。

グラフ化したメトリクス に元となるメトリクスのレコードにある 鈴のマーク から通常通り、アラームを作成することが出来ます。(以前のように、アラームのメニューから作成することも可能です)

グラフ化したメトリクス に追加されたレコードを見ると モデルの編集 が表示されています。こちらが今回追加となった 「 必要に応じてモデルを調整および微調整 」 です。

一過性の事象で、トレーニングデータとして利用したくないメトリクス(時間帯で指定)をトレーニングデータから除外することでモデルを調整することが可能です。

4. CPU が急激に上昇するように、EC2 インスタンスへ負荷をかけます

一過性の事象として、1時間程度 CPU に 100% 近い負荷をかけます。

Anomaly Detection で作成されたモデルにはまだ反映されていないので、グラフはこの先も同様の幅が続きます。

5. Anomaly Detection の結果・反映を確認

しばらくすると、先ほどの一過性のスパイクが、モデルに反映されます。(値が大きく異なるので Y軸の目盛りを調整しているのでわかりづらいかもしれません...)

このままでは、本来の状態(モデル)と差異が出ているので、一過性のデータをモデルから除外します。

6. モデルを調整

グラフ化したメトリクス > モデルの編集 > トレーニングを除外するために別のトレーニングを追加する を選択します。

今回、 07:00 - 09:30 を トレーニングデータから除外します。

更新 を選択します。

しばらくすると、先ほどの一過性のスパイクがモデルから除外され、発生する前のようなグラフへ戻りました。(確実に、トレーニングデータから該当時間帯のデータを除外した結果と言い切れる確証はないのですが...変化は見られました)

7. モデルを削除

最後に、Anomaly Detection で作成されたモデルを削除します。

グラフ化したメトリクス > モデルの編集 を選択します。

モデルの削除 を選択します。

確認画面が表示されるので、 削除 を選択します。

まとめ

GA となった Anomaly Detection をやってみました。設定はとても簡単に行えます。オープンプレビュー時から追加となった 「 モデルの編集 」によって、ユーザー側でチューニング出来るようになったのは良いことです。ただし、意図したように調整するには経験と知識が必要そうです。また、今回は、単体の CPUUtilization に Anomaly Detection を有効化しましたが、Auto Scaling グループでのメトリクスやDBのレイテンシなど色々やってみたいなと思いました!

あとがき

今回、CloudWatch の新しい機能として Anomaly Detection が GA となりました。 Anomaly Detection(異常検出)については、監視 SaaS で耳にする機会が増えましたが、フワッとした理解(理解とは言えないレベル)だったので、今回思い切って調べた内容を書いてみたいと思います。素人の覚え書き同然の内容ですので有識者の方で、間違い等にお気づきになった方はご指摘ください。(できれば優しめに)

私が普段から見えている Datadog のブログやドキュメントをベースに調べていきました。Datadog ブログやドキュメントは、ナレッジが詰まっていて個人的にはとてもオススメです!

Anomaly Detection と Outlier Detection

異常値や外れ値は統計の分野で使われていますが、最近ではデータ分析に関わる方も増え馴染みのある(ある意味困った)存在かもしれません。この異常値や外れ値といった統計モデルと機械学習によるアルゴリズムを用いて、対象メトリクスのパターンを学習し、そこからサービスの変化をモニタリングします。

二つのイメージ

上段が Anomaly Detection(異常検出) 、下段が Outlier Detection(外れ値検出) となります。それぞれ右側のグラフが、検出されている状態です。

これで雰囲気はバッチリ掴めるかと思います!

Anomaly Detection(異常検出)とは

CloudWatch Anomaly Detection でも、過去からメトリクスからパターン(モデル)を作成しています。そのパターンと異なるメトリクスを異常値として検出します。 先ほどの Datadog の図でも、Band がオーバーレイされ、値が超えると異常を見なしています。いわゆる時系列データに対して機械学習を用います。そのため、ある程度のデータを蓄積する必要があります。

Outlier Detection(外れ値検出)とは

Anomaly Detection に対して、Outlier Detection は、過去データとの違いなどの根拠・パターンを必要としません。ある特定の時点を切り取って、同一とされている対象・グループから逸脱していることを外れ値として検出します。 先ほどの Datadog の図でも、同じような線グラフから一つだけ飛び出したグラフがあります。Web サーバなど同一の役割を持った対象において、Outlier Detection を用いることで、異なる点・予兆を検出することが出来ます。

参考文献

この辺りについては、もっと勉強が必要そうです...