🚨 OpenSearchでデータが見えない!ISMポリシー導入後 Discoverがエラーになる
OpenSearch Dashboards の Discover 画面を開くと、データが全く表示されず、エラーが発生。これは単なる設定ミスではなく、マッピングの競合、テンプレートの制約が原因で、解決策まだありません。
この複雑なトラブルシューティングの全過程を残します。
🔍 第1章:エラーの根本原因と初期の奮闘
1.1 初期診断:date型とlong型のマッピング不一致
エラー発生後、Dev Toolsで確認した結果、Discoverが時間範囲検索に利用するはずのタイムスタンプフィールド(serverTimestamp)が、意図せず long (数値) 型としてマッピングされていました。
-
Dashboardsの要件: 時間検索には
date型が必須。 -
現状のマッピング:
long型。 -
結果: 時間検索用のクエリが実行できず、
400 Bad Requestエラーが発生。
これは、ISMポリシーのローテーションで新しいインデックスが作成される際、正しいマッピングを強制する Index Template が存在しなかったため、OpenSearchがデータを見て動的マッピングで long 型と自動認識してしまったことが原因でした。
1.2 ISMテンプレートによるマッピング強制の失敗
Index Templateが管理メニューにない環境だったため、ISMポリシーの ism_template 内に date 型マッピングを記述して解決を試みました。
// 試みたが失敗したコードの一部
"ism_template": [
{
// ...
"mappings": {
/* ... (ここに date 型マッピングを記述) ... */
}
}
]
// 発生したエラー: [illegal_argument_exception] Invalid field: [mappings] found in ISMTemplate.
ISMポリシーのバージョン制約により、ism_template内に直接 mappings を記述することはできず、この方法も失敗しました。
【解決策の修正】
最終的に、マッピングは ISMポリシーとは別に Index Template API (PUT _index_template/...) を使用して作成し、ISMポリシーは ism_template でインデックスパターンに紐付ける形に修正しました。
💥 第2章:マッピング修正後に発生した二段構えのエラー
正しい date 型マッピングを持つインデックスが作成された後、データ投入を行ったところ、さらに困難なエラーに直面しました。
2.1 データ投入時のマッピング競合(Part 2)
-
エラー:
mapper [serverTimestamp] cannot be changed from type [date] to [long] -
状況: PythonコードでUNIXミリ秒の数値 (
1764640876889) をstr()で文字列に変換して投入していました。 -
OpenSearchの解釈: OpenSearchは、投入された
1764640876889がlongになり、date型としてパースしようと試みましたが、パースに失敗。結果、この値を曖昧なlong型として認識しようとしました。 -
競合: 既存の
dateマッピング vs. 投入データのlong解釈 → マッピング変更不可で拒否。
マッピングで "format" : "epoch_millis" が指定されていても、数値のみの文字列はOpenSearchにとって曖昧であり、date型として確実に認識させるには不十分でした。
これまだ解決できません。
Discussion