Amazon Web Services ブログ

Amazon Elasticsearch Service でのアラート設定

顧客はログ分析に Amazon Elasticsearch Service をよく使用します。Amazon ES では、インフラストラクチャからログを収集し、各ログ行を JSON ドキュメントに変換して、ドキュメントを一括 API に送信することができます。

変換されたログ行には多数のフィールドがあり、それぞれにが含まれています。たとえば、Apache ウェブのログ行には、特に送信元 IP アドレスフィールド、リクエスト URL フィールド、およびステータスコードフィールドが含まれます。多くのユーザーは、Kibana を使用してダッシュボードを構築し、インフラストラクチャを視覚的にモニタリングします。それらのフィールドのデータから明らかであるように、アプリケーションの使用状況、バグ、またはセキュリティ問題に直面しています。たとえば、HTTP 5xx ステータスコードの数をグラフ化してから、変化を監視して対応できます。5xx コードが急増した場合は、おそらくサーバーに問題があります。しかし、このシステムでは Kibana を手動でモニタリングしなければなりません。

4 月 8 日、Amazon ES はイベントのモニタリングとアラートのサポートを開始しました。この機能を使用するには、設定した特定の条件であるトリガーを持つモニタ (スケジュールされたジョブ) を操作して、モニタにアラートを送信するタイミングを指示します。アラートは、トリガー条件が発生したことを通知します。トリガーを引き起こすと、モニタが動作を開始し、送信先にメッセージを送ります。

この記事では、シミュレートされた IoT Device Farm を使用してデータを生成し、Amazon ES に送信します。

シミュレーターの概要

このシミュレーションは、センサーとデバイスといういくつかの重要部分で構成されています。

センサー

シミュレーターのコアクラスはセンサーです。デバイスには、さまざまなパターンの浮動小数点値をシミュレートするセンサーがあります。呼び出したとき、各センサーのレポートメソッドはセンサーの値を更新して返します。センサーにはいくつかのサブクラスがあります。

  • SineSensor: 現在のタイムスタンプに基づいて正弦波を生成します。
  • ConstSensor: 定数値を生成します。このクラスには、特定の値を中心にして変動するランダムな「ファズ」係数が含まれています。
  • DriftingSensor: 開始値で連続的なランダムドリフトを可能にします。
  • MonotonicSensor: ランダムファズで、一定のデルタで値を増やします。

この記事では、MonotonicSensor を使用してその値を増やし続けて、設定したアラートを強制的に違反しました。

汎用一意識別子 (UUID) と追跡するメトリックのラベルからセンサーを識別できます。センサークラスのレポート機能は、タイムスタンプ、センサーの UUID、メトリックラベル、およびその瞬間のメトリック値を返します。

デバイス

デバイスはセンサーの集合です。この記事では、フィールド内の IoT デバイスをシミュレートし、温度と湿度を測定し、デバイスの CPU を送信する一連のデバイスを作成しました。各デバイスには、すべてのセンサーのレポートメソッドを再帰的に呼び出して、センサーレポートの集合を返すレポートメソッドがあります。GitHub の Open Distro for Elasticsearch サンプルコードリポジトリでコードを利用できるようにしました。

あるデバイスの CPU センサーを常に上にドリフトするように設定し、そのデバイスの問題をシミュレートします。次の折れ線グラフで意図した「不正な動作」を確認できます。

次のセクションでは、状況を把握して修正できるように、CPU 使用率が 90% のアラートを設定します。

前提条件

このソリューションを参照しながら実行するには、AWS アカウントが必要です。モニタとアラートの基盤を形成するために、独自の Amazon ES ドメインを設定します。

ステップ 1: 送信先を設定する

Amazon ES でアラートを作成するときは、1 つの送信先または複数の送信先を割り当てます。送信先は配信チャネルです。アラートが発生したときにドメインから通知が送信されます。送信先には Amazon SNS、Slack チャネル、または Amazon Chime を使用できます。または、メッセージを受信するためのカスタムウェブフック (URL) を設定することもできます。ヘッダーとメッセージ本文を設定すると、Amazon ES Alerts が送信先 URL にメッセージを投稿します。

この例では、SNS を使用して Amazon ES ドメインからアラートを受信していますが、Amazon ES にはトピックとサブスクリプションを設定するためのオプションがたくさんあります。通知を受け取り、E メール配信用のトピックをサブスクリプションするためのトピックを作成しました。SNS トピックには、HTTP/S エンドポイント、E メール、Amazon SQS、AWS Lambda、および SMS を介した配信をサポートする多数のサブスクリプションがあります。

