Amazon Elasticsearch Service のスローログをトラブルシューティングするにはどうすればよいですか?

最終更新日: 2020 年 8 月 26 日

Amazon Elasticsearch Service (Amazon ES) ドメインに対して Elasticsearch Search のスローログを有効化したのですが、エラーが表示される、またはスローログが Amazon CloudWatch Logs グループに表示されません。この問題はどのように解決すればよいですか?

解決方法

スローログを設定しようとするとエラーが表示される

AWS アカウントにあるリージョン用のリソースポリシーが 10 個を超えると、Amazon CloudWatch Logs に次のエラーメッセージが表示されます。

"Unable to create the Resource Access Policy - You have reached the maximum limit for number of Resource Access Policies for CloudWatch Logs. Please select an existing policy and edit it or delete an older policy and try again."

このエラーメッセージを解決するには、次のような複数のロググループが含まれるリソースポリシーを作成します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
         "Effect": "Allow",
         "Principal": {
         "Service": "es.amazonaws.com"
        },
        "Action": [
         "logs:PutLogEvents",
         "logs:CreateLogStream"
        ],
        "Resource": [
         "ARN-Log-Group-1",
         "ARN-Log-Group-2",
         "ARN-Log-Group-3",
         "ARN-Log-Group-4"
        }
    ]
}

注意: AWS Identity and Access Management (IAM) ポリシーの上限を引き上げることはできません。

スローログが配信されない

スローログが CloudWatch に配信されない場合は、IAM policy または Amazon ES のしきい値を確認します。

Amazon ES が CloudWatch Logs に書き込みを行うにはアクセス許可が必要となるため、クエリをログするには適切な IAM ポリシーが必要です。IAM ポリシーを更新するには、検索スローログに移動し、[Select Setup] (セットアップ) を選択します。IAM ポリシーは以下の例のようになっている必要があります。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "es.amazonaws.com"
      },
      "Action": [
        "logs:PutLogEvents",
        "logs:CreateLogStream"
      ],
      "Resource": "arn:aws:logs:us-east-1:588671893395:log-group:/aws/aes/domains/myes/search-logs:*"
    }
  ]
}

また、Amazon ES ドメインに適切なタイミングしきい値を設定するようにしてください。例えば、設定されたしきい値よりも前にすべてのリクエストが完了した場合、ログはロググループに配信されません。

また、各デバッグレベル (TRACE、DEBUG、INFO、および WARN) に個別のインデックスレベルのしきい値を設定することも可能です。以下の例では、Kibana の YOURINDEXNAME インデックスに対して WARN デバッグレベルのしきい値が 10 秒に設定されています。

PUT /YOURINDEXNAME/_settings{"index.search.slowlog.threshold.query.warn": "10s"}

注意: TRACE を「0」ミリ秒に設定すると Amazon ES ドメインのすべてのクエリをログすることができますが、すべてのクエリをログすることはリソース集約型の操作であるため、Amazon ES ドメインのパフォーマンスに影響する場合があります。

次に、以下のコマンドを使用してしきい値を確認します。

GET/YOURINDEXNAME/_settings?pretty

Amazon ES が、定義されたしきい値を超えるクエリをログします。

ベストプラクティス

  • 複数の設定変更 (CloudWatch に発行されるログの有効化または無効化など) を同時に実行しないでください。一度に実行する設定変更が多すぎると、複数のブルー/グリーンデプロイメントがトリガーされます。複数のブルー/グリーンデプロイメントは、Amazon ES domain が処理中状態のまま停止する原因になる場合があります。ブルー/グリーンデプロイメントの詳細については、「設定変更」を参照してください。
  • 遅い検索クエリを特定するには、クエリフェーズとフェッチフェーズの両方にしきい値を設定します。
  • 低いしきい値でテストしてから、その値を徐々に増加させて、パフォーマンスに影響している、または最適化が必要なクエリのみをログするようにします。
  • クラスターパフォーマンスを最適化するため、Elastisearch クラスターには適切な数のシャードを選択してください。シャードメンテナンスの詳細については、「Amazon Elasticsearch Service のベストプラクティス」を参照してください。
  • スローログには、TRACE、DEBUG、INFO、および WARN のデバッグレベルでロギングを有効化します。デバッグレベルはそれぞれ異なるカテゴリの情報をログするため、ロギングはリクエストステータスに応じて有効化することがベストプラクティスです。