電気ひつじ牧場

技術メモと日常のあれこれ

【Elasticsearch】時間経過でインデックスを削除・設定変更

ログデータにはある種の鮮度のようなものがあります。一般的に1年前のログと2日前のログだと、おそらく後者の方が取り出される頻度も重要度も大きいため、より早く、確実に取得したいと考えるでしょう。

そのため、これらのデータを同様のストレージに同様の構成で格納しておくのはコスト面であまり良いとは言えません。1年前のログに対して3日前のログと同様の取得速度と信頼性を求めない場合、より安価なストレージに移動させる、あるいはレプリカ数を減らすなどといった変更を行うことで、インフラのコストを削減することが可能になります。

Elasticsearchにはこのように自動的にインデックスのライフサイクルを管理し、設定を変更する機能が備わっています。

本稿ではAWS Elasticsearch Service(AES)について述べます。AESで利用できるインデックスライフサイクル管理機能にはISMという名前がついています。

ISM

ISM(Index State Management)を利用することで、時間経過、インデックスのサイズ変化などのイベントをトリガーとしてインデックスの状態を変化させるアクションを実行することが可能です。アクションには、レプリカ数の変化、削除、Index Rollupの実行などを選択できます。

Index Rollupとは、インデックスのあるフィールドだけ抽出したり、より粗い粒度で集約をかけたりすることで、インデックスのサイズを削減する機能のことです。

設定

ISMはKibanaコンソールか、ISM APIにISMポリシーをPUTすることで作成します。ここではAPIを利用する方法について解説します。

次にism_sample.jsonを示します。このISMポリシーは7日後にレプリカ数を0に変更し、30日後にインデックスを削除するような処理を行います。

{
  "policy": {
    "description": "sample",
    "default_state": "current",
    "states": [
      {
        "name": "current",
        "actions": [],
        "transitions": [
          {
            "state_name": "old",
            "conditions": {
              "min_index_age": "7d"
            }
          }
        ]
      },
      {
        "name": "old",
        "actions": [
          {
            "replica_count": {
              "number_of_replicas": 0
            }
          }
        ],
        "transitions": [
          {
            "state_name": "delete",
            "conditions": {
              "min_index_age": "30d"
            }
          }
        ]
      },
      {
        "name": "delete",
        "actions": [
          {
            "delete": {}
          }
        ],
        "transitions": []
      }
    ]
  }
}

このJSONをPUTします。$ism_idは適当に設定しておきます。

$ curl -XPUT -H 'Content-Type: application/json' -H "kbn-xsrf: true" "$ES_URL/_opendistro/_ism/policies/$ism_id" -d @ism_sample.json

また、AWS ESではインデックスをUltraWarmというストレージへ移動させるようなアクション(warm_migration)を設定することができます。 Ultrawarmは大量のデータがある場合にはストレージにかかる費用を削減できるとありますが、数GiBくらいのデータの場合使うと逆に高くつくので注意が必要です。

{
    "name": "warm",
    "actions": [{
        "warm_migration": {}
    }],
    "transitions": []
}

インデックスへの適応

作成したポリシーはインデックスにアタッチすることで適応されますが、これにはインデックステンプレートを利用するのが便利です。

インデックステンプレートはインデックスのパターンと、それにマッチするインデックスに適応したい設定(マッピング定義、シャード数、ISM設定など)を記述することができます。

なお、これらの設定はインデックスが新たに作成されるタイミングで適応されるため、すでに作成されているインデックスに対しては適応されません。

次のようなtemplate.jsonで設定します。時系列データはインデックスに日付などの時間を含めるのがベストプラクティスとされていますが、それに従うと次のように未来に作成されるインデックスに対して設定の適応が可能になります。 (例えば、my_log_2021-03-31など)

{
  "index_patterns": [
    "my_log_*"
  ],
  "settings": {
    "opendistro.index_state_management.policy_id": "$ism_id"
  }
}
curl -XPUT -H 'Content-Type: application/json' -H "kbn-xsrf: true" "$ES_URI/_template/$template_id" -d @template.json