Serviceで使用できる異常検出機能をローカルでDockerを使って試してみました。Service#Docker#AWSうらわ2020.11.17112この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。CX事業本部のうらわです。Detection)の機能を使うことができるようになりました。Serviceを起動してデータを入れて検証...とやっているとドメイン構築やアクセスポリシーの設定等が必要で少し手間がかかるため、Dockerを使ってローカルマシンで検証してみました。Elasticsearchによって動作しています。Elasticsearchのイメージを利用します。以下の記事に解説がありますので本記事では割愛します。検証は以下の環境で進めます。40524192本記事で紹介しているコードは以下のGitHubリポジトリに格納してあります。Elasticsearch公式ドキュメントのdocker-compose.ymlのサンプルをそのまま使用すると簡単にできます。https://opendistro.github.io/for-elasticsearch-docs/docs/install/docker/#sample-docker-compose-fileただし、今回はより手軽に検証するため、デフォルトで有効になっているSSLやログイン等のセキュリティ系のプラグインを無効にします。この方法についても公式ドキュメントに手順が記載されています。https://opendistro.github.io/for-elasticsearch-docs/docs/security/configuration/disable/まずはセキュリティ系プラグインを削除したDockerイメージを作成します。この際、以下のkibana.ymlを使用します。/usr/share/kibana/config/ビルドしておきます。.イメージがビルドできたら、サンプルのdocker-compose.ymlを修正します。以下のハイライト箇所が公式ドキュメントからの変更点です。odfe-net:起動確認docker-composeでコンテナを起動します。-dElasticsearchが起動しているかどうかはAPIで確認することができます。Search"}Kibanaはブラウザでhttp://localhost:5601にアクセスして確認します。ちなみに、セキュリティ系のプラグインが有効のままの場合は最初にログイン画面が表示されます。今回はBulk用のファイルの生成とElasticsearchへのデータ投入用のスクリプトをTypeScriptで作成しました。データのフォーマットは以下のような適当な時系列データとします。valueは20〜30のランダム値(小数点第三位まで)です。この値の範囲から大きく外れた値が投入されたら異常とする、というのを期待します。"2020-11-17T03:18:32.159+09:00"}APIリファレンスのコードを参考にして5時間分(18000秒)のndjsonファイルを作成します。スクリプト実行時の5時間前からのデータを作成します。'\n');}作成したndjsonファイルをインプットとしてElasticsearchに一括インデックスします。console.log(result);};bulkIndex().catch(console.log);上記の二つのスクリプトを実行し、インデックスの状態を確認します。docs.countが18000になっていれば成功です。Detectorを選択し、新しいdetectorを作成します。1続いてmodelを作成します。下記画像のように設定しました。そのままdetectorをスタートさせます。detectorの初期化処理が始まります。異常値を投入してみる1秒ごとにElasticsearchにデータをインデックスするスクリプトを実行します。100回に1回、異常値としてvalueが100のデータを投入してみます。}};createDoc().catch(console.log);スクリプトを起動して放置します。create-doc.ts少し経つとdetectorの画面に異常検出の結果が表示されます。一応こちらの意図通りに動作しているように見えます。Elasticsearchの公式ドキュメントに記載があります。accuracy.まとめ設定値の違いなど細かい仕様まで理解しきれていませんが、ひとまずローカルで異常検出機能を試すことはできました。Detectorを使う前に、ローカルでDockerを使ってテストしてみるのは有効だと思います。今回は都合の良い自作の時系列データを使いましたが、次回は生データを使った際にどのように動作するのか試してみたいと思います。Elasticsearchの機能)ので、こちらも試してみたいと思います。APIを一通り叩いてみた。