送信先を設定するには、AWS マネジメントコンソールに移動します。サインインして SNS コンソールを開きます。

[トピック]、[トピックの作成] を選択します。

[トピックの作成] ページで、名前表示名の値を入力します。両方ともセンサーアラートを選択しました。[トピックの作成] を選択します。

トピックをサブスクリプションできるようになりました。トピックの作成が完了すると、コンソールから自動的に表示されるため、[トピック] ページからこれを実行できます。左側のナビゲーションペインにある [サブスクリプション] タブからサブスクリプションを始めることもできます。[トピック] ページから、[サブスクリプションの作成] を選択します。

[サブスクリプションの作成] ページの [プロトコル] で、[E メール] を選択します。[エンドポイント] ボックスに E メールアドレスを入力して、[サブスクリプションの作成] を選択します。後でもう一度参照するので、ここでトピック ARN をメモしてください。

最後に、SNS から送信された E メールの確認リンクをクリックして、サブスクリプションを確認します。

ステップ 2: ロールを設定する

Amazon ES でトピックへのアラート発行を許可するには、適切なアクセス許可を持つ IAM ロールを作成します。始める前に、ステップ 1 の [SNS トピック] ページからトピック ARN をコピーしてください。

お使いのロールには、信頼されたエンティティと、そのロールを引き受けるエンティティに対するアクセス許可の 2 つの要素があります。コンソールでは、信頼できるエンティティとして Amazon ES でのロール作成をサポートしていません。EC2 で信頼されたエンティティとしてロールを作成してから、エンティティを変更するために JSON 信頼ドキュメントを編集します。

AWS マネジメントコンソールで、IAM コンソールを開き、[ロール]、[ロールの作成] の順に選択します。

[ロールの作成] ページで、[AWS サービス] と [EC2] を選択します。[次へ: アクセス許可] を選択します。

[アクセス許可] ページで、[ポリシーの作成] を選択します。これにより、ポリシーを作成するための新しいウィンドウが開きます。後で戻ることになるので、元のタブを閉じないでください。

このステップで作成したポリシーでは、ロールを引き受けるエンティティに対するアクセス許可を定義します。さまざまなエンティティ (この場合は Amazon ES) を SNS トピックに公開できるようにするポリシードキュメントを追加します。

[ポリシーの作成] ページで、[JSON] タブを選択し、次のコードに対して JSON テキストを切り取りおよび貼り付けして置き換えます。コード内の sns-topic-arn を、前に作成したトピックの ARN に置き換えます。その後、[ポリシーのレビュー] を選択します。

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": "sns:Publish",
    "Resource": "sns-topic-arn"
  }]
}

[ポリシーのレビュー] ページで、ポリシーに名前を付けます。この例では SensorAlertingPolicy を選択しました。[ポリシーの作成] を選択します。

[ロールの作成] ウィンドウまたはタブに戻ります。更新ボタンを使用してポリシーを再ロードし、検索ボックスにポリシーの名前を入力します。ポリシーの横にあるチェックボックスをオンにします。[次へ: タグ] を選択してから、[次へ: レビュー] を選択します。ロールを検索しやすくするために、タグを追加することもできます。

[レビュー] ページで、ロールに名前を付けます。この例では SensorAlertingRole を使用しました。[ロールの作成] を選択します。

ロールの信頼できるエンティティを Amazon ES に変更するには、IAM コンソールで [ロール] を選択します。検索ボックスに SensorAlertingRole と入力し、ロールを表示するためのリンク (チェックボックスではない) を選択します。[信頼関係]、[信頼関係の編集] を選択します。

ポリシードキュメントコードを編集して、ec2.amazonaws.comes.amazonaws.com に置き換えます。完成したポリシードキュメントは、次のコード例のようになります。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "es.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

[信頼ポリシーの更新] を選択します。もう一度参照しながら、ロール ARN を作成します。

ステップ 3: Amazon ES アラートを設定する

Amazon ES ドメインで IoT センサーシミュレーターを指定しました。これにより、モニタとアラートの基盤となるデータを作成します。直接行う場合は、ブラウザで Kibana エンドポイントに移動して、左側のナビゲーションペインから [アラート] を選択します。ウィンドウ上部で [送信先]、[送信先の追加] の順に選択します。

[送信先の追加] ダイアログで、送信先に名前を付けます。[タイプ] で [SNS] を選択し、SNS トピックの ARN をステップ 1 で作成したトピックの ARN に設定します。IAM ロール ARN を、ステップ 2 で作成したロール ARN に設定します。[作成] を選択します。送信先は好きなだけ多く設定することができます。問題が発生した場合は、複数の人に対してアラートを発することを可能にします。

ステップ 4: モニタを設定する

Open Distro for Amazon ES のモニタでは、モニタリングする値を指定できます。グラフィカルに、または Amazon ES クエリを指定して、値を選択できます。最初にモニタを定義してから、モニタされた値のトリガーを定義します。

Kibana で、[モニタ]、[モニタの作成] の順に選択します。

モニタに名前を付けます。私はモニタをデバイス CPU と名付けました。頻度は、事前定義された間隔の 1 つから設定することも、cron 式を使用してより細かく制御することもできます。私は [1 分ごとに] を選びました。

このページの「モニタの定義」セクションにスクロールします。モニタリングする値を指定するには、この一連のコントロールを使用します。[インデックス] または [複数のインデックス] の値、時間フィールド、および目標値を入力できます。モニタをどのように定義しますか? リストから [ビジュアルグラフを使用して定義] を選択します。また、[抽出クエリを使用して定義] に情報を入力して、モニタリングする値を生成するクエリを提供することもできます。簡単なしきい値では、ビジュアルインターフェイスを迅速かつ簡単に利用できます。

リストからモニタリングするインデックス値を選択します。リストには個々のインデックスが含まれています。ワイルドカードを使用する際に、テキストボックスに入力することもできます。値を登録するには、インデックス名を入力した後に Enter キーを押す必要があります (“logs-*” <enter> など)。

リストから時間フィールドの値を選択します。これにより、グラフの上にいくつかのセレクターが表示されます。Count() を選択してメニューを開き、値を計算するための集計を表示します。max() を選択してから、[フィールドの選択] で [CPU] を選択します。最後に、過去 5 分に設定します。[作成] を選択します。

モニタを視覚的に作成するか、モニタする値を生成するためのクエリを提供できます。

logs-* インデックスを選択して CPU フィールドの最大値をモニタリングしましたが、まだトリガーを作成していません。[作成] を選択します。これで [トリガーの定義] ページが表示されます。

ステップ 5: トリガーを作成する

トリガーを作成するには、モニタリングしているフィールドのしきい値を指定します。フィールドの値がしきい値を超えると、モニタがアクティブ状態になります。しきい値が 90、重要度が 1 の CPU が高すぎるというトリガーを作成しました。

トリガー条件を設定するときに、Amazon ES が実行する操作を設定します。

操作を追加するには、ページをスクロールしてください。SNS トピックにメッセージを送信するためのアクションを 1 つ追加しました。モニタ名、トリガー、重要度、およびアラームがアクティブになっている期間などが含まれます。Moustache スクリプトを使用して、受信したメッセージのテンプレートを作成できます。

操作の追加が完了したら、ページの下部にある [作成] を選択します。

まとめ

[アラートダッシュボード] に戻ると、アラートが [完了] 状態で表示されます。アラートはさまざまな状態で存在します。完了は、モニタがターゲットにクエリされたこと、そしてトリガーが実行されていないことを示します。

アラートをアクティブ状態にするために、CPU が 50% から 100% に上昇した障害のあるデバイスとシミュレートされたセンサーデータを送信しました。90% ヒットすると、次の E メールが送信されます。

結論

この記事では、Amazon ES アラートでログファイル内の重要なデータをモニタリングし、問題が発生し始めたときに迅速に対応する方法について説明しました。KPI を特定し、しきい値を設定し、アラートをファーストレスポンダーに配信することで、重大な問題に対する応答時間を短縮できます。

ご質問やご意見がございましたら、下にコメントを残すか、Twitter でお問い合わせください。


著者について

Jon Handler (@_searchgeek) は、カリフォルニア州パロアルトに拠点を置くアマゾンウェブサービスのプリンシパルソリューションアーキテクトです。Jon は、CloudSearch および Elasticsearch のチームと緊密に連携し、AWS クラウドへの移行を希望する検索ワークロードを抱えている幅広い顧客を支援し、指導しています。AWS に入社する前、Jon はソフトウェア開発者として 4 年間、大規模な e コマース検索エンジンのコーディングに携わっていました。