サイオステクノロジー((DXSL))のブログ - TECH PLAY

TECH PLAY

サイオステクノロジー((DXSL))

サイオステクノロジー((DXSL)) の技術ブログ

97

2026年10月1日、サイバー対処能力強化法(いわゆる能動的サイバー防御法)の主要部分が施行されます。 届出と報告の義務がかかるのは、国に指定された基幹インフラ事業者(2026年7月1日時点で15分野258者)のうち、一定の重要システムを使う事業者だけです。 ただ、この記事を読んでいただきたいのは、その事業者だけではありません。 たとえば、こういう立場の方です。 基幹インフラ事業者に、システムやサービスを納めている 自社は指定されていないが、同じ業種で、規模だけが基準に届いていない 今回は対象外だが、次の改正で対象になりそうだ(医療分野は、すでに追加が決まりました) グループ会社に、指定された事業者がある 少しでも心当たりがあれば、ここから先はぜひ「自社の課題」としてお読みください。届出や報告の義務は課されません。しかし、説明を求められる側にはなる可能性があります。 ここで扱うのは、難しい条文の解説ではありません。実務において最も重要となる一点に絞ってお伝えします。それは、「いざ報告を求められたときに、提出できるログが手元に残っているかどうか」ということです。 目次 10月1日に何が変わるのか 対象外の会社にも、話は届きます いま、日本で実際に起きていること なぜ、攻撃側だけが有利なのか 「見えていない」理由は、能力ではなく構造です では、どう変えられるか 1. コスト:「絞る」必要をなくす 2. 見えない範囲:「全部残して、全部検索する」 3. 速度:「アラート」ではなく「調査結果」を受け取る 日本では、ここが最初の条件になります 「Elasticって、本当にセキュリティの会社なの?」と疑問に思われる方へ RFI・RFPに書くべき5項目 いまお使いのSIEMを、止める必要はありません まとめ 出典 10月1日に何が変わるのか 変わるのは「守り方」ではなく「説明責任」です。対象事業者にかかる主な義務は2つ。重要な機器の届出と、サイバー攻撃を受けたときの報告です。 報告で注目したいのは、対象が被害発生時だけではないことです。その原因となり得る事象を知ったときも、報告の対象になります。異常な認証、見慣れない通信、消えたログ。気づける状態になっていなければ、報告のしようがありません。 そして報告では、「どのシステムが影響を受けたのか」「どんな攻撃だったのか」「業務にどう影響したのか」を説明します。 これを説明する土台が、ログです 。 侵入経路も、活動が始まった時期も、横移動の有無も、後から確かめるにはログが要ります。残っていなければ、「わかりません」と書くことになります。 対象外の会社にも、話は届きます これは推測ではありません。政府の基本方針にそう書かれています。 本法に基づく措置は、特別社会基盤事業者はもとより、電子計算機の使用者に対する周知など中小企業も含めて広く様々な事業者が対象となり得るため、必要な周知・広報を行う。 (内閣府「サイバー対処能力強化法に基づく基本方針の概要」令和7年12月) 届け方は、大きく2つです。 1. 供給する側は、すでに制度の中にいます サイバーセキュリティ基本法 第7条第2項は、情報システムの供給者に対して、利用者の安全性に配慮した設計・開発と、維持管理に必要な情報の継続的な提供を求めています(努力義務)。経済産業省と内閣官房国家サイバー統括室は2026年3月31日に、こうした事業者を「サイバーインフラ事業者」と位置づけたガイドラインも策定しました。 さらに、経済安全保障推進法の枠組みでは、基幹インフラ事業者が重要設備を導入・委託する際の「導入等計画書」に、供給者だけでなく委託の相手方や再委託の相手方についても同等の事項を記載します。会社名だけでなく、代表者や役員の情報まで含まれます。 二次請けで入っているだけでも、すでに書類の中にいる可能性があるということです。 2. 報告のとき、ログを聞かれます 侵入経路が自社の提供したシステムだった場合、そこで何が起きたかを確認できるのは、ベンダー側だけということがあります。 「この時間帯の認証ログを見せてください」「この通信は正常ですか」、そうした確認を求められる可能性があります。そのときログが残っていなければ、「わかりません」と答えることになります。 ※ 制度の細部(対象事業者の範囲、届出内容、期限など)は、内閣官房・NISCおよび内閣府の公表資料で最新の内容をご確認ください。 いま、日本で実際に起きていること 現場の数字を見ておきます。すべて警察庁「令和7年におけるサイバー空間をめぐる脅威の情勢等について」(令和8年3月公表)からの引用です。 ランサムウェア被害報告は226件。 高止まりが続いています。 被害企業の約6割は中小企業です。 「うちは狙われるほど大きくない」は成り立ちません。業種別では製造業が約4割。 感染経路について回答が得られた組織では、VPN機器からの侵入が6割を超えました。 メールの添付ファイルではありません。インターネットに露出した機器の未修正の脆弱性や、漏えいした認証情報から入られています。 復旧に総額1,000万円以上かかった組織が5割を超えています。 1か月未満で復旧できたのは5割強。約半数が1か月以上、影響を受け続けています。 なぜ、攻撃側だけが有利なのか 警察庁の報告書は、RaaS(Ransomware as a Service) を被害拡大の背景として明記しています。 RaaSは、一言でいうと**攻撃の「フランチャイズ」**です。開発・運営グループが実行役に道具一式を渡し、身代金の一部を受け取ります。 高度な技術的専門知識を有していない者であっても、ランサムウェア攻撃の実行が可能になるなど、攻撃者の裾野の広がりが見られている(警察庁) 狙っているのは、天才ハッカーとは限りません。道具を借りてきた加盟店かもしれない、ということです。 ここに非対称があります。攻撃側は道具代を一度払えば、何度でも試せます。一件成功すれば元が取れます。守る側は毎年払い続けても、「終わり」が来ません。 速度も違います。CrowdStrikeの2026年版Global Threat Reportによると、金銭目的の攻撃の平均ブレイクアウトタイムは29分(侵入から横移動を始めるまでの時間)。最短27秒という記録も報告されています。 侵入されてから隣のシステムへ移られるまで、30分ありません。この時計の差が、そのまま被害の大きさになります。 「見えていない」理由は、能力ではなく構造です ログが見えていないと聞くと、担当者のスキル不足を思い浮かべるかもしれません。でも実務では、原因はたいていそこではありません。 単年度予算がライセンス数を決める — 入れられなかった端末が、そのまま入口になる 取り込み量への課金 — 予算に収めるには、取り込むログを減らすしかない 保持期間が短い — ログが消えたあとに侵入が発覚すれば、見たい期間はもう手元にない 製品がつぎはぎ — 攻撃者は壁を破らず、製品と製品の 継ぎ目 を通る 「ログを取っていないのではありません。取れない値付けになっているだけです。」 取り込んでいないログは、検知もできないし、報告もできません。 では、どう変えられるか 1. コスト:「絞る」必要をなくす Elastic Cloud Hosted とセルフマネージドの構成では、使うリソース(ノードのメモリ量と稼働時間など)に対して課金されます。取り込んだデータ量そのものには課金されません。「取り込む量を増やすと、その分ライセンス費が上がる」という関係になりません。予算を理由にログソースを外す判断を、しにくくなります。 ※ Elastic Cloud Serverless の Security は取り込み量ベースの課金です(Essentials $0.09/GB〜、Complete $0.11/GB〜)。リソース課金なのは Hosted とセルフマネージドの構成です。 2. 見えない範囲:「全部残して、全部検索する」 Elasticの中核は検索エンジンです。古いデータを安いストレージ階層に置いたまま、復元作業なしでそのまま検索できます。「バックアップから戻すのに3日」がなくなります。 調査は必ず過去にさかのぼります。10月1日以降は、説明のためにもさかのぼります。 規模の目安として、米国カリフォルニア州雇用開発局(EDD)の事例があります。約14,000エンドポイント、月80,000件超のアラート、守っているレコードは 8,500億件 です。 3. 速度:「アラート」ではなく「調査結果」を受け取る Attack Discovery は、バラバラのアラートを1つの攻撃のストーリーにまとめる機能です。従来アナリストが手作業でつなげていた部分を、AIが先にやります。 「AIの判断を信じていいのか」という疑問は正しいです。Attack Discoveryでは、まとめの元になった関連アラートや元データをたどれます。アナリストが確認してから判断します。 大事なのは、AIが答えを出すことではありません。調査を始める場所を、早く見つけられることです。 日本では、ここが最初の条件になります 日本で必ず出る質問があります。「そのデータはどこに置かれますか」です。 Elasticは、クラウドだけでなく、セルフマネージドやオンプレミス、閉域環境でも動きます。AIの部分も選べます。Elastic Managed LLM のほか、 外部のLLMや、自社で管理するLLMを接続できます 。AIを使うために、必ずデータを外部のLLMサービスへ送らなければならない設計ではありません。 政府調達のISMAP、金融のFISC安全対策基準、医療の3省2ガイドライン。日本の要件はどれも「データの置き場所」と「説明できること」を問います。この2つは、機能の1つではなく 入口の条件 です。 ※ ISMAPへの登録有無は、ISMAPポータルの最新のクラウドサービスリストでご確認ください。ここでは要件の説明にとどめています。 「Elasticって、本当にセキュリティの会社なの?」と疑問に思われる方へ Elasticは検索エンジンの会社として知られています。この疑問は自然です。そこでElastic自身の主張ではなく、 第三者が公表した評価 を並べます。 評価レポート 公表 位置づけ Gartner® Magic Quadrant™ for SIEM 2025年10月 Visionary The Forrester Wave™: Security Analytics Platforms, Q2 2025 2025年6月 Leader (2回目)。14項目で最高点、Federated Searchでも最高スコア The Forrester Wave™: XDR Platforms, Q2 2026 2026年6月 Strong Performer IDC MarketScape: Worldwide SIEM 2026 (doc #US54126826) 2026年6月 Leader IDC MarketScape: Worldwide XDR Software 2025 (doc #US52997325) 2025年9月 Leader AV-Comparatives Business Security Test (2026年3〜6月期) 2026年7月 Malware Protection 100%(16製品中で唯一) 。Real-Worldも399/400(99.8%)で最高スコアに並ぶ 正確に書いておきたい点が2つあります。 Forrester XDRは Strong Performer です。 すべての評価で1位、ではありません。 AV-Comparativesの誤検知について。 一般的な業務ソフトを対象としたFalse Alarm Testは0件でしたが、Real-World Protection Testでは12件の誤検知が記録されています。「テスト全体で誤検知ゼロ」ではありません。 そしてもう1つ。 Elasticの検知ルールとエンドポイント保護は、GitHubで公開されています (elastic/detection-rules、elastic/protections-artifacts)。買う前に「どこまで検知できるのか」を自分の目で監査できます。閉じた製品では、これができません。 RFI・RFPに書くべき5項目 RFI(情報提供依頼書)とRFP(提案依頼書)は、製品を選ぶときにベンダーへ出す文書です。大事なのは、RFPに書いていない条件には、ベンダーは答えないということ。書けば全社が必ず答え、できる会社とできない会社がその場で分かれます。 以下は「Elasticの機能一覧」ではありません。どのベンダーを選ぶにしても、要件定義書に書いておくべき5項目です。 全量の取り込み — すべてのログソースを対象にできる。予算の都合で外す必要がない 全履歴の検索 — 数年分を1つのクエリで検索できる。復元作業を必要としない 開かれた文脈 — 他社製品のアラートやテレメトリーも含めてAIが推論できる 監査できるAI — 結論の元データをたどれる。アナリストにも監査部門にも説明できる 設置場所を選べる — クラウド、オンプレミス、閉域環境 第2項は、10月1日以降の説明責任に直結します。 第5項は、閉域要件があるだけで候補が数社に絞られます。 いまお使いのSIEMを、止める必要はありません 「既存のSIEMにすでに投資していて、簡単には変えられない」、ほとんどの組織で当てはまります。 EASE(Elastic AI SOC Engine) は、既存のSIEMやEDRの上で動くサーバーレスのパッケージです。撤去は不要で、既存環境からアラートを取り込み、Attack DiscoveryとAIアシスタントを使えます。大きな稟議を通す前に、自社のアラートで結果を確かめられます。 将来の移行には Automatic Migration があります。例えば、SplunkのSPLで書かれた検知ルールをES|QLに翻訳し、Elastic提供の1,300以上の検知ルールに対応付けます。ただし「部分的に翻訳」「翻訳できず」という状態もあり、手を入れてからでないと導入できないルールもあります。全部が自動で移るわけではありませんが、ゼロから書き直す手間はかなり減ります。 まとめ 1. 問われるのは、守れているかではなく、説明できるかです。 取り込んでいないログは、検知も説明もできません。 2. ログが見えていない理由は、能力ではなく構造です。 取り込み量への課金が、そのまま可視性の穴になっています。 3. 判断材料は、他社の事例より自社のアラートです。 既存のSIEMを止めずに検証できます。 10月1日、義務が始まるのは、ごく限られた事業者です。貴社ではないかもしれません。 ただ、その事業者が報告書を書くとき、材料を求められるのは外側の会社です。政府の基本方針も「広く様々な事業者が対象となり得る」と書いています。 義務がない側には、まだ準備する時間があります。 出典 統計・法制度 記載 出典 ランサムウェア226件、中小企業約6割、製造業約4割、VPN機器6割以上、復旧費1,000万円以上が5割超、1か月未満の復旧5割強、RaaS 警察庁「令和7年におけるサイバー空間をめぐる脅威の情勢等について」(令和8年3月) https://www.npa.go.jp/publications/statistics/cybersecurity/data/R7/R07_cyber_jousei.pdf ブレイクアウトタイム29分、最短27秒 CrowdStrike「2026 Global Threat Report」 https://www.crowdstrike.com/en-us/global-threat-report/ 届出・報告義務、「広く様々な事業者が対象となり得る」の引用 内閣府「サイバー対処能力強化法に基づく基本方針の概要」令和7年12月 https://www.cao.go.jp/cybersecurity/pdf/kihonhoushin_gaiyou.pdf 15分野258者(2026年7月1日時点)、導入等計画書に委託・再委託の相手方も記載 内閣府「経済安全保障推進法における特定社会基盤役務の安定的な提供の確保に関する制度(説明会資料)」2026年7月7日 https://www.cao.go.jp/keizai_anzen_hosho/suishinhou/infra/doc/infra_setsumeikai.pdf 医療分野の追加 厚生労働省「基幹インフラ制度への医療分野の追加について」 https://www.mhlw.go.jp/content/10808000/001703605.pdf 供給者の努力義務、「サイバーインフラ事業者」ガイドライン(2026年3月31日) 経済産業省・内閣官房国家サイバー統括室 https://www.meti.go.jp/press/2025/03/20260331001/20260331001.html Elasticの製品・事例 記載 出典 8,500億件、約14,000エンドポイント、月80,000件超のアラート EDD導入事例 Attack Discoveryの元データ確認とアナリストによる検証 Elastic Docs: Attack discovery 外部LLM・自己管理LLMの接続 Elastic Docs: LLM connectors 1,300以上の検知ルール、部分翻訳・未翻訳の状態 Automatic Migration / Elastic Docs EASEが既存SIEM/EDRの上で動く Elastic AI SOC Engine 発表 Serverlessの取り込み課金、Hostedのリソース課金 Serverless / Cloud Hosted The post 2026年10月1日、基幹インフラに攻撃の報告義務。ログを聞かれるのは誰か、そしてその準備 first appeared on Elastic Portal .
こんな場面に心当たりはないでしょうか。 ログの保存コストを下げたい。件数の多いパターンから削りたいが、障害時に必要なログかもしれず、削っていいのか判断できない 検知ルールごとのアラート件数を見て、常時鳴っているルールと今日だけ鳴ったルールを区別できない サービスごとのエラー率は正常に見えるのに、どこかのバージョンだけ静かに悪化している気がする いずれも、合計や平均では答えが出ません。必要なのは「時間とともにどう動いたか」です。しかし数十行の結果に対して、1 行ずつグラフを作って確かめるわけにもいきません。 Elasticsearch 9.5 でテクニカルプレビューとして追加された SPARKLINE は、この隙間を埋めます。STATS … BY の各行に、その行の推移をミニグラフとして 1 列足してくれます。別の可視化を作る必要はありません。 この記事では、Kibana のフライトサンプルデータを使って動きを確認します。あわせて、従来の書き方と比べて何が変わるのか、実務ではどこで効くのかを見ていきます。 目次 構文 例 1:航空会社ごとの遅延の推移 SPARKLINE がなかったら、どう書いていたか 例 2:到着国ごとの平均運賃の推移 使うときの注意点 どんなときに向いているか 本命はログパターン分析 まとめ 参考資料 構文 SPARKLINE(集計式, 日付フィールド, バケット数, 開始, 終了) 集計式:COUNT(*)、SUM(bytes)、AVG(latency) など、y 軸にしたい値 日付フィールド:時間軸に使う日付フィールド バケット数:分割数の目安 開始/終了:対象期間。Kibana では時間ピッカーと連動する ?_tstart と ?_tend を使えます STATS の集計関数のひとつなので、新しい構文を覚える必要はありません。空のバケットは 0 で埋まるため、どの行も同じ時間軸で並び、形をそのまま見比べられます。 例 1:航空会社ごとの遅延の推移 サンプルデータ「Sample flight data」(kibana_sample_data_flights)で試します。遅延した便を航空会社ごとに数え、あわせて推移を出します。時間範囲は直近 7 日間にしました。 FROM kibana_sample_data_flights | WHERE FlightDelay == true | STATS delays = COUNT(*),         trend = SPARKLINE(COUNT(*), timestamp, 24, ?_tstart, ?_tend)     BY Carrier | SORT delays DESC 図 1: 遅延件数は 4 社 結果を見てください。遅延件数は 154 件、146 件、145 件、126 件です。数字だけ見れば「4 社とも似たようなもの」で終わってしまいます。 ところが trend の形は違います。どの社も日ごとに波打っていますが、山が立つ日と山の高さは社ごとにばらばらです。合計が近くても、どの日にどの社が跳ねたのかは別の話です。この違いが、クエリ 1 本で並んで見えます。 trendの形の違いを同じデータセットで過去2日間でも載せます。 SPARKLINE がなかったら、どう書いていたか 同じ情報を従来の書き方で出してみます。時間を BUCKET でグループに加える方法です。 FROM kibana_sample_data_flights | WHERE FlightDelay == true | STATS delays = COUNT(*)     BY Carrier, bucket = BUCKET(timestamp, 24, ?_tstart, ?_tend) | SORT Carrier, bucket 図 2: 同じ情報が 60 行に分かれる 結果は 60 行になりました。4 社 × 15 バケットです。例 1 は 4 行でしたから、15 倍に増えています。しかも 1 社分で 15 行を使うため、ES-Air の次の航空会社を見るにはスクロールが必要です。航空会社ごとの傾向を読むには、この表を目で束ね直すことになります。 ここで数字を突き合わせてみます。ES-Air の 15 行の値を合計すると、例 1 の ES-Air の遅延件数になります。つまり、例 1 のスパークラインは、この 15 個の数字を 1 行に畳んだものです。特別な計算をしているわけではありません。見慣れた時間バケットごとの集計を、行ではなく配列として返しているだけです。 なお、Kibana が自動生成するグラフは、時間ごとの積み上げ棒になります。合計は分かりますが、形を比べる用途には向きません。並べて比べたいなら、やはり別途グラフを作ることになります。 例 2:到着国ごとの平均運賃の推移 COUNT 以外の集計も使えます。平均運賃の動きを到着国ごとに並べてみます。 FROM kibana_sample_data_flights | STATS avg_price = AVG(AvgTicketPrice),         trend = SPARKLINE(AVG(AvgTicketPrice), timestamp, 20, ?_tstart, ?_tend)     BY DestCountry | SORT avg_price DESC | LIMIT 10 図 3: 上位の国はバケットが埋まっておらず、母数が少ないと分かる (Discover) ここでは、スパークラインが順位そのものを疑わせてくれます。平均運賃の 1 位はデンマーク(DK)で 799.45 です。しかし trend を見ると、棒が立っている区間がわずかしかありません。つまり、直近 7 日間で該当便が数便しかなく、その少数の便が平均を決めています。2 位のフィンランド(FI)も同じ傾向です。 一方、順位が下がるにつれて区間が埋まっていき、オーストラリア(AU)やロシア(RU)、イギリス(GB)はほとんどの区間にデータがあります。母数が安定しており、平均値も信頼できます。 「上位が本当に高いのか、それとも母数が少ないだけか」を、テーブルの中で判断できます。これは合計値や平均値の列だけでは分かりません。 使うときの注意点 実際に動かして分かった点も含めて、4 つ挙げます。 バケット数は目安です。 例 1 では 24 を指定しましたが、返ってきたのは 15 本でした。直近 7 日間という範囲に対して、12 時間刻みという切りのよい間隔が選ばれています。手元で試した限り、BUCKET 関数と同じ丸め方でした。正確な本数と値は、棒にカーソルを当てると確認できます。 空のバケットは 0 になります。 COUNT なら「その時間帯は 0 件」と読めるので自然です。しかし AVG では「データがなかった」と「平均が 0 だった」を区別できません。例 2 の DK のように棒が抜けている場合は、値が 0 なのではなく母数がないと読んでください。 ミニグラフになる条件があります。 返り値は数値の配列ですが、Kibana の ES|QL エディタで実行すると棒グラフとして描画されます。ただし、これはグループ表示のときだけです。グループ表示に切り替わるのは、BY に単一のフィールドか単一の CATEGORIZE を指定した場合です。BUCKET を併用したり、複数のフィールドでグループ化すると、通常のフラットな表に戻ります。前節の比較で表示が変わったのは、この仕様のためです。 テクニカルプレビューです。 Elasticsearch 9.5 で提供されています。仕様が変わる可能性があるため、本番のダッシュボードに組み込む前にバージョンを確認してください。 どんなときに向いているか 冒頭に挙げた場面に戻ります。共通しているのは次の 2 点です。 グループの数が多い(十数件から数百件) 合計や平均では判断が決まらず、時間ごとの形で判断が変わる 逆に、グループが数件なら素直に可視化を作れば済みます。ここまで見てきたフライトデータの例も 4 行なので、正直なところ SPARKLINE がなくてもさほど困りません。無理に使う理由はありません。 本命はログパターン分析 ここからは、実務でいちばん効く使い方です。順番に説明します。 ログは「同じ形の繰り返し」でできている アプリケーションのログを開くと、こんな行が延々と続いています。 Connected to backend 10.1.0.4 in 32ms Connected to backend 10.1.0.7 in 28ms Connected to backend 10.1.0.2 in 41ms 人間が見れば「同じ種類のログが 3 件」です。しかし IP アドレスと数値が違うため、文字列としては 3 つとも別物です。BY message でグループ化しても 3 行に分かれてしまい、集計になりません。 CATEGORIZE が「形」ごとにまとめる CATEGORIZE は、似た形式のメッセージを自動でひとつのカテゴリにまとめる関数です。イメージとしては、上の 3 件が「Connected to backend * in *ms」という 1 つのパターンになります。ここまでの例では BY Carrier のようにグループの軸を自分で決めていました。CATEGORIZE を使うと、軸を事前に決める必要がありません。「このインデックスには何種類のログが、それぞれ何件あるのか」を機械に数えさせることができます。 SPARKLINE を足すと、パターンごとの推移が並ぶ この 2 つを組み合わせたのが次のクエリです。ここだけデータを替えて、サンプルデータの Web ログ(kibana_sample_data_logs)を使います。フライトデータと同じ「Add sample data」画面からインストールできて、そのまま試せます。 FROM kibana_sample_data_logs | WHERE @timestamp >= ?_tstart AND @timestamp < ?_tend | STATS count = COUNT(*),         trend = SPARKLINE(COUNT(*), @timestamp, 40, ?_tstart, ?_tend)     BY pattern = CATEGORIZE(message) | SORT count DESC 結果はパターンごとに 1 行です。画面の仕組みはフライトの例とまったく同じで、違いはグループの軸を CATEGORIZE が自動で作っている点だけです。 図 4: 約 1,600 件のログが 7 つのパターンにまとまり、それぞれに推移が付く 実行すると、直近 7 日間の約 1,600 件のログが 7 つのパターンにまとまりました。行のタイトルには、検出されたパターンがトークン単位で強調表示されます。このデータでは、リクエストの共通部分に加えて、ブラウザーの種類(Firefox、MSIE、Chrome)ごとにパターンが分かれました。 ミニグラフを読んでみます。上位 3 パターン(616 件、464 件、429 件)は、どれも毎日同じリズムで波打つ形です。定常的なトラフィックだと分かります。4 番目の 104 件のパターンは棒がまばらで、断続的にしか現れません。残りの 3 行は 1 件だけの単発です。件数の列だけでは「多い順」しか分かりませんが、形が付くと「定常」「断続」「単発」の区別が一目で付きます。実際のアプリケーションログなら、この「定常」の中からコスト削減の候補を探し、「断続」や「単発」は中身を確かめる、という進め方になります。 なお、クエリを書かずにパターン分析を試す入り口もあります。Discover のクラシックモードで、結果テーブル上部の「View as」メニューを「Patterns」に切り替えると、テキストフィールドのパターン分析を画面操作だけで実行できます。ただし、これは CATEGORIZE とは別の実装です。同じデータで試したところ、Patterns 表示は 3 パターン、CATEGORIZE は 7 グループと、まとまり方が異なりました。まず雰囲気をつかむならこちら、集計やバケット数を自分で決めたくなったら ES|QL で、という使い分けです。 図 5: パターン分析オプション 何がうれしいのか 典型的な場面はログのコスト削減です。ログは取り込み量と保存量に応じて費用がかかるため、件数の多いパターンから削りたくなります。しかし、件数の多いパターンをどう扱うかは件数では決まりません。一日中平坦に流れているパターンは、ただのノイズです。ログレベルを落とすか、取り込み時に捨てるか、安価な保存階層に回せます。一方、障害時だけ跳ねるパターンは、件数が多くても消してはいけない情報です。この 2 つを分けられるのは形だけです。 削るための対処法そのものは単純です。難しいのは、対象を見つけることでした。SPARKLINE は、その発見にかかる時間を縮めます。 冒頭に挙げた残りの 2 つ、検知ルールごとのアラートや、バージョンごとのエラー率も、書き方は同じです。BY の対象をルール名やバージョンに変えるだけで応用できます。 なお CATEGORIZE は Platinum ライセンスが必要です。また、他の式の中では使えず、グループ化の最初に置く必要があります。データが大きい場合は、STATS の前に SAMPLE コマンドを置いて母数を間引くと速くなります。 まとめ クエリは 1 本、傾向は行数ぶん。SPARKLINE の価値は、行が多いときにいちばん出ます。今回は 4 社で 60 行が 4 行になりました。これが数十件のパターンやサービスであれば、差はさらに開きます。上から眺めて、「いま跳ねているのはどれか」「順位の上位は信用できるか」を数秒で絞り込めます。サンプルデータを入れたクラスターがあれば、上のクエリをそのまま貼って確認できます。 参考資料 Introducing SPARKLINE in ES|QL: Spot trends at a glance https://www.elastic.co/search-labs/blog/esql-sparkline-function ES|QL SPARKLINE function(公式リファレンス) https://www.elastic.co/docs/reference/query-languages/esql/functions-operators/aggregation-functions/sparkline Using ES|QL in Discover(グループ表示とパターンのスパークライン) https://www.elastic.co/docs/explore-analyze/discover/try-esql The post ES|QL の SPARKLINE で「ログやエラーの傾向」をひと目でつかむ first appeared on Elastic Portal .
ファイルサーバー等の検索システム構築において、事前に必要なストレージ容量を試算する際の手順を解説します。 今回は、FSCrawler (*1) を使って検索用ストレージサイズの概算見積りを行ってみたいと思います。 (*1) Elastic の正式な製品ではありませんが、ファイルを検索できるよう Elasticsearch に登録してくれるオープンソースです。 目次 1. 検証の概要 2. 環境 3. FSCrawler の初期化と設定 4. 検索用ファイルの配置 5. FSCrawlerの実行 6. 登録確認 7. インデックスサイズの確認 8. セマンティック検索:なしで再計測 9. セマンティック検索:「あり」と「なし」のストレージサイズの比較 10. 概算見積りの計算ポイントと影響要因 11. まとめ 12. 参考URL 1. 検証の概要 本記事では、サンプルファイルを FSCrawler で Elasticsearch に取り込み、作成されたインデックスの物理ストレージサイズを取得することで、 ストレージ容量の見積り倍率(元のファイルサイズに対するインデックスサイズの割合)を算出する手順を解説します。 2. 環境 Windows 11 Elasticsearch 9.5.2 (Self-Managed, Trial License) Elastic Cloud (セマンティック検索用) FSCrawler 3.0 Java 25.0.4.1 3. FSCrawler の初期化と設定 下記を参考にして FSCrawler をインストールします。 https://fscrawler.readthedocs.io/en/fscrawler-3.0/installation.html FSCrawler の初期設定を行います。 参考URL:  https://fscrawler.readthedocs.io/en/fscrawler-3.0/user/getting_started.html set JAVA_HOME=jdk-25.0.4.1のインストールフォルダ set FS_JAVA_OPTS=-Xmx2g -Xms2g bin\fscrawler.bat --setup C:\Users\username\.fscrawler\fscrawler\_settings.yaml ファイルが生成されるので、これを編集します。 (下記はあくまでもサンプルです。適宜修正してください。) name: "test" fs: url: "C:/tmp/es" update_rate: "15m" includes: - "**/*.pdf" - "**/*.docx" - "**/*.xlsx" - "**/*.pptx" excludes: - "**/*.bak" hash_algorithm: "SHA-256" raw_metadata: true ocr: enabled: false elasticsearch: urls: - "https://127.0.0.1:9200" index: "test_docs" index_folder: "test_folder" api_key: "YOUR_API_KEY" ca_certificate: "ca.crtファイルのパス" #pipeline: "my_pipeline" semantic_search: "true" 検索対象のフォルダを C:\tmp\es としておきます。 今回は、*.pdf, *.docx, *.xlsx, *.pptx ファイルを検索対象とします。 セマンティック検索:あり としておきます。 API_KEYは、Kibana 上で発行しておきます。 ※セマンティック検索を行う場合、EIS の設定を行っておくなど、Elasticsearch 側での事前準備が必要です。 4. 検索用ファイルの配置 C:\tmp\es フォルダ配下に検索対象となるテスト用ファイル(例: 合計 1 GB の PDF や Office 文書)を配置します。 ここでは、 東京都防災ホームページ  からダウンロードした 「東京都くらし防災」(全ページ) (13.5MBのpdf) を C:\tmp\es\pdf\kb2023-tokyo-all.pdf として配置します。 5. FSCrawlerの実行 FSCrawlerを実行してインデックス化を行います。 set JAVA_HOME=jdk-25.0.4.1のインストールフォルダ set FS_JAVA_OPTS=-Xmx2g -Xms2g bin\fscrawler.bat FSCrawlerの実行に成功すると、C:\Users\username\.fscrawler\test\_checkpoint.json ファイルが作成されます。 また、Elasticsearch の test_docs インデックスにドキュメントが登録されます。 6. 登録確認 Kibana の DevTool から下記のクエリを実行してみます(キーワード検索)。 GET /test_docs/_search { "query": { "match": { "content": "寝室での注意事項" } } } ドキュメントが返却されます。 続いて、下記のリクエストも実行してみます(セマンティック検索)。 GET /test_docs/_search { "query": { "match": { "content_semantic": "寝室での注意事項" } }, "highlight": { "fields": { "content_semantic": { "number_of_fragments": 2, "order": "score" } } } } こちらもドキュメントが返却されます。 7. インデックスサイズの確認 Kibana の Stack Management / Index Management の画面から test_docs インデックスのページを表示します。 プライマリインデックスのサイズが 568.65 KB, レプリカと合わせると 1.11 MB であることがわかります。 8. セマンティック検索:なしで再計測 content フィールドに対するセマンティック検索用データ(ベクトルデータ)を生成しないようにして再計測してみます。 また、content フィールドの analyzer をデフォルトの standard ではなく、日本語用の analyzer を使うよう設定しておきます。 ※ Elasticsearchに事前に analysis-icu, analysis-kuromoji のインストールが必要です。 登録先のインデックスを test2_docs とします。 下記のリクエストを Dev Tool から発行して test2_doc インデックスを作成しておきます。 PUT /test2_docs/ { "settings": { "index": { "number_of_replicas": 1 }, "analysis": { "char_filter": { "windows_separator": { "type": "mapping", "mappings": [ """\\ => /""" ] }, "ja_normalizer": { "type": "icu_normalizer", "name": "nfkc_cf", "mode": "compose" } }, "tokenizer": { "fscrawler_path": { "type": "path_hierarchy" }, "ja_kuromoji_tokenizer": { "mode": "search", "type": "kuromoji_tokenizer", "discard_compound_token": true, "user_dictionary_rules": [ ] } }, "filter": { "ja_search_synonym": { "type": "synonym_graph", "lenient": false, "updateable": false, "expand": true, "synonyms": [ ] } }, "analyzer": { "fscrawler_path": { "char_filter": [ "windows_separator" ], "tokenizer": "fscrawler_path" }, "ja_kuromoji_index_analyzer": { "type": "custom", "char_filter": [ "ja_normalizer", "kuromoji_iteration_mark" ], "tokenizer": "ja_kuromoji_tokenizer", "filter": [ "kuromoji_baseform", "kuromoji_part_of_speech", "cjk_width", "ja_stop", "kuromoji_number", "kuromoji_stemmer" ] }, "ja_kuromoji_search_analyzer": { "type": "custom", "char_filter": [ "ja_normalizer", "kuromoji_iteration_mark" ], "tokenizer": "ja_kuromoji_tokenizer", "filter": [ "kuromoji_baseform", "kuromoji_part_of_speech", "cjk_width", "ja_stop", "kuromoji_number", "kuromoji_stemmer", "ja_search_synonym" ] } } } }, "mappings": { "dynamic_templates": [ { "raw_as_text": { "path_match": "meta.raw.*", "mapping": { "fields": { "keyword": { "ignore_above": 256, "type": "keyword" } }, "type": "text" } } } ], "properties": { "attachment": { "type": "binary" }, "attributes": { "properties": { "acl": { "properties": { "flags": { "type": "keyword" }, "permissions": { "type": "keyword" }, "principal": { "type": "keyword" }, "type": { "type": "keyword" } } }, "group": { "type": "keyword" }, "owner": { "type": "keyword" } } }, "content": { "type": "text", "analyzer": "ja_kuromoji_index_analyzer", "search_analyzer": "ja_kuromoji_search_analyzer" }, "file": { "properties": { "checksum": { "type": "keyword" }, "content_type": { "type": "keyword" }, "created": { "type": "date", "format": "date_optional_time" }, "extension": { "type": "keyword" }, "filename": { "type": "keyword", "store": true }, "filesize": { "type": "long" }, "indexed_chars": { "type": "long" }, "indexing_date": { "type": "date", "format": "date_optional_time" }, "last_accessed": { "type": "date", "format": "date_optional_time" }, "last_modified": { "type": "date", "format": "date_optional_time" }, "url": { "type": "keyword", "index": false } } }, "meta": { "properties": { "altitude": { "type": "text" }, "author": { "type": "text" }, "comments": { "type": "text" }, "contributor": { "type": "text" }, "coverage": { "type": "text" }, "created": { "type": "date", "format": "date_optional_time" }, "creator_tool": { "type": "keyword" }, "date": { "type": "date", "format": "date_optional_time" }, "description": { "type": "text" }, "format": { "type": "text" }, "identifier": { "type": "text" }, "keywords": { "type": "text" }, "language": { "type": "keyword" }, "latitude": { "type": "text" }, "longitude": { "type": "text" }, "metadata_date": { "type": "date", "format": "date_optional_time" }, "modifier": { "type": "text" }, "print_date": { "type": "date", "format": "date_optional_time" }, "publisher": { "type": "text" }, "rating": { "type": "byte" }, "relation": { "type": "text" }, "rights": { "type": "text" }, "source": { "type": "text" }, "title": { "type": "text" }, "type": { "type": "text" } } }, "path": { "properties": { "real": { "type": "keyword", "fields": { "fulltext": { "type": "text" }, "tree": { "type": "text", "analyzer": "fscrawler_path", "fielddata": true } } }, "root": { "type": "keyword" }, "virtual": { "type": "keyword", "fields": { "fulltext": { "type": "text" }, "tree": { "type": "text", "analyzer": "fscrawler_path", "fielddata": true } } } } } } } } 先ほど実行していた fscrawler.bat を Ctrl+C で停止させます。 C:\Users\username\.fscrawler\fscrawler\_settings.yaml ファイルを修正します。 name : test -> test2 index : test_docs -> test2_docs index_folder : test_folder -> test2_folder semantic_search : true -> false name: "test2" fs: url: "C:/tmp/es" update_rate: "15m" includes: - "**/*.pdf" - "**/*.docx" - "**/*.xlsx" - "**/*.pptx" excludes: - "**/*.bak" hash_algorithm: "SHA-256" raw_metadata: true ocr: enabled: false elasticsearch: urls: - "https://127.0.0.1:9200" index: "test2_docs" index_folder: "test2_folder" api_key: "YOUR_API_KEY" ca_certificate: "ca.crtファイルのパス" #pipeline: "my_pipeline" semantic_search: "false" fscrawler.bat を再実行します。 set JAVA_HOME=jdk-25.0.4.1のインストールフォルダ set FS_JAVA_OPTS=-Xmx2g -Xms2g bin\fscrawler.bat test2_docs インデックスへドキュメントが登録されます。 Kibana の Stack Management / Index Management の画面から test2_docs インデックスのページを表示します。 プライマリインデックスのサイズが 223.02 KB, レプリカと合わせると 446.04 KB となっています。 9. セマンティック検索:「あり」と「なし」のストレージサイズの比較 条件 元ファイルのサイズ プライマリインデックスのサイズ インデックスサイズ/元ファイルサイズの比率 セマンティック検索あり 13870.63 KB 568.65 KB 4.1% セマンティック検索なし 13870.63 KB 223.02 KB 1.6% セマンティック検索用のベクトルデータを生成しない分、ストレージサイズが減少したことがわかります。 ※この結果は、入力ファイルにより変動するので、実際に使用するファイルで試すことをお勧めします。 10. 概算見積りの計算ポイントと影響要因 実際の容量見積もりを行う際は、以下の要素を考慮して計算式を組み立てます。 テキスト抽出比率 : PDF や Office ファイル内のテキストデータ割合に依存します。スキャン画像主体の PDF ではインデックスサイズが小さくなり、テキスト主体の文書では大きくなります。 レプリカ数の乗算 : 本番環境で冗長化のためにレプリカ数を  1  に設定する場合、ストレージ要件は  プライマリサイズ × 2  になります。 要件に近い形でサンプルデータのインデックス登録を行い、ストレージサイズを取得します。 サンプルデータで算出した倍率を全体のファイルサーバー容量に掛け合わせることで、Elasticsearch 用ストレージの概算見積もりが可能となります。 想定ストレージサイズ = 対象ファイルの総容量 x 検証で得られたインデックス比率 x (1 + レプリカ数) ※注意 FSCrawler は、基本的に 1 ファイル = 1 ドキュメントとしてインデックスに登録します。 11. まとめ 今回は FSCrawler を活用し、サンプルファイルを用いて Elasticsearch の検索用ストレージサイズを概算見積もりする手順をご紹介しました。 今回の検証における主なポイントは以下の通りです。 セマンティック検索(ベクトルデータ)の影響 : セマンティック検索を有効にすると、テキストデータに加えてベクトルデータが保持されるため、ストレージサイズが大きくなります(今回の検証では元ファイル比で 1.6% から 4.1% に増加)。 実ファイルを用いた事前検証の重要性 : PDF や Office 文書内のテキスト抽出比率によってサイズが変動するため、本番環境に近いサンプルファイルで試算することが精度向上の鍵となります。 冗長化構成(レプリカ数)の考慮 : プライマリサイズだけでなく、本番環境のレプリカ設定(例: レプリカ 1 の場合はプライマリ × 2)を忘れずに計算式へ組み込む必要があります。 検索システムの新規構築や移行におけるクラスタ設計・キャパシティプランニングの際、ぜひ本記事の手順を参考に試算してみてください。 12. 参考URL https://qiita.com/daixque/items/83a04da18c51ba29324e https://fscrawler.readthedocs.io/en/fscrawler-3.0/ The post FSCrawler を使って検索用ストレージサイズの概算見積りを行う first appeared on Elastic Portal .
Logstash の転送先や Python 等のアプリケーションから指定する Elasticsearch の接続先 URL(endpoint URL)は、運用形態(Self-Managed、Elastic Cloud Hosted、Elastic Cloud Serverless)ごとに取得方法や基本形式が異なります。 この記事では、それぞれの運用形態における接続先 URL の取得・確認手順をまとめて解説します。 目次 Self-Managed の場合 URLの基本形式 取得・確認手順 Elastic Cloud Hosted の場合 URLの基本形式 取得手順 Elastic Cloud Serverless の場合 URLの基本形式 取得手順 Self-Managed の場合 オンプレミスや VM(AWS EC2 など)、Docker 等の独自環境で構築した Elasticsearch へ接続する場合は、サーバーの IP アドレス(またはホスト名)とポート番号を組み合わせて接続先を指定します。 URLの基本形式 https://<ホスト名またはIPアドレス>:9200 (※ Elasticsearch 8.0 以降はデフォルトで TLS/HTTPS が有効です。セキュリティの観点から HTTP 接続は推奨されません。) 取得・確認手順 Elasticsearch が稼働しているサーバーの IP アドレスまたは FQDN(ドメイン名)を確認します(ローカル開発環境の場合は  localhost  や  127.0.0.1 )。 設定ファイル( elasticsearch.yml )内の  network.host  および  http.port (標準は  9200 )を確認し、接続可能ポートとして開放されているか確認します。 Elastic Cloud Hosted の場合 Elastic Cloud Hosted の場合は、管理コンソール画面からエンドポイント URL を直接取得できます。 URLの基本形式 https://**.<region>.<cloud-provider>.**.io:443 ( ※ ポート番号は構成により、443や  9243  などが利用されます。) 取得手順 Elastic Cloud コンソール  にログインします。 接続したい  Deployment(デプロイメント)  を選択します。 左のメニューの  Getting started  アイコンをクリックします。 Get started with Elasticsearch. 画面の Elasticsearch endpoint: の右下にあるコピーアイコンをクリックします。 ※別ルートとして、Kibana 画面右上のヘルプアイコン( ? )>  Connection details  からコピーすることも可能です。 Elastic Cloud Serverless の場合 Elastic Cloud Serverless を使用している場合も、プロジェクトごとに固有のエンドポイントが割り当てられます。 URLの基本形式 https://<project-id>.es.<region>.<cloud-provider>.elastic.cloud:443 (※標準ポート:443) 取得手順 Elastic Cloud コンソールから対象の  Serverless Project  にアクセスします。 Home 画面が表示されていることを確認します(表示されていない場合、左メニューの Home アイコンをクリックします)。 3. Home 画面の右上の Elasticsearch: の接続先URL の横にあるコピーアイコンをクリックします。 ※別ルートとして、Kibana 画面右上のヘルプアイコン( ? )>  Connection details  からコピーすることも可能です。 運用形態によってポート番号( 9200 ,  9243 ,  443 )やプロトコル(HTTP / HTTPS)の設定ルールが微妙に異なるため、Logstash やアプリケーションのクライアント設定( hosts  プロパティなど)に記述する際は指定する形式に注意してください。 The post Elasticsearch の 3形態ごとの接続先URLの取得方法をまとめてみた。 first appeared on Elastic Portal .
Kibanaの表示言語はこれまでサーバー単位の設定( kibana.yml )によって一括で決定されていましたが、 Kibana 9.5 からは  ユーザーごとに個別の表示言語を設定できる機能  がベータ版(Beta)として導入されました。 これにより、グローバルなチームや多言語環境でKibanaを運用している場合でも、各ユーザーが好みの言語でダッシュボードやUIを閲覧できるようになります。 本記事では、この表示言語の切り替え機能の概要と具体的な設定手順を解説します。 目次 検証環境 画面上での言語切り替え手順 1. User メニューの表示 2. User settings 画面への遷移 3. 表示言語の変更と保存 4. Reload page 画面表示の変化 切り替え前の Home 画面(英語表示) 切り替え後の Home 画面(日本語表示) 技術的な注意点・補足 対象範囲 機能ステータス おわりに 参考URL 検証環境 本記事の内容は以下の環境で確認しています。 Elasticsearch 9.5.0 (Self-Managed) Kibana 9.5.0 (Self-Managed) 画面上での言語切り替え手順 デフォルト(英語表示)の状態から日本語へ切り替える手順は以下の通りです。 1. User メニューの表示 画面右上のユーザーごとのアイコン(この例では (E) アイコン)をクリックします。 2. User settings 画面への遷移 展開されたメニューから Edit profile をクリックすると、User settings 画面に遷移します。 3. 表示言語の変更と保存 Language / Display language を希望する言語(例:日本語)に切り替え、右下の [Save changes] をクリックします。 4. Reload page 画面をリロードするよう促すダイアログが表示されるので、[Reload page] をクリックします。 画面表示の変化 切り替え前の Home 画面(英語表示) 切り替え後の Home 画面(日本語表示) 技術的な注意点・補足 対象範囲 本機能で変更されるのは Kibana の UI 表示言語(i18n)です。インデックスされているログやドキュメントなどのデータ内容が自動翻訳されるわけではありません。 機能ステータス Kibana 9.5 時点ではベータ版(Beta)機能です。本番運用環境への導入にあたっては、制限事項や今後の更新情報をご確認ください。 おわりに ユーザーごとの表示言語設定機能により、サーバー全体の設定を変更することなく、各自が使いやすい言語環境で Kibana を活用できるようになりました。 複数メンバーで同一環境を利用している場合は、ぜひ試してみてください。 参考URL PR #260835 The post Kibanaでユーザーごとの表示言語切り替えが可能に!新機能の概要と設定方法解説 first appeared on Elastic Portal .
Elastic Securityで生成AIを使うとき、どのLLMを選べばよいのでしょうか。 Elasticは、複数のLLMをElastic Securityのタスクで評価した「Large language model performance matrix」を公開しています。モデルを比較できる便利な資料ですが、Overall Score(総合点)の順位だけで選ぶと、使いたい機能に合わないモデルを選ぶ可能性があります。 本記事で使うモデル名、スコア、集計方法、「5以下はそのタスクに非推奨」という基準は、特記がない限り2026年8月26日時点のElastic公式性能表に基づきます。 [^1] モデルや評価値は更新される可能性があるため、導入時には最新の公式表をご確認ください。 目次 先に結論:モデル名ではなく、使いたい機能から選ぶ 性能表が評価する3つの能力 Overall Scoreだけでは判断できない 「自己デプロイ可能なモデルは使えない」は正確ではない なぜ一般的なLLMランキングと結果が違うのか Agent Builderは「実際に作業したか」も評価する Attack Discoveryは「攻撃を正しくまとめられるか」を評価する 自己デプロイ可能なモデルは、同じモデル名でも結果が変わる モデルファイルの容量と、実行に必要なメモリは同じではない 実際の選定手順 1. 使いたい機能を1つ決める 2. 対応するスコアを見る 3. 5以下を非推奨の目安にする 4. 自己デプロイ可能なモデルでは実行条件を記録する 5. 自社に近いデータでPoCする まとめ 補足:性能表の集計値を資料へ転記するときの注意 参考資料 先に結論:モデル名ではなく、使いたい機能から選ぶ LLMは、すべての仕事で同じ性能を発揮するわけではありません。 たとえば、あるモデルがAttack Discoveryに向かなくても、Automatic Migrationでは高い性能を示すことがあります。「このモデルは使える/使えない」と一括りにせず、 どの仕事に使えるか を見る必要があります。 性能表が評価する3つの能力 性能表の上位項目は、次の3つです。 能力 Elastic Securityで行う仕事 確認する場面 Agent Builder アラート分析、脅威ハンティング、検知ルールやワークフローの作成など SOC業務をAIエージェントに支援させたい Attack Discovery 複数のアラートを関連付け、攻撃のまとまりや流れとして示す 大量のアラートから優先調査対象を見つけたい Automatic Migration 他社SIEMの検知ルールをElastic向けに変換する Splunkなどからルールを移行したい Agent Builderは、さらに7つのサブ能力に分かれています。 Alert Analysis(アラート分析) Entity Analytics(ホストやユーザーの分析) Threat Hunting(脅威ハンティング) Detection Rules(検知ルール作成) Workflow Authoring(ワークフロー作成) Triggering Workflows(ワークフロー実行) Multi-Step Executions(複数ステップの実行) Agent Builderの平均点が高くても、自分が使いたいサブ能力の点が低い場合があります。用途が決まっているなら、平均点より個別のスコアを優先します。 Overall Scoreだけでは判断できない Overall Scoreは、次の3スコアの平均です。 Overall Agent Builder Score Attack Discovery Automatic Migration この数値は、Elastic SecurityのAI機能全体で広く高い性能を持つかを見るには便利です。しかし、異なる仕事の平均なので、特定機能への適性は隠れてしまいます。 参照日時点の主なモデルを例に見てみます。比較の基準として表全体でOverall Scoreが最も高いClaude Opus 4.7と、Overall Scoreが高くても機能ごとに差がある例としてGemini 2.5 Flashを掲載しました。 公式表は、利用者が自分でデプロイできるモデルを「Open-source models」に分類しています。ただし、各モデルのライセンス条件は同じではありません。そのため、本記事では誤解を避けるために 自己デプロイ可能なモデル と呼びます。下表の3モデルは、この分類でOverall Scoreが高い上位3件です。 モデル Agent Builder Attack Discovery Automatic Migration Overall Anthropic Claude Opus 4.7 8.29 9.70 9.70 9.23 Google Gemini 2.5 Flash 5.86 9.50 9.81 8.39 OpenAI GPT-OSS 120B 5.14 3.00 9.40 5.85 Gemma 4 31B IT 7.00 2.80 7.50 5.77 DeepSeek V4 Pro 5.86 8.30 3.10 5.75 Gemini 2.5 FlashはOverall Scoreが8.39と高い一方、Agent Builderは5.86です。さらにサブ能力を見ると、Alert AnalysisとDetection Rulesはどちらも5.00で、Elasticの基準ではそのタスクに非推奨です。Overall Scoreが個別の弱点を隠す問題は、モデルの提供形態に関係なく起こります。 また、3つの自己デプロイ可能なモデルは、Overall Scoreだけを見ると5.75〜5.85と近い値です。一方、得意分野は大きく異なります。 GPT-OSS 120BはAutomatic Migrationが9.40ですが、Attack Discoveryは3.00です。 Gemma 4 31B ITはAgent Builderが7.00、Automatic Migrationが7.50です。 DeepSeek V4 ProはAttack Discoveryが8.30ですが、Automatic Migrationは3.10です。 つまり、「自己デプロイ可能なモデルの中でOverall Scoreが最も高いもの」を選ぶ方法は適切ではありません。Attack Discoveryを使うならAttack Discoveryの列、SIEM移行ならAutomatic Migrationの列を見るのが基本です。 「自己デプロイ可能なモデルは使えない」は正確ではない 性能表から読み取れるのは、「すべての主要機能で安定して高得点を取る自己デプロイ可能なモデルは、掲載モデルの中には見当たらない」ということです。 一方で、用途別には有力な候補があります。 Automatic Migration:GPT-OSS 120Bは9.40 Agent Builder:Gemma 4 31B ITは7.00 Attack Discovery:DeepSeek V4 Proは8.30 そのため、「自己デプロイ可能なモデルは使い物にならない」ではなく、 用途による性能差が大きいため、機能ごとの選定が特に重要 と表現するほうが正確です。 なお、Elasticの基準は「5以下はそのタスクに非推奨」です。「絶対に動かない」「利用価値がない」という意味ではありません。原文は「5 or below」なので、5.0ちょうども非推奨に含まれます。 なぜ一般的なLLMランキングと結果が違うのか この性能表は、一般的な知識や文章作成能力を比べるLLMランキングではありません。Elasticは、模擬した侵入シナリオ、正解データ、ツール呼び出しを含む実行過程、モデル名を伏せたブラインド評価などを使い、Elastic Securityの業務における性能を評価しています。 [^2] Agent Builderは「実際に作業したか」も評価する Agent Builderの評価には「No tool call, no credit」という考え方があります。必要なツールを呼ばず、もっともらしい文章だけを返した場合は、根拠のない回答として10点中6点が上限になります。 たとえば、検知ルールやワークフローを作成するタスクでは、文面が正しそうかだけではなく、実際に作成、有効化、実行できたかまで確認します。 Attack Discoveryは「攻撃を正しくまとめられるか」を評価する Attack Discoveryは、関連するアラートを一つの攻撃ストーリーとしてまとめ、関係するユーザーやホスト、MITRE ATT&CKとの対応などを示す機能です。 [^3] 評価では、各モデルに同じ約95件のアラートを渡し、その中に含まれる8つの独立した侵入を発見できるかを確認します。主な評価軸は次の4つです。 網羅性:8つの侵入をどこまで見つけられたか 正確性:ホスト、マルウェア、攻撃の流れなどを正しく説明したか 相関の品質:関連するアラートを正しくまとめたか 実用性:調査に使えるタイトル、概要、優先度を示せたか Agent Builderとはタスクが異なるため、Attack Discoveryの評価ではツールを使いません。この違いも、同じモデルのスコアが機能ごとに大きく変わる理由の一つです。 自己デプロイ可能なモデルは、同じモデル名でも結果が変わる 性能表では、DeepSeek V4 ProがAttack Discoveryで8.30を記録しています。しかし、同じモデルを用意すれば、自社環境でも8.30を再現できるとは限りません。 結果には、次の条件も影響します。 確認項目 意味 結果への影響 モデルの配布形式 どの形式・精度でモデルを用意するか 精度、必要メモリ、対応ソフトウェアが変わる 量子化 重みを低い数値精度で保持する方法 必要メモリを減らせる一方、性能に影響する可能性がある 推論エンジン LLMの回答生成を実行するソフトウェア 応答速度、同時実行数、GPUメモリの使い方が変わる コンテキストウィンドウ 一度に扱える入力と出力の範囲 長いアラート情報を扱えるかが変わる 生成パラメーター temperatureやmax tokensなど 出力のばらつきや、回答が途中で切れる可能性が変わる ハードウェア GPU、VRAM、RAMなど 実行の可否、速度、同時実行数が変わる 生成パラメーターの仕組みはHugging Face Transformersの公式ドキュメント、推論時の調整はvLLMの公式ドキュメントで確認できます。 [^4][^5] 量子化の方式と対応ハードウェアはさまざまで、方式によって圧縮率や精度への影響が異なります。 [^6] Elasticは、自己デプロイ可能なモデルを運用する接続先として、本番環境またはエアギャップ環境ではvLLM、テスト環境ではLM Studioの手順を案内しています。エアギャップ環境とは、インターネットなどの外部ネットワークから分離した環境です。また、Attack Discoveryでは性能表に掲載されたモデルの利用を推奨しています。 [^7] モデルファイルの容量と、実行に必要なメモリは同じではない LLMは、学習で得た数値を「重み」としてモデルファイルに保持しています。モデルファイルの容量は、主に保存やダウンロードに必要なディスク容量を示します。 一方、実行時にはモデルの重みだけでなく、入力の長さや処理中のデータにもメモリを使います。そのため、「ファイルを保存できる」ことと「実用的な速度で安定して動かせる」ことは別です。モデルメモリの主な構成要素は、Hugging Faceの解説で確認できます。 [^8] たとえば、量子化モデルを公開しているUnslothのDeepSeek-V4-Pro-0813-GGUFでは、Unsloth Dynamic 2.0の4-bit量子化UD-Q4_K_XLが850GBです。GGUFは、モデルの重みや設定情報をまとめ、配布・実行しやすくするファイル形式です。 [^9] このモデルは総パラメーター数1.57兆で、1トークンの処理に使われるアクティブパラメーターは48B(480億)です。処理ごとに使う部分は一部でも、モデル全体の重みをファイルに保持するため、4-bitでも850GBになります。これは「850GBのディスクがあれば、そのまま実用的に動かせる」という意味ではありません。 Elasticの評価記事には、同じデータ、プロンプト、エージェント、スキル、ツールを使い、変更する変数をモデルだけにしたと説明されています。一方、モデルの数値精度、推論エンジン、ハードウェア、コンテキストウィンドウ、temperatureなど、各社の環境で結果を再現するための実行条件は記載されていません。 したがって、性能表のスコアは有力な候補を絞るために使い、最終的な判断は自社の実行構成とデータを使ったPoCで行います。 実際の選定手順 1. 使いたい機能を1つ決める 「Elastic SecurityでAIを使いたい」ではまだ広すぎます。まずは、次のように対象を1つに絞ります。 アラート分析を支援したい Attack Discoveryで優先調査対象を見つけたい Splunkの検知ルールをElasticに移行したい 2. 対応するスコアを見る Attack DiscoveryならAttack Discoveryの列、検知ルール移行ならAutomatic Migrationの列を見ます。Agent Builderを使う場合は、必要なサブ能力まで確認します。 3. 5以下を非推奨の目安にする これはモデル全体への評価ではなく、選んだタスクに対する目安です。別の機能で高得点なら、そちらの用途では候補に残せます。 4. 自己デプロイ可能なモデルでは実行条件を記録する モデル名だけでなく、配布形式、量子化、推論エンジン、コンテキストウィンドウ、生成パラメーター、ハードウェアを記録します。再テストやモデル間の公平な比較がしやすくなります。 5. 自社に近いデータでPoCする たとえばAttack Discoveryなら、関連するアラートと無関係なアラートを混ぜ、次の点を確認します。 関連するアラートを一つの攻撃としてまとめられるか 無関係なアラートを混ぜないか 攻撃の流れを正しく説明できるか 存在しない事実を追加しないか 同じテストを繰り返しても結果が安定するか スコアは「絶対的な正解」ではなく、候補を絞るための手がかりです。最終判断には、本番に近い入力、データ量、失敗パターンを使った確認が必要です。 まとめ Elastic SecurityのLLM性能表で最も大切なのは、ランキングではなく、 自分が使う機能の列を見ること です。 Overall Scoreは全体像をつかむ参考値ですが、特定タスクの最終判断には向きません。自己デプロイ可能なモデルでは、モデル名が同じでも実行条件によって結果が変わるため、構成を記録したうえでPoCを行います。 最初に、次の一文を決めると選定しやすくなります。 Elastic Securityのどの機能を、どのようなデータで使いたいのか。 この問いを決めてから、該当スコアと自社PoCの結果を確認することが、失敗の少ないLLM選定につながります。 補足:性能表の集計値を資料へ転記するときの注意 参照日時点の表には、集計方法の説明と一部の記載値が一致しないように見える行があります。 公式説明ではOverall Agent Builder Scoreは7つのサブ能力の平均です。しかし、表示されたサブスコアを単純平均すると、次の3モデルでは掲載値と一致しません。サブスコアの並びは、Alert Analysis / Entity Analytics / Threat Hunting / Detection Rules / Workflow Authoring / Triggering Workflows / Multi-Step Executionsの順です。 モデル 表示された7サブスコア 合計 単純平均 掲載値 GPT-OSS 120B 5, 4, 6, 7, 5, 8, 7 42 6.00 5.14 Gemma 4 31B IT 6, 6, 7, 6, 8, 8, 7 48 6.86 7.00 DeepSeek V4 Pro 5, 6, 6, 6, 9, 8, 7 47 6.71 5.86 一方、掲載されたAgent Builder、Attack Discovery、Automatic Migrationの3スコアからOverall Scoreを計算すると、3モデルとも表のOverall Scoreと一致します。ずれが確認できるのはAgent Builderの集計部分です。 差の大きさは同じではありません。Gemma 4 31B ITは合計で1点分の差ですが、GPT-OSS 120BとDeepSeek V4 Proはいずれも約6点分の差があり、表示値の単純な端数処理だけでは説明しにくい大きさです。 公開情報からは、この差の原因を特定できません。公式説明は「平均」としており、重み付けや表示前の数値に関する説明もありません。資料に転記する場合は、次のように扱うのが安全です。 参照日を付け、公式表へのリンクを掲載する 独自に再計算した値を公式スコアとして扱わない 意思決定には、利用する能力の個別スコアとPoC結果を使う また、未掲載モデルは「性能が低い」のではなく、「この表では確認できない」と扱います。 参考資料 [^1]: Large language model performance matrix for Elastic Security [^2]: Benchmarking the Agentic SOC: How we evaluate LLMs for security workflows [^3]: Attack Discovery [^4]: Generation [^5]: Optimization and Tuning [^6]: Quantization overview [^7]: Self-managed custom LLMs [^8]: GPU memory usage [^9]: DeepSeek-V4-Pro-0813-GGUF The post Elastic Securityで使うLLMはどう選ぶ?性能表の正しい読み方 first appeared on Elastic Portal .
Elastic Clous Serverless では、これまで Amazon Web Services の 東京リージョンを利用することができましたが、これに加えて、Google Cloud Platform (GCP) の東京リージョン( asia-northeast1 )も利用できるようになりました。 日本国内のワークロードにおいて、インフラ管理不要な検索・分析基盤を低レイテンシーで導入できるようになります。 目次 今回のアップデートのポイント 主な活用ユースケース はじめる手順 参考URL 今回のアップデートのポイント 低レイテンシーなアクセス 日本国内のユーザーや、GCP東京リージョン上に配置されたシステムからの通信遅延を最小限に抑えます。 データガバナンスの遵守 データを国内に保持・管理できるため、社内規定やコンプライアンス要件に適合しやすくなります。 主な活用ユースケース GCP上の生成AI・RAG(検索拡張生成)基盤 Gemini などのGoogle Cloudプロダクトと連携し、ベクトル検索やハイブリッド検索を活用した高精度なナレッジ検索基盤を低遅延で構築。 GCPワークロードのObservability(可視化・分析) Google Cloud上で稼働するアプリケーションやマイクロサービスのログ・メトリクス・トレースを統合管理。 はじめる手順 Elastic Cloud コンソール  にログインする。 Serverless projects の [Create serverless project] から Serverless プロジェクトの新規作成画面を開く。 Elasticsearch / Elastic for Observability / Elastic for Security のいずれかの type を選択する。 クラウドプロバイダーに  Google Cloud  を選択する。 リージョンに  Tokyo (asia-northeast1)  を指定してプロジェクトを作成する。 GCP東京リージョンの利用が可能になったことで、日本国内におけるクラウド構成の自由度とパフォーマンスがさらに向上します。サーバーレスの手軽さとElasticの強力な検索・分析能力をぜひ体験してみてください。 参考URL https://www.elastic.co/docs/release-notes/cloud-serverless#july-28-2026 The post Elastic Cloud ServerlessでGCP東京リージョンが利用可能になりました! first appeared on Elastic Portal .
Elastic 9.5では、ログの保存方法、ベクトル検索、マルチモーダル検索、AIエージェントの運用、Prometheusからの移行など、幅広い領域に新機能が追加されました。 今回のポイントは、単に機能が増えたことではありません。これまでエンジニアが手作業で行っていた 保存方式の最適化、ベクトル検索の設定、PromQLの書き換え、AIエージェントの調査 を、Elastic側がより多く引き受ける方向へ進んだことです。 この記事では、Elastic 9.5の主要機能について、次の4点に絞って説明します。 何を解決する機能なのか 9.5で何が変わったのか どのような人や環境に役立つのか 導入前に何を注意すべきか 対象バージョン :Elastic 9.5(2026年8月4日リリース) 想定読者 :Elasticを利用しているエンジニア、導入を検討しているアーキテクト、運用担当者 目次 まず押さえたいGAとTech Preview Columnar Mode:ログを「検索中心」から「分析中心」へ 何を解決する機能か 9.5で何が変わったか なぜ役立つのか 注意点 VectorDB index modeとAuto-calibration:ベクトル検索の初期設定を簡単にする 何を解決する機能か VectorDB index mode DiskBBQとAuto-calibration 注意点 マルチモーダルsemanticフィールド:画像やPDFも意味で検索する 何を解決する機能か 9.5で何が変わったか 注意点 Agent Builder tracing:AIエージェントの処理を見えるようにする 何を解決する機能か 9.5で何が変わったか 具体例 プライバシー上の注意 PromQL GA:Prometheus資産をElasticで活用しやすくする 何を解決する機能か 9.5で何が変わったか 移行ツール メトリック 注意点 Workflows:作成しやすく、壊しても戻しやすくする バージョン管理 Visual Mode 自然言語オーサリング Human-in-the-loop Security:AIによる調査とルール運用を強化 AlertZeroは製品名ではない Attack Discoveryの変化 検知ルール変更履歴 注意点 その他のGA機能 Dashboards API Cases as Data どの機能から試すべきか GA機能で優先度が高いもの 検証環境で試すTech Preview まとめ 参考資料 まず押さえたいGAとTech Preview Elastic 9.5の機能は、すぐに本番利用を検討できる GA(正式提供)と、まず検証環境で試すべきTech Preview に分かれます。 機能 状態 一言でいうと PromQL対応 GA 多くの既存PromQLをElasticで実行できる Dashboards API GA ダッシュボードをコードとして管理できる Cases as Data GA ケース情報を分析用データとして利用できる Workflowsの自然言語オーサリング GA 自然文からWorkflowの初稿を生成できる Workflowsのバージョン管理 GA 変更履歴の確認、比較、復元ができる 検知ルール変更履歴 GA ルールの変更内容と変更者を追跡できる Columnar Mode / Columnar Logs Tech Preview ログの保存容量を減らし、分析向けに最適化する VectorDB index mode Tech Preview ベクトル検索向けの設定をまとめて適用する DiskBBQ Auto-calibration Tech Preview 実データに合わせてベクトル検索設定を自動調整する マルチモーダルsemanticフィールド Tech Preview テキスト、画像、音声、動画、PDFを意味で検索する Agent Builder tracing Tech Preview AIエージェントの処理をトレースとして確認する Tech Previewの機能は、将来のElasticの方向性を理解するうえで重要ですが、本番利用の前に機能制約、性能、ライセンスを確認する必要があります。 Columnar Mode:ログを「検索中心」から「分析中心」へ 状態:Tech Preview 対象:大量のログを長期間保存し、ダッシュボードや集計で利用する環境 何を解決する機能か 通常のElasticsearchでは、1つのフィールドを検索、範囲検索、集計、元データの保持など、複数の目的に合わせて保存します。これは高い検索性能を実現する一方、ログのようにフィールド数が多いデータでは、保存容量が大きくなります。 実際のログ運用では、すべてのフィールドを全文検索するわけではありません。多くのフィールドは、ダッシュボードでの絞り込みや集計に使われます。 9.5で何が変わったか Columnar Modeは、非テキストフィールドを主に列形式で保存し、転置インデックスや数値範囲検索用のBKDツリーを既定では作りません。 ログ向けのlogsdb_columnarでは、messageなどのテキストフィールドには全文検索用の転置インデックスを残し、それ以外の構造化フィールドは列形式を中心に保存します。 PUT logs-example {   "settings": {     "index.mode": "logsdb_columnar"   } } なぜ役立つのか 列形式では、クエリに必要なフィールドだけを読みやすく、同じ種類の値が並ぶため圧縮もしやすくなります。 例えば、次のようなログ基盤に向いています。 1日に大量のログを取り込む service.nameやlog.levelごとの集計が多い Kibana Dashboardで傾向を見ることが中心 保存コストのため保管期間を短くしている 注意点 すべての検索が速くなるわけではありません。trace.idやpod.uidのようなランダムな値を1件だけ探す検索や、数値の範囲検索は、通常のインデックスより遅くなる可能性があります。 また、index.modeは作成後に変更できません。既存データへ適用するには、ロールオーバーまたはreindexが必要です。現時点では一律の削減率も公表されていないため、自社データで比較することが重要です。 ドキュメントの更新、nestedデータ、特定ドキュメントの取得、全文検索の関連度評価が中心の場合は、従来のインデックスモードのほうが適しています。 要点 :保存と分析を優先するログには有望ですが、ピンポイント検索が多い環境では事前検証が必要です。 VectorDB index modeとAuto-calibration:ベクトル検索の初期設定を簡単にする 状態:Tech Preview 対象:RAG、セマンティック検索、画像検索などをこれから構築するチーム 何を解決する機能か ベクトル検索では、文章や画像を数値の並びであるベクトルへ変換し、意味の近さを距離で検索します。 ただし、大量のベクトルを扱うには、圧縮方法、検索候補数、メモリの使い方など、多くの設定が必要です。最適な値はデータによって変わるため、従来は性能と精度を測りながら手作業で調整する必要がありました。 VectorDB index mode vectordb_documentを指定すると、ベクトル検索に適した複数の設定がまとめて適用されます。 PUT my-vector-index {   "settings": {     "index.mode": "vectordb_document"   } } 主な目的は次のとおりです。 ベクトルの保存容量を抑える ベクトルを_sourceへ重複保存しない 重いセグメントマージを効率化する 検索で頻繁に使う構造を先読みする 個別の内部設定をすべて理解しなくても、ベクトル検索向けの初期状態から検証を始められます。 DiskBBQとAuto-calibration DiskBBQは、検索に必要なデータの多くをディスクへ置き、メモリへ載せるデータを減らすための検索方式です。大量のベクトルを、限られたRAMで扱いたい環境に向いています。 Auto-calibrationを有効にすると、Elasticsearchが実際のベクトルを調べ、圧縮方法や検索候補数などを自動的に選びます。 "index_options": {   "type": "bbq_disk",   "auto_calibrate": true } 正しいパラメータ名はauto_calibrateです。 注意点 Auto-calibrationは、精度を100%保証する機能ではありません。検索品質、レイテンシ、取り込み性能は実データで確認する必要があります。 比較的検索しやすいデータでは圧縮を強くし、難しいデータでは情報を多く残すことで、容量と検索精度のバランスを自動調整します。 bbq_diskにはEnterpriseライセンスが必要です。また、index.modeやauto_calibrateはインデックス作成後に変更できないため、既存データへ適用する場合はreindexが必要です。 要点 :ベクトル検索の専門的な初期設定を減らす機能です。ただし、最終的な品質確認まで自動化されるわけではありません。 マルチモーダルsemanticフィールド:画像やPDFも意味で検索する 状態:Tech Preview 対象:図面、商品画像、スキャン文書、音声、動画を検索したいチーム 何を解決する機能か これまでのsemantic_textは、主にテキストを対象とした機能でした。画像や音声を検索するには、データの種類ごとに別のモデルやパイプラインを作る必要がありました。 9.5で何が変わったか 新しいsemanticフィールドは、次のデータを扱えます。 テキスト 画像 音声 動画 PDF これらを同じ埋め込みモデルでベクトル化することで、異なる種類のデータを意味の近さで検索できます。 例えば、次のような検索が可能になります。 「赤い花柄のワンピース」という文章から商品画像を探す 画像をクエリにして似た画像を探す 自然文から関連するPDFや図面を探す 音声から意味の近い音声や説明文を探す "my_semantic_field": {   "type": "semantic",   "inference_id": ".jina-embeddings-v5-omni-small" } 注意点 非テキストデータはdata URL形式で投入します。入力サイズは既定で1MBで、Serverlessでは1MB固定です。また、PDFなどは自動的にページ単位へ分割されないため、細かく検索したい場合は事前の分割設計が必要です。 事前定義されたJinaモデルはElastic Inference Serviceを利用します。データの送信先、料金、ライセンス、データ主権もPoC前に確認してください。 ページ単位で検索したい場合は、事前にPDFをページごとに分割して投入します。 また、重要な制約として、semanticフィールドは 9.5以降に作成されたインデックスで使用する必要がある ため、既存インデックスではreindexが必要になる場合があります。 要点 :検索対象をテキスト以外へ広げる機能です。実務では、ファイルサイズ、分割方法、推論コストが導入判断のポイントになります。 Agent Builder tracing:AIエージェントの処理を見えるようにする 状態:Tech Preview 対象:Agent BuilderをPoCまたは運用で利用しているチーム 何を解決する機能か AIエージェントは、1つの質問に対して複数回LLMを呼び出したり、ES|QLなどのツールを実行したりします。 そのため、応答が遅い、トークン消費が増えた、意図しないツールを呼んだといった問題が起きても、原因を特定しにくいという課題があります。 9.5で何が変わったか Agent Builderは、エージェントの実行内容をOpenTelemetry形式のトレースとして記録できるようになりました。 確認できる主な情報は次のとおりです。 LLMを何回呼び出したか 各処理にどのくらい時間がかかったか どのツールを実行したか 入力・出力トークン数 どの処理で失敗したか トレースはElasticsearchへ保存されるため、Discover、ES|QL、Lens、Dashboard、アラートなど、既存のElastic機能で分析できます。 具体例 あるエージェントの応答時間とトークン使用量が突然増えたとします。 トレースを確認すると、ES|QLツールが大量の結果を返し、その内容が後続のLLM呼び出しへ何度も渡されていたことが分かるかもしれません。原因が分かれば、クエリにLIMITを追加する、ツールの説明を修正するといった対応ができます。 プライバシー上の注意 トークン数やモデル名などの構造的な情報は記録されますが、ユーザーのプロンプト、LLMの回答、ツールの結果などは既定では記録されません。 詳細内容を記録するとデバッグには便利ですが、個人情報や機密情報が含まれる可能性があります。保存期間とアクセス権限を含めた設計が必要です。 要点 :AIエージェントを通常のアプリケーションと同じように監視し、性能・コスト・失敗原因を調べるための機能です。 PromQL GA:Prometheus資産をElasticで活用しやすくする 状態:GA 対象:Prometheus、Grafana、OpenTelemetryメトリックを利用しているチーム 何を解決する機能か PrometheusからElasticへ移行するとき、大きな負担になるのはデータ転送だけではありません。既存のGrafana Dashboardやアラートルールに書かれたPromQLを、別のクエリ言語へ書き換える作業が必要でした。 9.5で何が変わったか ElasticはPrometheus互換HTTP APIと、ES|QLから利用できるPROMQLコマンドをGAとして提供します。 PROMQL sum by (service.name) (rate(http_requests_total[5m])) GrafanaからElasticのPrometheus互換APIを参照することで、多くの既存PromQLを変更せず利用できます。また、PromQLの結果をES|QLパイプラインで後処理することもできます。 移行ツール Observability Migration Platformは、GrafanaやDatadogのダッシュボードとアラートをKibanaへ移行するためのCLIです。 変換できないパネルを無理に作成するのではなく、手動確認が必要な箇所を示す設計になっています。移行前に検証する–validateオプションも用意されています。 メトリック 9.5ではメトリック用コーデックも改善され、Elasticの説明では、メトリックの保存容量が前バージョンからさらに約20%削減されています。PromQL対応だけでなく、保存効率も改善されています。 注意点 PromQLとPrometheusが完全互換になったわけではありません。and、unless、group_left、group_rightなど、一部の構文や動作には制限があります。既存のGrafana Dashboardやアラートは、移行前に実データで確認する必要があります。 要点 :Prometheus/Grafanaの既存資産を活かしたまま、Elasticへ段階的に統合しやすくする機能です。 Workflows:作成しやすく、壊しても戻しやすくする 状態:GA (利用プランとAgent Builder/LLM設定の確認が必要) 対象:Elastic Workflowsで運用自動化を行うチーム バージョン管理 9.5では、Workflowの変更履歴を確認し、差分比較や過去バージョンへの復元ができるようになりました。 自動化は、一度動けば終わりではありません。条件や接続先を変更した結果、処理が動かなくなることがあります。変更者、変更日時、変更内容を追跡できることで、障害調査と監査が行いやすくなります。 自然言語によるWorkflow作成を利用するには、Agent BuilderへのアクセスとLLMの設定が必要です。 Visual Mode Workflowを、トリガー、ステップ、分岐を含む図として確認できます。ただし、9.5時点では読み取り専用です。ドラッグ&ドロップでWorkflowを作成する機能ではありません。 自然言語オーサリング 「アラートが発生したら関連ログを取得し、AIで要約してSlackへ送る」といった指示から、WorkflowのYAML初稿を生成できます。 生成されたWorkflowは、人間が確認してから実行します。自然言語だけで安全な自動化が完成するわけではなく、作成作業のスタートを速くする機能と考えるべきです。 Human-in-the-loop Workflowを途中で止め、人間の入力や承認を待つステップも利用できます。AIや自動処理にすべてを任せず、重要な操作だけ人間が判断する設計に役立ちます。 要点 :Workflowsは「作る機能」だけでなく、変更管理、レビュー、承認を含む運用基盤へ進化しています。 Security:AIによる調査とルール運用を強化 対象:Elastic Securityを利用するSOC、セキュリティ運用チーム AlertZeroは製品名ではない AlertZeroは、新しい製品や機能の名前ではありません。大量のアラートをそのまま人間へ渡すのではなく、AIと自動化によって優先順位を付け、アナリストが重要な脅威へ集中できる状態を表す考え方です。 Attack Discoveryの変化 従来のAttack Discoveryは、複数のアラートを関連付け、攻撃のまとまりとして説明する役割が中心でした。 9.5では、Agent BuilderとWorkflowsを利用し、次のような追加調査を行う方向へ拡張されています。 関連する生イベントを検索する ユーザーやホストのリスク情報を確認する アラート以外の証拠を探す 調査結果をまとめる 見逃していた活動からES|QLルールの案を作る 別のAlert Analysisワークフローでは、アラートを真陽性と誤検知に分類します。これにより、アナリストが低品質なアラートへ費やす時間を減らし、Attack Discoveryもより整理された対象を調査しやすくなります。 作成されたルール案は、人間がレビューし、承認するまで検知ルールとして追加されません。 検知ルール変更履歴 検知ルールの作成、編集、有効化、無効化、例外の追加などを履歴として確認できます。変更前後の差分表示と、過去状態への復元も可能です。 例えば、例外条件を広く設定しすぎてルールが発火しなくなった場合でも、どの変更が原因だったかを追いやすくなります。 注意点 Attack Discoveryのエージェント的な調査では、複数回のLLM呼び出しとツール実行が発生します。調査品質だけでなく、トークン費用、データ送信先、機密情報の扱いを確認してください。 また、AIが作成したES|QLルールは、構文が正しくても、自社のログに必要なフィールドが存在しない、誤検知が多いといった可能性があります。人間によるテストとレビューは必要です。 なお、Agent BuilderとWorkflowsを使った新しいAttack Discoveryの動作は、詳細設定で有効化する必要があり、9.5では既定でオフです。 要点 :SecurityのAIは、アラートを説明する段階から、証拠を探して調査を支援する段階へ進もうとしています。 その他のGA機能 Dashboards API Kibana Dashboardを構造化されたJSONとして作成・更新できます。Gitでの差分管理、レビュー、CI/CDによる環境間展開が行いやすくなります。 ただし、すべてのパネルタイプをAPIだけで扱えるわけではありません。既存Dashboardをコード管理へ移す場合は、対応パネルを確認してください。 Cases as Data ケース情報を分析用インデックスへ同期し、Discover、Lens、ES|QL、Dashboardから分析できます。 これにより、ケース件数、クローズ率、対応時間、担当者ごとの負荷などを確認できます。更新はリアルタイムではなく、反映に時間差がある点に注意してください。 どの機能から試すべきか GA機能で優先度が高いもの 現在の課題 最初に確認する機能 PrometheusやGrafanaから移行したい PromQL対応と移行CLI Dashboardを環境間で管理したい Dashboards API SOCの対応時間や負荷を測りたい Cases as Data Workflowの変更が怖い バージョン管理 検知ルールの変更原因を追えない 検知ルール変更履歴 検証環境で試すTech Preview 現在の課題 検証する機能 ログの保存費用が高い Columnar Logs ベクトル検索の設定が難しい VectorDB index mode / Auto-calibration 画像やPDFを意味で検索したい semanticフィールド Agent Builderの遅延や費用が分からない Agent Builder tracing Tech Previewでは、既存環境を直接変更するのではなく、小さな新規インデックスや限定したデータセットで比較するのが安全です。 まとめ Elastic 9.5は、次の3つの方向へ進んだリリースと整理できます。 データ保存を効率化する Columnar Modeにより、大量ログを分析と長期保存へ最適化します。 検索とAIの構築作業を減らす VectorDB index mode、Auto-calibration、マルチモーダルsemanticフィールドにより、ベクトル検索の開始を簡単にします。 AIと自動化を運用できる形にする Agent Builder tracing、Workflowのバージョン管理、Human-in-the-loop、検知ルール変更履歴により、AIと自動化を監視・修正・監査しやすくします。 そのほかにも、KubernetesとAWSのオンボーディングでは、推奨されるOpenTelemetry経路を使ってセットアップが簡素化、APMのService Map改善、LLM ObservabilityのAnthropic対応が追加されています。Elastic Defendでは、脆弱なドライバーに対する予防的保護、Windows on ARM対応、エンドポイントのトラブルシューティングスキルが追加されました。Workflowsでは、Slackなどの外部ツールから承認することもできます。 GA機能は既存運用への適用を検討し、Tech Previewは将来の設計判断に向けて小さく検証するのがよいでしょう。 参考資料 Elastic 9.5公式リリースブログ Columnar Mode dense_vector field type semantic field type Agent Builder traces PromQL overview PromQL limitations Elastic Workflows Attack Discovery Detection rule changes history Cases as Data The post Elastic 9.5の新機能を速報解説:保存、ベクトル検索、AI運用はどう変わるのか first appeared on Elastic Portal .
目次 この記事でやりたいこと 使ったデータ:強震観測CSVが57行 ダッシュボードは3枚に分けた ダッシュボード1:活動概要・時間再生 ダッシュボード2:M7.1地震後の活動分析 記録は、M7.1の直後の数時間に集中していた 記録件数が少なくなった時間帯にも、比較的大きな地震が含まれていた ダッシュボード3:規模と観測された揺れ マグニチュードと「実際の揺れ」は別物 「強い揺れ」は、どの物差しで測るかで順位が変わる 正直に言うと:データには限界がある 可視化の先へ:継続監視と対応につなげる ライブ監視:データを「流し込み続ける」 機械学習:「予知」のためではなく「防災対応」のために アラートとケース:気づきを「対応」につなげる まとめ:可視化は入り口だった 参考資料 この記事でやりたいこと 2026年7月28日に熊本で発生したM7.1の地震(気象庁の正式名称は「令和8年熊本地震」)の観測データを取り込んでダッシュボードを作ってみました。 先に言っておくと、この記事で地震の専門的な話をするつもりはありません。やりたいのはその逆で、 Elasticという製品を、防災系のデータにどこまで使えるのかを実際に試してみる ことです。 題材に地震を選んだのは、過去に地震関連の仕事に関わった経験があるからです。ある程度知識や経験のある分野なら、「Elasticで可視化したときに、本当に何かが見えてくるのか」を自分の感覚で確かめられると思いました。 この記事では、次の2つをお伝えします。 小さなCSVでも、問いごとに可視化を組み立てることで、表を眺めるだけでは見つけにくい関係が見えてくること そして本当の価値は、その先のライブ監視・機械学習・アラート・情報共有にあること 使ったデータ:強震観測CSVが57行 使ったのは、防災科研の強震観測網(K-NET・KiK-net)の記録をまとめた、2026年7月分のCSVです。中身はこんな項目です。 地震の発生時刻 緯度・経度・震源の深さ マグニチュード 最大加速度(gal)・最大速度(cm/s)・最大計測震度 観測点数 全部で57件。Excelで開けるくらいの、ごく小さなデータです。 ひとつ大事な注意があります。 このCSVは熊本周辺で発生した全地震の一覧ではなく、強震観測データとして公開された地震をまとめたものです。 気象庁は7月30日15時時点で、M7.1の本震発生後、震度1以上を観測した地震が270回発生したと発表しています。この記事で「45件」「57件」と書くときは、すべて「このCSVに含まれる記録の件数」を指しています。 取り込みはKibanaのファイルアップロード機能を使いました。CSVをドラッグするとElasticが項目の型を推測してくれるので、修正したのは2か所だけです。IDの項目を検索用の型(keyword)に直したことと、緯度・経度から地図用のgeo_pointフィールドを作ったことです。 つまり、CSVの取り込みと初期マッピングでは、スクリプトを1行も書いていません。 ダッシュボードは3枚に分けた 熊本周辺(緯度・経度で四角く絞った範囲)の45件を、話の流れごとに3枚のダッシュボードに分けました。 活動概要・時間再生 — 全体像をつかみ、時間を追って再生する M7.1地震後の活動分析 — 記録が時間とともにどう変わったか 規模と観測された揺れ — マグニチュードと実際の揺れの関係 最初は1枚に全部詰め込んでいましたが、「1枚 = 1つの問い」に分けたほうが、見る人が迷いません。順番に紹介します。 ダッシュボード1:活動概要・時間再生 1枚目は、地図とタイムスライダーが主役です。 上の動画でご覧いただけるように、ダッシュボードの上段に「表示中の地震件数・最大マグニチュード・最大計測震度・最大加速度」のカードを並べ、タイムスライダーを動かすと、その時間帯の値と地図上の震源が連動して切り替わります。再生ボタンを押せば、M7.1の地震(7月28日16:27)のあと、記録がどこに現れていったかを、アニメーションのように追えます。 たとえばスライダーを3時間後の19時台に合わせると、カードは「5件・最大M4.2・最大計測震度3.8・90.5 gal」に変わります。M7.1の時間帯(計測震度6.3・1,667.4 gal)と見比べると、数時間で数字が大きく変わったことが分かります。 galのような専門用語は、隣にテキストパネルを置いて説明しています。ダッシュボードは「グラフ置き場」ではなく「読み物」として作る。これはブログに載せる前提だからこそ意識した点です。 動画のように時間を追って変化を見るのではなく、対象期間のすべての地震を最初から一度に表示した状態が以下の画面です。 ダッシュボード2:M7.1地震後の活動分析 2枚目は「時間の流れ」に注目した1枚です。ここで2つのことが見えてきました。 記録は、M7.1の直後の数時間に集中していた 今回使用した強震観測CSVに含まれる熊本周辺の45件を見ると、記録件数はM7.1の地震直後に集中し、その後は少なくなっていました。1時間ごとの棒グラフでは直後の17時台が最多の10件で、CSV内の累積記録数の折れ線も最初の数時間で一気に立ち上がり、その後はほぼ横ばいです。 念のため繰り返すと、少ないデータセットのためこれは「地震活動全体が急減した」という断定ではなく、「このデータセット上では減少して見えた」ということです。それでも、自分のデータで、自分の作ったグラフで傾向を確認できると、納得感がまったく違います。 記録件数が少なくなった時間帯にも、比較的大きな地震が含まれていた ここが一番おもしろかった発見です。 CSV内の記録件数が少なくなった約30時間後の時間帯にも、M7.1の地震の震央から約36km離れた場所で発生したM5.8という比較的大きな地震が含まれていました。 これは、記録件数の棒グラフに「1時間ごとの最大マグニチュード」の折れ線を重ねたことで見つけられました。件数だけを見ていた場合、このM5.8の地震を見落としていたかもしれません。 さらに、KibanaのVegaを使って「M7.1地震からの経過時間 × 震央からの距離」の散布図を作りました。この図から、M5.8の地震が本震から時間的にも距離的にも離れた位置にあることを確認できます。 ダッシュボード3:規模と観測された揺れ 3枚目は「規模(マグニチュード)と、観測された揺れは同じものなのか?」という問いの1枚です。ここでも2つのことが見えました。 マグニチュードと「実際の揺れ」は別物 マグニチュード(地震そのものの規模)と最大計測震度(観測された揺れの強さ)を散布図にすると、全体としては右肩上がりですが、同じM4前後でも計測震度は約1.2から4.0までばらついていました。 マグニチュードと最大加速度の散布図でも同じことが見えます。縦軸を対数(10倍ごとの目盛り)にすると、マグニチュードが上がるにつれて加速度がケタ違いに大きくなっていく傾向と、同じマグニチュードでの大きなばらつきが、両方読み取れます。 gal(ガル)とは? 揺れの「瞬間的な勢い(加速度)」を表す単位です。1 galは「1秒間に秒速1センチ」スピードが変化することを意味します。 身近な例では、車の 急発進や急ブレーキ で体が前後に持っていかれるときの強い衝撃が 約600〜1,000 gal (0.6〜1.0G)です。今回のM7.1の記録(1,667.4 gal)は、日常で体験する急ブレーキ以上の暴力的な衝撃が、地面そのものから加わったことを示しています。 ここで、数値について正確に書いておきます。今回使用したK-NET・KiK-netのCSVでは、M7.1の地震の最大計測震度は6.3で、震度階級では6強に相当します。一方、気象庁が発表した最大震度は7です。観測網や観測地点が異なるため、最大値は必ずしも一致しません。 また、CSVには速報段階の震源深さ「約10km」が入っていますが、気象庁の暫定値では後に16kmへ更新されています。 「規模が同じでも揺れは同じではない」。教科書に書いてあることですが、散布図が一目でそれを語ってくれます。 「強い揺れ」は、どの物差しで測るかで順位が変わる CSVには最大加速度(揺れの鋭さ)と最大速度(揺れの動きの速さ)という、2つの「揺れの物差し」が入っています。この2つを両対数の散布図にすると、全体として右肩上がりの関係が見られます。 おもしろいのは、この全体的な傾向から外れる地震があることです。今回のデータでは、 M6.1の地震:加速度 312.6 gal、速度 21.6 cm/s M5.8の地震:加速度 554.3 gal、速度 6.0 cm/s M5.8のほうが加速度は約1.8倍大きいのに、速度は3分の1以下でした。このCSVに記録された最大値を比較すると、最大加速度ではM5.8が上ですが、最大速度ではM6.1が上でした。つまり、最大加速度と最大速度では、地震の並び順が逆転します。 ただし、最大値を記録した観測点は地震ごとに異なる可能性があるため、この数字だけで地震全体の揺れや被害の大きさを判断することはできません。 この違いの原因(揺れの周期や地盤など)を特定するのは専門家の仕事です。ただ、「傾向から外れた点がある」と気づくところまでは、散布図を作るだけで誰でもたどり着けます。 可視化の役割は答えを出すことではなく、良い問いを見つけることなのだと思います。 正直に言うと:データには限界がある 見えてきたことがある一方で、見えないこともあります。今回のデータは座標が0.1度単位です。震源の深さも公表用の丸められた値で、5km未満は「ごく浅い」、それ以外は「約10km」「約20km」という表現になります。そして先に書いたとおり、このCSVは全地震の一覧ではありません。なので「断層がどう動いたか」のような専門的な分析はできませんし、するべきでもありません。 大事なのは、可視化ツールは「分かること」と同時に「分からないこと」も教えてくれる、という点です。3枚のダッシュボードすべてに注意書きパネルを置いて、読み手が結論を出しすぎないようにしました。 可視化の先へ:継続監視と対応につなげる ここまでは1枚のCSVを可視化した話でした。正直、これだけならBIツールでもできます。 Elasticが本領を発揮するのはここからです。今回は静的なデータで試しましたが、同じ仕組みのまま、ライブ監視・機械学習・アラート・情報共有へ広げられます。 ライブ監視:データを「流し込み続ける」 今回は手動でCSVを入れましたが、Elasticは本来、ログやセンサーデータを絶え間なく受け取り続けるための製品です。同じフィールド構成で観測データを継続的に取り込めば、今回作ったダッシュボードを大きく作り直すことなく、「今起きていること」を映す画面として再利用できます。 過去の分析画面とリアルタイム監視画面がほぼ同じもの。ここがElasticの設計の気持ちよさです。 機械学習:「予知」のためではなく「防災対応」のために Elasticには異常検知(Anomaly Detection)という機械学習機能があります。データの「普段のパターン」を自動で学習し、そこから外れた動きを検知してくれます。先にはっきりさせておくと、目的は「地震を予知すること」ではありません。気象庁も、地震の時期・場所・規模を高い確度で予測することは現在の科学では困難だとしています。機械学習の役割は、観測されたデータの異常な変化を早く見つけて、防災対応を支援することです。 ただし正直に書くと、今回の45件・約54時間の記録だけでは、信頼できるモデルを作るには足りません。異常検知は「通常状態」を学習してこそ機能するので、通常時を含む十分な継続データが必要です(必要な期間は、データの頻度や周期性によって変わります)。 継続データがあれば、たとえば地震件数が普段より急増した時間帯の検知や、観測点からデータが届かなくなる「欠測」の検知に使える可能性があります。災害時に「異常がない」のか「観測できていないだけ」なのかを区別できるのは、防災上大きな意味があります。なお、毎分必ずデータが届くような固定周期のセンサーなら、まずは機械学習ではなく「データが来ていない」という単純なルールで監視するほうが安価で説明もしやすく、通常件数が大きく変動する場合に機械学習を検討する、という順番が現実的です。具体的な検知の設定は、別記事で紹介する予定です。 十分な過去データをElasticに蓄積すれば、まず深さや地域ごとに地震件数、平均マグニチュード、最大加速度などを集計し、「この地域では普段どのような記録が多いのか」を確認できます。 緯度・経度をElasticのgeo_pointとして保存しておけば、震源を地図に表示するだけでなく、特定地点からの距離や指定した地域で絞り込み、地域ごとの件数や平均値を比較できます。地図を格子状のエリアに分ければ、「この地域では浅い地震が多い」「この範囲では観測された揺れが比較的大きい」といった空間的な傾向も見つけやすくなります。 そのうえで機械学習を使うと、過去の傾向を通常状態として学習し、普段とは異なる件数の増加、値の変化、発生場所の変化などを検知できます。ただし、これは地震の発生を予知するものではなく、観測済みデータから通常とは異なる動きを早く見つけるためのものです。 ※機械学習や一部の通知機能の利用可否は、Elasticの契約プランやデプロイ方式によって異なります。 アラートとケース:気づきを「対応」につなげる 異常を検知したら、Elasticのルールでアラートを生成し、メールやSlackなどへの通知を自動実行できます。さらにKibanaのケース(Cases)機能を使えば、検知したイベントを起票して、関連するグラフやコメントを添えてチームで対応状況を追跡できます。「誰が何に気づいて、どう判断したか」が製品の中に残ります。 ダッシュボードは、開いていなければ変化に気づけません。一方、アラートなら、異常を検知したタイミングで担当者へ通知できます。ここまでつながって初めて、Elasticは単なる可視化ツールではなく、 異常発見から初動判断までの基盤 になります。 まとめ:可視化は入り口だった 今回は57行のCSVをElasticに取り込み、そのうち熊本周辺に絞った45件を3枚のダッシュボードで分析しました。それでも、このデータセットの範囲で、 記録はM7.1の直後の数時間に集中していた 記録件数が少なくなった時間帯にも、M5.8の比較的大きな地震が含まれていた 規模(マグニチュード)と観測された揺れは同じではない 「強い揺れ」の順位すら、測る物差しで変わる という4つのことが読み取れました。 そしてこの土台は、そのままライブ監視・異常検知・アラート・チームでの情報共有につながっています。地震を予知するためではなく、異常にいち早く気づき、防災対応を支援するための基盤として。 最後にもう一度だけ。可視化の役割は、答えを出すことではなく、良い問いを見つけることです。今回の3枚のダッシュボードも、答えを出してはいません。でも「なぜこの地震だけ加速度が大きいのか?」という、次に専門家へ持っていける問いを残してくれました。 もし手元に「数字の羅列のままになっているデータ」があれば、まずKibanaにドラッグしてみてください。最初の取り込みと基本的な可視化なら、プログラムを書かずに始められます。そこから必要に応じてVegaやES|QLへ広げられます。 参考資料 謝辞 本記事では、防災科学技術研究所が公開する強震観測網K-NET・KiK-netのデータを利用しました。 防災科学技術研究所(2019)「防災科研K-NET・KiK-net」DOI: 10.17598/NIED.0004 貴重な観測データをご提供いただき、感謝申し上げます。 気象庁 よくある質問「地震の予知はできるのですか」 https://www.jma.go.jp/jma/kishou/know/faq/faq24.html 令和8年熊本地震について(第5報) https://www.jma.go.jp/jma/press/2607/30a/kaisetsu202607301600.pdf Elastic公式ドキュメント:Kibanaのファイルアップロードとgeo_pointフィールドの作成  https://www.elastic.co/docs/explore-analyze/visualize/maps/import-geospatial-data Elastic公式ドキュメント:Anomaly detectionのCount functions(high_count / low_count)  https://www.elastic.co/docs/reference/machine-learning/ml-count-functions Elastic公式ドキュメント:Alerting(ルールからメール・Slackなどへ通知)  https://www.elastic.co/docs/explore-analyze/alerting The post 2026年熊本地震の強震観測データを可視化して見えたこと first appeared on Elastic Portal .
Elastic Securityで検知ルールを有効にしたあと、こんな不安を感じたことはないでしょうか。 ルールはたくさん動いている。でも、これで本当に守れているのだろうか。 ルール一覧では、それぞれのルールを個別に確認できます。しかし、ルール全体が攻撃者のどのような行動を対象にしているのかを、ひと目で把握するのは簡単ではありません。 ここで使う道具が、MITRE ATT&CKです。Elastic Securityには、検知ルールをATT&CKという地図の上に並べて見せる「MITRE ATT&CK coverage」という画面があります。 この記事で扱うのは、次の内容です。 MITRE ATT&CKとは何か Tactic、Technique、Sub-techniqueの違い ATT&CK Matrixは攻撃の順番表ではないこと Elastic Securityの検知ルールとATT&CKの関係 coverage画面の読み方 画面の色が意味すること、意味しないこと 目次 MITRE ATT&CKとは何か ATT&CKが並べているのは「行動」 Tactic、Technique、Sub-technique ATT&CK Matrixは順番表ではない なぜElastic SecurityでATT&CKを使うのか Elastic SecurityのルールとATT&CKの関係 coverage画面の読み方 表示されないルールもある 色が意味すること、意味しないこと 例:Valid Accountsのセルに色が付いていても 補足:AIシステムの脅威にはMITRE ATLASも使われる まとめ 参考資料 MITRE ATT&CKとは何か MITRE ATT&CKは、実際の攻撃で観測された攻撃者の行動を整理したナレッジベースです。一言でいうと、攻撃者が何を目的に、どのような方法を使うのかをまとめた共通の地図です。 なぜ共通の地図が必要なのでしょうか。製品や組織が違うと、同じ攻撃を別の言葉で説明してしまうからです。ある製品は「不正ログイン」と呼び、別の製品は「アカウント悪用」と呼びます。話しているうちに、同じ話をしているのか違う話をしているのか分からなくなります。 ATT&CKを使うと、製品に依存しない共通の言葉で話せます。 攻撃者は、盗んだクラウドアカウントを使って環境へ侵入した。これは T1078.004: Cloud Accounts に関係する。 この T1078.004 のような番号を ATT&CK ID と呼びます。IDを使えば、チームや製品をまたいでも、同じ攻撃手法について正確に話せます。 なお、ATT&CKにはEnterprise、Mobile、ICS(Industrial Control Systems:工場などの産業制御システム)などの分野があります。この記事で扱うのは、企業のIT環境やクラウド環境を対象にしたEnterprise ATT&CKです。 ATT&CKが並べているのは「行動」 ATT&CKが整理している中心的な対象は、特定のハッシュ値やIPアドレスではなく、攻撃者が行った行動です。 補足として、攻撃者に行動そのものを変えさせるほうが、IPアドレスやハッシュ値を変更させるより難しい、という考え方があります。 Tactic、Technique、Sub-technique ATT&CKには階層があります。最初は、次の3つだけ覚えれば十分です。 階層 階層 例 Tactic(タクティクス) 攻撃者が達成したい目的。「なぜ行うか」 Initial Access Technique(テクニック) 目的を達成するための方法。「どうやるか」 T1078: Valid Accounts Sub-technique(サブテクニック) Techniqueをさらに具体化した方法 T1078.004: Cloud Accounts 具体例で見てみます。攻撃者が、盗んだクラウドアカウントを使って環境へ侵入したとします。 目的:環境へ侵入する → Initial Access 方法:正規のアカウントを悪用する → T1078: Valid Accounts 具体的な対象:クラウドアカウント → T1078.004: Cloud Accounts TacticはWhy、TechniqueはHow、Sub-techniqueはもっと具体的なHowだと考えると、区別しやすくなります。 ATT&CK Matrixは順番表ではない ATT&CK Matrixは、列がTacticになった表です。左から Reconnaissance、Resource Development、Initial Access と並ぶため、攻撃が左から右へ順番に進むように見えます。しかし、実際の攻撃はその順番では進みません。 一部の段階を飛ばす 前の段階へ戻る 同じTechniqueを別の目的で使う 1つのTechniqueが複数のTacticに関係する 例えば T1078: Valid Accounts は、侵入の入口としてのInitial Access、居座るためのPersistence、権限を上げるためのPrivilege Escalationなど、複数のTacticに関係します。同じ「正規アカウントの悪用」でも、攻撃者の目的が違えば置かれる列が変わるということです。 そのためMatrixは、攻撃の決まった手順書ではありません。攻撃者の行動を分類して並べた地図として読むのが適切です。 なぜElastic SecurityでATT&CKを使うのか 理由は、ルール一覧では見えにくいものが見えるようになるからです。ルール一覧はルールを1件ずつ確認する画面です。ATT&CKを使うと、同じルールを攻撃者の行動という軸で並べ替えられます。 セキュリティ運用では、次のような目的で使います。 現在の検知ルールが、どの攻撃手法を対象にしているか確認する 監視できていない領域を見つける 次に収集するログや、追加する検知を検討する ここで大事なのは、ATT&CKが「すべてのマスを埋めるための表」ではないことです。自社に関係する攻撃手法を選び、そこに必要なログ、検知、予防策を考えます。ATT&CKは、そのために使う道具です。 Elastic SecurityのルールとATT&CKの関係 Elastic Securityの検知ルールには、 Threatメタデータ を設定できます。これは、そのルールがどのTactic、Technique、Sub-techniqueに関係するかを示す情報です。 prebuilt rule(Elasticが提供する既製ルール)には、あらかじめATT&CKマッピングが設定されている Custom rule(自組織で作成したルール)には、作成・編集時にAdvanced settingsからマッピングを追加できる 例えば、次の行動を検知するルールがあるとします。 PowerShellを使って、Base64でエンコードされたコマンドを実行する。 このルールには、実際の検知条件(クエリ)だけでなく、関連するATT&CKのTacticやTechniqueも設定されています。Elastic Securityはこのマッピングを読み取り、各ルールをATT&CK Matrix上へ配置します。これが、coverage画面のしくみです。 coverage画面の読み方 Kibanaで次の画面を開きます。ナビゲーションメニューから探すほか、グローバル検索で「MITRE」と入力しても見つかります。 Security >> Detection rules (SIEM) >> MITRE ATT&CK coverage 画面は、大きく4つのパートに分かれています。 フィルター :どのルールを集計に含めるかを決める 検索バー :Tactic名、Technique名、Technique番号、ルール名で絞り込む Legend :セルの色が何件のルールを表すかを示す凡例 グリッド :Tacticの列と、Techniqueのセルが並ぶ本体 Elastic rules(prebuilt rule)、Custom rules(自組織で作成したルール)、またはその両方 :Enabled rules(有効なルール)、Not enabled rules(未有効のルール)、またはその両方 基本的な読み方は次のとおりです。 列 :Tactic セル :Technique セルの濃さ :現在のフィルター条件に一致し、そのTechniqueへマッピングされたルールの数 濃いセルには、条件に一致するルールが多くあります。白いセルには、条件に一致するルールがありません。色の基準は画面上部のLegendで確認できます。 出典:elasticの公式ドキュメント セルには、Technique名と、有効なルールがカバーするSub-techniqueの数が表示されます。Expand cellsを選ぶと、有効なルール数と未有効(Not enabled)のルール数も表示されます。セルをクリックすると、関連するルールやTechniqueの詳細を確認できます。 表示されないルールもある coverage画面に表示されるのは、次の条件を満たすルールだけです。 現在のKibana Space(Kibanaの中で設定を分離できる作業領域)にインストールされている ATT&CKへマッピングされている 画面のフィルター条件に一致している したがって、まだインストールしていないprebuilt ruleや、ATT&CKマッピングを設定していないCustom ruleは表示されません。 なお、coverage画面が参照するATT&CKのバージョンは、Elastic Securityのバージョンによって決まります。MITRE公式サイトとKibanaでTactic名が違って見える場合は、この差が原因です。表示不具合ではありません。 色が意味すること、意味しないこと ここが、この記事でいちばん伝えたい点です。冒頭の不安に戻ります。「セルに色が付いていれば安全なのか」。答えは、いいえです。 coverage画面は、ルールのATT&CKメタデータを使った配置図です。色が付いていても、次のことは何も証明されません。 必要なログが実際に届いている ルールが正常に動いている その攻撃を確実に検知できる 誤検知が少ない Technique全体を網羅している 自組織が安全である 例を挙げます。Windowsのログを必要とするルールをインストールして有効にすれば、対応するセルには色が付きます。しかし、その環境にWindowsログを取り込んでいなければ話は変わります。セルは色付きのままですが、必要なWindowsログが届いていないため、そのルールは期待したアラートを生成できません。 coverage画面から直接分かる中心的な情報は、次のとおりです。 「インストール済みのルールが、ATT&CK Matrixのどのセルに置かれているか。」 言い換えると、coverage画面が答えているのは「このルールは何を狙った検知か」という分類の問いです。「このルールは今ちゃんと動いているか」という実効性の問いには答えません。 反対側も同じです。白いセルは「現在の条件では、そのTechniqueへマッピングされた表示対象のルールがない」ことを示すだけです。ただちにセキュリティ上の欠陥を意味するものではありません。 例:Valid Accountsのセルに色が付いていても Techniqueは大きな分類です。そのため、同じTechniqueへマッピングされた複数のルールが、同じ攻撃を監視しているとは限りません。 T1078: Valid Accounts は、攻撃者が正規のアカウントを悪用するTechniqueです。ただし、正規アカウントの悪用にはさまざまな形があります。 Windowsアカウントで端末へログインする VPNアカウントで社内ネットワークへ接続する AWS IAMユーザーでコンソールへログインする Microsoft 365アカウントでメールへアクセスする これらはすべてValid Accountsに関係します。ただし、必要なログも検知条件もまったく異なります。 自組織が心配している攻撃を、次のように想定します。 → 海外の不審なIPアドレスから、Microsoft 365の管理者アカウントへログインされる。 一方、coverage画面で「Potential Account Takeover – Logon from New Source IP」というルールを見つけたとします。おおまかにいうと、このルールはWindows Security Event Logの成功ログオンを調べ、同じユーザーが普段とは別の送信元IPからログオンしたパターンを探します。 どちらもValid Accountsに関係します。しかし、監視している対象は違います。 確認項目 自組織が心配する攻撃 見つけたルール 対象 Microsoft 365の管理者アカウント Windowsアカウント 必要なログ Entra ID(旧Azure AD)などのサインインログ Windows Security Event Log 結論 クラウド用の検知が必要 Microsoft 365へのクラウドサインインは監視できない このルールをインストールして有効にすると、coverage画面のValid Accountsセルには色が付きます。 しかし、心配していたクラウドアカウントへの攻撃は監視できていません。このルールが見ているのは、Microsoft 365やEntra IDへのクラウドサインインではなく、Windows Security Event Logに記録されたログオンだからです。 そのためATT&CK IDは、関連するルールを探すための入口として使います。最終的な判断は、そのルールがどのログを読むか、どのプラットフォーム向けか、どの行動を怪しいと判断するかを見て行います。 補足:AIシステムの脅威にはMITRE ATLASも使われる MITRE ATLASは、AIや機械学習システムを狙う攻撃者の行動を整理したナレッジベースです。ATT&CKと同じように、攻撃者の目的や手法をTacticとTechniqueで整理しています。扱うのは、モデルの窃取、プロンプトインジェクション、モデルへの不正な操作など、AIシステム特有の脅威です。 Elastic Securityのprebuilt ruleには、ATLASに関連付けられたルールもあります。例えば「Potential Azure OpenAI Model Theft」というルールには Mitre Atlas: T0044 というタグが設定されています。このルールは、Azure OpenAIのモデルが不正に取得・複製される可能性のある操作を監視します。 ATT&CKとATLASの両方に関係するルールもあります。外部ネットワークからOllama APIへ接続されたことを検知するルールには、次の情報が設定されています。 MITRE ATT&CK:Initial Access、External Remote Services、Exploit Public-Facing Application MITRE ATLAS:T0040、T0044 AIシステムへの攻撃であっても、外部公開されたサービスへの侵入という従来のサイバー攻撃と、モデル窃取というAI固有の脅威が重なる場合があるためです。 Add Elastic rules画面でTagsを開き、atlas と検索すると、ATLASに関連するルールを絞り込めます。 まとめ MITRE ATT&CKの基本 ATT&CKは、攻撃者の行動を共通の言葉で整理した地図である TacticはWhy、TechniqueはHow、Sub-techniqueはその具体化を表す Matrixは順番表ではない。1つのTechniqueが複数のTacticに関係する Elastic Securityのcoverage画面 Elastic Securityは、検知ルールのThreatメタデータを読み、ルールをMatrix上へ配置する セルの濃さは、現在の条件に一致するルール数を示す 色が付いていても、必要なログの有無や検知の実効性は保証されない 白いセルは、現在の条件で表示対象のルールがないことを示すにすぎない 同じTechniqueでも、対象プラットフォームや必要なログは違う 冒頭の不安に、あらためて答えます。coverage画面は、守れているかどうかを判定してくれる画面ではありません。「うちの検知は、攻撃者のどのような行動を見ているのか」を共通の言葉で並べてくれる画面です。 まずは、この読み方に慣れることから始めてみてください。読めるようになると、次の一歩、つまりルールを有効にする手順や、白いセルを見つけたあとの確認へ進めます。 参考資料 本記事は、以下の公式ドキュメントに基づいています。 Elastic公式ドキュメント MITRE ATT&CK coverage https://www.elastic.co/docs/solutions/security/detect-and-alert/mitre-attack-coverage Prebuilt rule components https://www.elastic.co/docs/solutions/security/detect-and-alert/prebuilt-rule-components Install and manage Elastic prebuilt rules https://www.elastic.co/docs/solutions/security/detect-and-alert/install-prebuilt-rules MITRE MITRE ATT&CK 公式サイト https://attack.mitre.org/ Enterprise Tactics https://attack.mitre.org/tactics/enterprise/ Enterprise Techniques https://attack.mitre.org/techniques/enterprise/ T1078: Valid Accounts https://attack.mitre.org/techniques/T1078/ MITRE ATLAS https://atlas.mitre.org/ 関連内容 The Pyramid of Pain(David J. Bianco, 2013) https://detect-respond.blogspot.com/2013/03/the-pyramid-of-pain.html The post Elastic Securityを使い始めた人のためのMITRE ATT&CK入門 first appeared on Elastic Portal .
Elastic Stack(ELKスタック)を導入する際、多くのエンジニアが最初に頭を悩ませるのが「データの収集・加工(前処理)に何を使うか」という問題です。 かつては「前処理といえばLogstash」の一択でしたが、Elasticsearchに  Ingest Pipeline  が実装されて以降、その手軽さとパフォーマンスから強力な選択肢となっています。 本記事では、LogstashとIngest Pipelineのアーキテクチャの違い、機能面での優劣、そして「結局どちらを選ぶべきか」の判断基準を技術者視点で解説します。 目次 1. LogstashとIngest Pipelineの概要 Logstash とは? Ingest Pipeline とは? 2. 4つの軸で見る決定的な違い ① 入出力の柔軟性(Inputs & Outputs) ② データの加工・拡充能力(Transformation) ③ 耐障害性とバッファリング(Queueing) ④ インフラ構成と運用コスト 3. 【結論】どちらを選ぶべきか? ユースケース別の推奨 ✅ Ingest Pipeline を選ぶべきケース ✅ Logstash を選ぶべきケース 💡 比較サマリー 💡 ハイブリッド構成(併用)という選択肢も まとめ 1. LogstashとIngest Pipelineの概要 比較に入る前に、それぞれの立ち位置を簡単におさらいしておきましょう。 Logstash とは? データ処理パイプラインを構築するための独立した外部サーバー(コンポーネント)です。豊富なプラグイン(Input / Filter / Output)を備え、多様なデータソースからデータを吸い上げ、複雑な加工を施した上で、Elasticsearchをはじめとする様々な宛先にデータを送信できます。 Ingest Pipeline とは? Elasticsearchのクラスタ内部(Ingestノード)で動作する  前処理機能です。データがElasticsearchにインデックス(格納)される直前に、JSON形式のドキュメントに対して「プロセッサ」と呼ばれる処理を数珠つなぎに適用してデータを加工します。 2. 4つの軸で見る決定的な違い 2つのコンポーネントの特性を、「入出力」「データ加工能力」「耐障害性」「運用コスト」の4つの軸で比較します。 ① 入出力の柔軟性(Inputs & Outputs) Logstash: 圧倒的な柔軟性を持ちます。HTTPやSyslogなどのPush型だけでなく、リレーショナルデータベース(JDBC)やメッセージキュー(Kafka, RabbitMQ)からデータを自発的に取得(Pull)できます。また、加工したデータをElasticsearchに送りつつ、同時にS3へ生ログをアーカイブする、といった マルチ出力 が可能です。 Ingest Pipeline: あくまですべての処理が「Elasticsearchにデータが書き込まれるタイミング」で動作するため、外部へデータを読みに行くことはできません。Beatsやアプリケーションからデータを「Push」してもらう必要があります。また、出力先もパイプラインが動いているElasticsearch自身に限定されます。 ② データの加工・拡充能力(Transformation) Logstash: 条件分岐(if-else)のネストや、Rubyプラグインを用いたコードレベルでの柔軟な記述が可能です。また、処理中に外部のファイルやデータベースを参照してデータを補完(エンリッチ)する処理も得意です。 Ingest Pipeline: Grok、GeoIP、JSONなどの主要なプロセッサが標準搭載されており、一般的なログ(Apache, Nginx, システムログなど)のパースであれば十分すぎる性能を持っています。 enrich  プロセッサを使えばElasticsearch内の別インデックスを参照したデータ拡充も可能ですが、Logstashほど外部システムと密に連携した複雑な加工はできません。 ③ 耐障害性とバッファリング(Queueing) Logstash: 永続的キュー(Persistent Queues)を内蔵しています。Elasticsearch側が一時的なスパイクやメンテナンスでデータを受け付けなくなっても、Logstashがローカルディスクにデータを安全にバッファリングし、データロストを防ぎます。 Ingest Pipeline: 自身にデータを溜めるディスクキューはありません。Elasticsearchのインデキシング負荷が高くなると、データ送信元(Beatsなど)に対して「これ以上送らないでくれ」というバックプレッシャーをかけます。送信元がバッファを持っていない場合、データロストの追跡や再送管理を送信元側で担保する必要があります。 ④ インフラ構成と運用コスト Logstash: 独立したプロセス(JVM)として動くため、メモリやCPUの設計、パッチ当て、監視などの運用コストが上乗せされます。ただし、データ処理の負荷をElasticsearchクラスタから完全に分離できるというメリットもあります。 Ingest Pipeline: 新たにサーバーを構築する必要がありません。KibanaのUIやREST APIからJSON定義を投入するだけで即座にデプロイ・変更が可能です。運用は非常にシンプルになりますが、重いパース処理(複雑なGrokなど)が大量に走ると、Elasticsearch自体のリソース(検索やインデックス性能)を圧迫するリスクがあります。 3. 【結論】どちらを選ぶべきか? ユースケース別の推奨 システム要件や現在の構成に合わせて、インフラエンジニアは以下の基準で選択することをお勧めします。 ✅ Ingest Pipeline を選ぶべきケース 「シンプルさ」と「スピード」を最優先する場合 データソースが  Elastic Agent  や  Beats  に統一されており、直接ElasticsearchにデータをPushできる。 ログの加工要件が、タイムスタンプの整形や不要フィールドの削除、シンプルなGrokパース程度である。 これ以上、管理対象のサーバーやコンポーネント(ミドルウェア)を増やしたくない。 ✅ Logstash を選ぶべきケース 「複雑なパイプライン」や「大規模・多様な環境」を管理する場合 データベース(SQL)やKafka、サードパーティのAPIなど、 多種多様な場所からデータをPullで収集 する必要がある。 受け取ったデータをElasticsearchだけでなく、 S3や別のオブジェクトストレージにも同時にバックアップ したい。 パース処理が非常に複雑で、Elasticsearchの検索・インデックス性能に影響を与えたくない(負荷を分離したい)。 データの突発的なスパイクに備え、堅牢なディスクバッファリング(永続的キュー)が必須である。 💡 比較サマリー 比較項目 Logstash Ingest Pipeline 配置・アーキテクチャ 独立した外部サーバー(JVM) Elasticsearchクラスタの内部(Ingestノード) 入力(データ収集) 自由度:高 (Pull型、Push型、各種DB、MQ対応) 自由度:低 (ElasticsearchへのPushのみ) 出力(データ送信) マルチ出力対応 (ES、S3、Kafka、ファイル等) Elasticsearch内部のみ キュー・バッファリング 内蔵(Persistent Queuesによるデータロスト防止) なし(送信元にバックプレッシャーをかける) 加工・拡充の複雑さ 非常に複雑なロジック、Rubyコード、外部DB参照 単一ドキュメント内の処理、簡単なクラスタ内ルックアップ インフラ管理負荷 高(追加のサーバー管理やチューニングが必要) 低(Elasticsearchの設定としてAPI管理可能) 推奨ユースケース 多種多様なソースからのデータ収集、マルチ出力、複雑なパース処理、負荷分離、高堅牢性が求められる大規模環境。 シンプルさとスピードを優先する場合。Beats/Agent利用時、標準的なログパース、管理コンポーネントを増やしたくない場合。 💡 ハイブリッド構成(併用)という選択肢も 「Logstashで多様なデータソースから収集・バッファリングを行い、Elasticsearchに転送した後の細かいパースはElasticのIntegration(標準のIngest Pipeline)に任せる」という  Logstash ➔ Ingest Pipeline  のハイブリッド構成も、大規模環境では一般的です。 まとめ 手軽さ、運用のしやすさ、標準的なログパース  ➔  Ingest Pipeline マルチ入出力、複雑なロジック、高堅牢性・バッファリング  ➔  Logstash 現代のElastic Stack構築における王道アプローチは、以下の2ステップです。 まずは運用の手軽な  Ingest Pipeline  で要件を満たせるか検討する。 入出力の制限やパースの複雑さ、インフラ分離の必要性が出てきた段階で  Logstash  の導入、あるいは併用へとステップアップする。 自社のインフラ規模やログの特性に合わせて、最適なデータパイプラインを選択しましょう! The post Elasticのデータ前処理、どっちを選ぶ? Logstash vs Ingest Pipeline 徹底比較 first appeared on Elastic Portal .
Elasticsearchのデータ移行やバックアップを、スナップショット機能を使わずに「もっと手軽に、インデックス単位でサクッと行いたい」と思ったことはありませんか? そんなエンジニアの強い味方になるのが、オープンソースのCLIツール  elasticsearch-dump  (通称:elasticdump)です。 今回は、このツールの基本的な使い方から、実務で役立つ一歩進んだテクニックまでを解説します。 Elasticsearch を運用していると、以下のようなシーンに直面することがよくあります。 開発環境(Develop)の特定のインデックスだけを、ステージング環境(Staging)にサクッとコピーしたい インデックスの「マッピング」や「アナライザー」の設定だけを抽出して使い回したい ローカルファイル(JSON/CSV)にデータを退避させたい これらをGUIや面倒なAPIリクエストなしに、 使い慣れたCLIコマンド一発で解決してくれる のが、今回紹介する elasticsearch-dump です。 目次 1. elasticsearch-dumpとは? 2. クイックスタート:インストール方法 2.1. Node.js環境の用意 2.2. npmによるインストール 3. 基本的な使い方とユースケース 3.1. ユースケース①:開発環境からデータをダンプ 3.1.1. マッピング(構造定義)をダンプ 3.1.2. ドキュメントデータ(実データ)をダンプ 3.2. ユースケース②:特定のデータだけを絞り込んでダンプする(searchBody) 4. 知っておくと便利な一歩進んだ応用テクニック 4.1. データの移行中にオンザフライで変換をかける(–transform) 5. ダンプしたデータのリストア 5.1. マッピングの作成 5.1.1. ローカルで my_index_mapping.json を開く 5.1.2. インデックス名( “my_index” )の階層を除外してコピーする 5.1.3. Kibana Dev Tools (Console) で実行する 5.2. データの登録 5.2.1. _bulk 用の ndjson への変換 5.2.2. Kibana Dev Tools (Console) で実行する 6. まとめ:どんな時に使うべきか? 7. 参考リンク 1. elasticsearch-dumpとは? elasticsearch-dump  は、Elasticsearchのインデックスデータをインポート/エクスポートするためのNode.js製ツールです。[^1] 1 最大の特徴は、「 --input (入力元)から、 --output (出力先)へデータをストリーミングして送る」という極めてシンプルな設計にあります。 入力元と出力先には、ESのURLだけでなく、ローカルのJSON/CSVファイルや、標準入出力(stdin/stdout)、さらにはAWS S3なども直接指定できます。 2. クイックスタート:インストール方法 今回検証した環境は以下の通りです。 OS : Windows 11 (PowerShell) Node.js : v24.18.0 jq : 1.8.2 2.1. Node.js環境の用意 Node.js 公式サイト  よりインストーラーをダウンロードし、インストールします。 ※ホスト環境にNode.jsをインストールしたくない場合は、公式のDockerイメージを利用する方法もありますが、ここでは説明を割愛します。 2.2. npmによるインストール npmを使ってグローバル(またはローカル)にインストールします。 # グローバルインストール npm install elasticdump -g 💡  Windowsでのインストール先について  Windows環境でグローバルインストール( -g )した場合、一般的には下記のパス配下に配置されます。[^2] 2 C:\Users\<ユーザー名>\AppData\Roaming\npm 3. 基本的な使い方とユースケース elasticdump は主に「Analyzer(アナライザー)」「Mapping(マッピング)」「Data(ドキュメントデータ)」の3つのフェーズ( --type )に分けて処理を行います。 (ここでは Analyzer フェーズは省略します。また、–type には settings や policy, alias, template なども指定可能です。詳細は、公式ページを参照してください。) 3.1. ユースケース①:開発環境からデータをダンプ データを JSON 形式でダンプします。通常は「mapping ➔ data」の順にダンプします。 3.1.1. マッピング(構造定義)をダンプ # PowerShellでの実行例(改行は「`」を使用) elasticdump ` --input=http://elasticuser:elasticpassword@develop.es.com:9200/my_index ` --output=my_index_mapping.json ` --type=mapping ⚠️  HTTPS環境(自己署名証明書など)でTLSエラーが出る場合  ElasticsearchがHTTPSでリクエストを受け付けており、証明書エラーが発生する場合は、一時的にTLS検証を無視する環境変数を設定してからコマンドを実行してください。[^3] 3 # PowerShellでの実行例 $env:NODE_TLS_REJECT_UNAUTHORIZED="0" elasticdump ` --input=https://elasticuser:elasticpassword@develop.es.com:9200/my_index ` --output=my_index_mapping.json ` --type=mapping 3.1.2. ドキュメントデータ(実データ)をダンプ elasticdump ` --input=http://elasticuser:elasticpassword@develop.es.com:9200/my_index ` --output=my_index_data.json ` --type=data 💡  Note : 出力ファイルフォーマットは「行区切りのJSON(Line-delimited JSON / NDJSON)」です。ファイル全体が1つの巨大なJSON配列ではないため、ストリーム処理に適しており、メモリ消費を最小限に抑えられます。 3.2. ユースケース②:特定のデータだけを絞り込んでダンプする(searchBody) 「管理者のログだけを抽出したい」「特定の期間のデータだけをバックアップしたい」という場合は、 --searchBody  オプションにElasticsearchのクエリ(DSL)を指定できます。 elasticdump ` --input=http://elasticuser:elasticpassword@develop.es.com:9200/my_index ` --output=my_index_filtered_data.json ` --type=data ` --searchBody='{\"query\":{\"term\":{\"username\":\"admin\"}}}' ※クエリが複雑な場合は、別ファイル(例: search_body.json )に切り出して、 @  接頭辞を用いて読み込ませることも可能です。 ./search_condition/search_body.json { "query": { "term": { "username": "admin" } } } elasticdump ` --input=http://elasticuser:elasticpassword@develop.es.com:9200/my_index ` --output=my_index_filtered_data.json ` --type=data ` --searchBody=@./search_condition/search_body.json 4. 知っておくと便利な一歩進んだ応用テクニック 4.1. データの移行中にオンザフライで変換をかける(–transform) 移行のタイミングで「特定の個人情報フィールドをマスクする」「新しいフィールドを追加する」といった簡易的なETL(Extract/Transform/Load)処理が可能です。 JavaScriptでドキュメントの操作関数を定義しておき、それを呼び出します。 ./transforms/anonymize.js module.exports = function (doc, options) { if (doc._source.email) { // メールアドレスのドメイン部分だけ残してマスクする例 doc._source.email = "anonymized@" + doc._source.email.split('@')[1]; } }; # トランスフォーム用スクリプトを指定して実行 elasticdump ` --input=http://elasticuser:elasticpassword@develop.es.com:9200/my_index ` --output=my_index_transformed_data.json ` --type=data ` --transform=@./transforms/anonymize.js 5. ダンプしたデータのリストア リストア先の環境で  elasticdump  や  curl  を利用できる場合は、それらを利用してリストアするのが簡単ですが、それらを利用できない場合には、ダンプした JSON ファイルを加工して、Dev Tools の Console からデータを投入します。 既存データを壊さないように、必ず  mapping ➔ data  の順でリストアします。 5.1. マッピングの作成 5.1.1. ローカルで my_index_mapping.json を開く エクスポートされたマッピングファイルは、一般的に以下のように「インデックス名」をルートキーに持つ構造になっています。 { "my_index": { "mappings": { "properties": { "title": { "type": "text" }, "price": { "type": "float" } } } } } 5.1.2. インデックス名( “my_index” )の階層を除外してコピーする Kibana Console でインデックスを新規作成する際、宛先インデックス名は URL パス( PUT /<インデックス名> )で指定するため、JSON 内の  "my_index": { ... }  という外枠(ラッパー)は不要です。 内側の  { "mappings": { ... } }  のブロックだけをコピーします。 5.1.3. Kibana Dev Tools (Console) で実行する Kibana の Dev Tools Console を開き、以下のようにリクエストを記述して実行(再生マークのボタンをクリック)します。 PUT /my_index { "mappings": { "properties": { "title": { "type": "text" }, "price": { "type": "float" } } } } 5.2. データの登録 5.2.1. _bulk 用の ndjson への変換 jq コマンドを jqのダウンロードサイト からダウンロードします。 jq コマンドをダウンロード後、my_index_data.json を _bulk  用の ndjson に加工します。 PowerShell と jq の文字コードの相性が悪いので、コマンドプロンプトを経由して jq を実行します。 (jqの実行ファイル名が jq-windows-amd64 の場合) cmd /c 'jqのインストールディレクトリ\jq-windows-amd64 -c "{\"index\":{\"_index\":\"my_index\",\"_id\":._id}}, ._source" my_index_data.json > bulk_formatted.ndjson' 5.2.2. Kibana Dev Tools (Console) で実行する Kibana Dev Toolsで以下のように  POST _bulk  を記述し、その後に続けて  bulk_formatted.ndjson  の内容を貼り付けて実行します。 POST _bulk { "index" : { "_index" : "my_index", "_id" : "1" } } { "title" : "...", "price" : ... } ... 6. まとめ:どんな時に使うべきか? Elasticsearch公式のスナップショット機能(Snapshot/Restore)は非常に強力ですが、S3などの共有リポジトリの登録が必要だったり、クラスタ全体の移行になりがちで、少々「重厚」です。 それに対して、  elasticsearch-dump  は以下のようなシチュエーションで抜群の機動力を発揮します。 開発環境と検証環境間で、数万〜数百万件程度の特定データをパパッと持ち運びたい スキーマ定義(マッピング)だけを手元でバージョン管理したい スナップショットの設定権限がない(AWS OpenSearch Serverless など制限のある環境を含む) 手元の開発環境に一つ入れておくだけで、データ運用の生産性が劇的に向上するおすすめのツールです。ぜひ皆さんのプロダクト運用や開発プロセスにも組み込んでみてください! 7. 参考リンク elasticsearch-dump GitHub公式リポジトリ 実行には事前に Node.js(npm)の実行環境が必要になります。 ↩︎ Windowsのユーザー環境によって、”AppData” フォルダは隠しフォルダになっている場合があるため、エクスプローラーの「表示」設定で「隠しファイル」にチェックを入れてアクセスしてください。 ↩︎ この設定はSSL/TLSの証明書検証を無効化するため、本番環境の公開ネットワーク等で実行する際はセキュリティリスクを考慮し、一時的な利用に留めてください。 ↩︎ The post 【保存版】elasticsearch-dumpで実現する、Elasticsearch の超柔軟なデータ移行・バックアップ手法 first appeared on Elastic Portal .
注意 本記事は、実際のSplunk本番環境を使った移行試験ではありません。Splunkのsaved searchエクスポートを想定したダミーJSONを使い、Automatic Migrationの仕組み、操作、結果の読み方を確認した検証です。 目次 はじめに 最初に知っておきたい用語 LLM ELSER ES|QLとEQL Splunk saved search Splunk CIMとElastic ECS 必要条件と検証環境 必要条件 Match to Elastic prebuilt rules」をOFFにすればML不要か 検証環境 始め方:画面操作の流れ Automatic Migrationの処理フロー 全体像 prebuilt rule matchingの仕組み LLM翻訳とdeterministic validation 検証用の3ルール Case A:PowerShell encoded command Case B:Multiple failed logins Case C:Proxy+macro+lookup アップロード:ファイル形式とmacro/lookupの検出 JSON配列では失敗し、NDJSONで成功 macroとlookupの不足を自動検出 実行と結果サマリー TranslateからStartまで 結果 Serverlessで発生したELSERエラーと切り分け 発生したエラー 切り分けの手順と結果 言えること、言えないこと 3つの結果を読み解く Case B:Failed Loginは既存Elastic ruleへ置き換わった Case A:PowerShellはcustom ES|QL ruleになった Case C:Proxy ruleはPartially translated Rule・Data source・Integration・ECSの関係 インストールからEnableまでのレビュー手順 本番移行前に棚卸しするSplunk資産 まとめ:Automatic Migrationの価値 参考資料 はじめに Splunkで運用してきた検知ルールをElastic Securityへ移すとき、大きな労力を占めるのがルールの書き直しです。Elastic Securityには、この作業をAIで支援するAutomatic Migrationという機能があります。 本記事では、性質の異なる3つのダミーSplunkルールを用意し、Automatic Migrationがそれぞれをどう処理するかを確認しました。読み終えると、次のことが分かります。 Automatic Migrationが裏側で何をしているか(意味検索、AI翻訳、構文検証) 翻訳結果(TranslatedやPartially translated)の正しい読み方 移行前に棚卸しすべきSplunk資産と、ルール有効化前のレビュー観点 Elastic側の用語は、本文中で順に説明します。では、始めましょう。 最初に知っておきたい用語 Automatic Migrationの画面には、SplunkとElasticの用語に加えて、AI/機械学習の用語も登場します。先に最低限の意味を整理します。 本文で繰り返し登場する2つのElastic用語を、最初に押さえておきましょう。 prebuilt rule :Elasticがあらかじめ用意している検知ルールです。Elastic自身が作成・保守しているため、Elastic-authored ruleとも呼ばれます。本記事では、画面の表記に合わせて両方の呼び方を使います。 Elastic Integration :データソースごとに用意された取り込みパッケージです。ログの収集設定、パース、後述するECSへのマッピング、ダッシュボードがひとまとめになっています。本記事では「このruleを動かすには、このIntegrationでデータを取り込む必要がある」という文脈で登場します。 LLM Large Language Model(大規模言語モデル)の略です。Automatic Migrationでは、Splunkルールの意図の理解、prebuilt rule候補の評価、SPLからES|QLへの翻訳、macroの展開、構文エラーの修正、CIMフィールドからECSフィールドへの対応づけを担当します。 今回のServerless環境では、事前設定済みのAnthropic Claude Sonnet 4.6が選択されていました。これは今回の環境で選ばれていたモデルであり、Automatic Migrationの必須モデルではありません。必要なのは、サポート対象の動作可能なLLM Connectorです。 ELSER ELSERはElastic Learned Sparse EncodeRの略で、Elasticが提供する意味検索用モデルです。 通常のキーワード検索は、同じ単語が含まれているかを重視します。意味検索は、表現が違っても「何を検知したいルールなのか」が近いものを探します。 Automatic Migrationでは、まずElastic prebuilt rules側をELSERで意味検索できる索引にしておきます。検索するときは、Splunkルールから抽出したキーワードをクエリとしてこの索引に投げ、意味の近いprebuilt rule候補を探します。つまり、索引化されるのはprebuilt rulesで、検索の起点になるのはSplunkルールです。 例を挙げます。 Splunk側:Multiple Failed Logins From Same User Elastic側:Potential External Linux SSH Brute Force Detected 名前は一致していませんが、どちらも認証失敗の繰り返しを扱います。Automatic Migrationは、このような候補を文字列の完全一致に頼らずに探せます。ただし、意味が近いことと検知ロジックが同じことは別です。今回も閾値や時間条件は大きく異なっていました(詳細は8.1節)。 ES|QLとEQL ES|QLはElasticsearch Query Languageの略です。パイプ(|)で処理をつなぎ、Elasticsearch内のデータを検索、絞り込み、集計、変換します。 FROM logs-* | WHERE event.category == "process" | KEEP @timestamp, host.name, process.name | SORT @timestamp DESC 上から順に、FROM(どのindex/data streamを検索するか)、WHERE(どの行を残すか)、KEEP(どの列を残すか)、SORT(どう並べるか)と読みます。ES|QL detection ruleでは、原則として最終結果テーブルの各行がアラート候補になります。 EQLはEvent Query Languageで、イベントの順序や連続した動きを表現するのに向いています。重要なのは、Automatic MigrationがすべてをES|QL ruleへ置き換えるわけではないことです。新しく生成するcustom ruleはES|QLになりますが、Elastic-authored ruleへマッピングした場合は、その既存ruleの種類(今回はEQL)をそのまま使います。 Splunk saved search Splunkで保存されたSPL検索です。単なる検索条件の保存だけでなく、定期実行するreport、条件一致時に通知するalert、Splunk Enterprise Securityのcorrelation searchにも使われます。Automatic Migrationの画面では、Splunk rulesをsaved searchesとしてエクスポートして持ち込みます。 Splunk CIMとElastic ECS CIMはCommon Information Modelの略です。ベンダーごとに異なるログのフィールド名を、Splunk内で共通のフィールド名やデータモデルへ正規化する考え方です。ECSはElastic Common Schemaの略で、同じ意味の情報をElastic全体で共通フィールドへそろえます。 Splunk側のフィールド Elastic ECS process_name process.name CommandLine process.command_line src_ip source.ip user user.name Automatic Migrationは、CIMに近いSplunkフィールドをECSへマッピングしようとします。適切なECSフィールドを判断できない場合は、元のフィールド名が残ることもあります。 必要条件と検証環境 必要条件 ルール移行の裏側では、主に3種類の処理が協力します。LLM(ルールの理解、SPLからES|QLへの翻訳、候補ruleの判断)、ELSER/Machine Learning(prebuilt ruleやIntegrationの意味検索)、Elasticsearchの構文検証(生成されたES|QLが文法上有効かの確認)です。 公式ドキュメントで案内されている主な条件は次のとおりです。 Security > SIEM migrationsに対するAll権限 Security > Rules, Alerts, and Exceptionsに対する少なくともRead権限 動作するLLM Connector ServerlessではSecurity Complete subscription Elastic StackではEnterprise subscription Elastic Stack/Elastic CloudではMachine Learningが有効であること Elastic CloudではML zoneあたり4GB RAM以上を推奨 今回、最初にローカルの小規模3ノード環境で試したところ、ELSERのdeploymentに必要なML容量を確保できませんでした。 Failed to populate ELSER indices Could not start deployment because no ML nodes with sufficient capacity were found そのため、MLインフラをElastic側が管理するServerlessへ移しました。 Match to Elastic prebuilt rules」をOFFにすればML不要か Match to Elastic prebuilt rulesをOFFにすると、各Splunk ruleは既存のprebuilt ruleへマッピングされず、新しいcustom ruleとして翻訳されます。公式ドキュメントにも、OFFの場合は各ruleをcustom ruleへ変換すると説明されています。 ただし、これを理由に「ELSERやMachine Learningが不要になる」とは断定できません。公式要件では、Elastic StackとElastic CloudでAutomatic Migrationを使うにはMachine Learningの有効化が必要です。また、公式の処理説明では、prebuilt rule matchingに加えて、翻訳対象ruleに必要なIntegration候補を探す処理でも意味検索を使います。 なお、今回の検証ではprebuilt rule matchingをONにしていたため、OFFにした場合の内部挙動は実測していません。ここは未検証です。 検証環境 項目 内容 Elastic環境 Elastic Security Serverless 機能/UI世代 9.4系相当(検証日:2026-07-14。Serverlessは継続更新のためバージョン固定なし) AI Provider Elastic提供の事前設定済みConnector 選択されたLLM Anthropic Claude Sonnet 4.6 ELSER .elser_model_2_linux-x86_64 Splunk環境 なし 入力データ saved searchエクスポートを想定したダミーNDJSON(1行1JSON形式。5章参照) ルール数 3 インストール方法 Install without enabling(無効状態でのインストール。10章参照) 始め方:画面操作の流れ 実際に検証で行った操作を、画面の順に示します。細かい意味は後の章で説明するので、まずは全体の流れをつかんでください。 Elastic SecurityのLaunchpadで、Migrations > Manage automatic migrations を開きます。上部の検索バーで「Automatic Migrations」と検索しても移動できます 2. Configure AI Provider でLLMを確認します。今回はElastic提供のconnector(Claude Sonnet 4.6)が事前設定済みで、Completedと表示されていました 3. Migrate your existing SIEM rules to Elastic を開き、Upload rules をクリックします 4. Select migration sourceを Splunk に設定します 5. Migration nameを入力します。自動生成されたデフォルト名のままでも進められます 6. Export rulesに表示されるクエリは、実環境でSplunkからsaved searchをエクスポートするためのものです。今回はSplunkを使わないため、ダミーのNDJSONをそのままアップロードします 7. アップロード後、macroとlookupの追加アップロードを求められます。今回は不足時の挙動を確認するため、あえてスキップしました 8. Translate を押すとMigrate rulesダイアログが開きます。AI connectorを確認し、 Match to Elastic prebuilt rules のトグルをオン(デフォルトでオン)のままTranslateをクリックします 9.「Preparing environment for the AI powered translation」という準備中の画面になります 10. 準備が終わると「Migration of 3 rules is created and ready to start.」と表示されるので、 Start を押します 11. もう一度同じダイアログが開きます。トグルをオンのままTranslateを押します 12. 再び準備中になり、翻訳処理が進みます 13. 今回はELSERエラーの表示が残ったものの、翻訳は完了し、Translation SummaryにTranslated 2件・Partially translated 1件と表示されました。 View rules から結果の一覧へ進みます エラーの切り分けは7章、結果の読み方は8章で説明します。 Automatic Migrationの処理フロー 全体像 Splunkからsaved search(rule本体)をエクスポート | v ruleをアップロード (macro、lookup、MITRE情報は別の資産。  必要に応じて別途エクスポートし、追加アップロードする) | v 似たElastic-authored ruleを検索 | +-- 十分に近い候補あり | | | +--> 既存Elastic ruleへマッピング | +-- 適切な候補なし | +--> macroを展開 +--> lookupを取り込む +--> 必要なIntegrationを検索 +--> SPLをES|QLへ翻訳 +--> 構文検証 +--> CIM fieldをECS fieldへマッピング prebuilt rule matchingの仕組み Elasticの公式ブログでは、概ね次の流れが説明されています。 Elastic prebuilt rulesをELSERで意味検索可能な表現にする LLMがSplunkルールから重要なキーワードを生成する そのキーワードでprebuilt rulesを意味検索する 候補をLLMへ渡す LLMが、同一または非常に近いruleかを判断する 近い場合はElastic-authored ruleとして結果へ追加する 今回のSSH brute forceルールがマッピングされたことは、推測ではありません。詳細画面に次のメッセージが表示されました。 This rule was mapped to an Elastic authored rule. ただし、これは「元のルールと論理的に完全一致した」という意味ではありません。採用された候補を、元のSPLと横に並べて確認する必要があります。 LLM翻訳とdeterministic validation LLMは柔軟にクエリを生成できますが、常に正しい文法を出すとは限りません。そこでAutomatic Migrationは、生成したES|QLをElasticsearchの構文解析へ渡して検証します。 LLMがES|QLを生成 | v Elasticsearchが構文を検証 | +-- 正常 -> 翻訳結果として保存 | +-- エラー -> エラー内容とクエリをLLMへ返す | +--> LLMが修正して再試行 公式ブログでは、この修正ループを最大3回実行すると説明されています。ここでいうdeterministic(決定的)は、「別のAIが良さそうか判断する」という意味ではありません。LLMは同じ入力でも実行のたびに違う答えを返すことがあります。一方、構文検証を行うのは、ES|QLの文法規則を実装したプログラム(パーサー)です。コンパイラと同じで、同じクエリ文字列を渡せば何回実行しても同じ判定を返します。たとえば、存在しないコマンド名を書けば毎回同じ構文エラーが返り、列名の綴りを誤れば毎回同じ「Unknown column」エラーが返ります。この「同じ入力には毎回同じ判定」がdeterministicの意味です。 構文が正しくても、正しいindexを見ているか、必要なフィールドがあるか、閾値が適切かまでは保証されません。 検証用の3ルール 3種類の挙動を確認できるよう、性質の異なるルールを用意しました。 Case A:PowerShell encoded command {"preview":false,"offset":0,"result":{"id":"https://dummy-splunk.example.local:8089/servicesNS/nobody/search/saved/searches/Suspicious%20PowerShell%20Encoded%20Command","title":"Suspicious PowerShell Encoded Command","search":"index=windows sourcetype=WinEventLog:Security EventCode=4688 process_name=\"powershell.exe\" (CommandLine=\"*-enc*\" OR CommandLine=\"*-EncodedCommand*\")","description":"Detects suspicious PowerShell execution using encoded command options.","action.escu.eli5":"","action.correlationsearch.annotations":"","alert.severity":"4"}} 確認したいのは、SPLからES|QLへ変換できるか、SplunkフィールドがECSへ置き換わるか、Event ID 4688の前提が維持されるか、prebuilt ruleへマッピングされるかです。 Case B:Multiple failed logins {"preview":false,"offset":1,"result":{"id":"https://dummy-splunk.example.local:8089/servicesNS/nobody/search/saved/searches/Multiple%20Failed%20Logins%20From%20Same%20User","title":"Multiple Failed Logins From Same User","search":"index=auth sourcetype=linux_secure action=failure | stats count by user, src_ip | where count > 5","description":"Detects multiple failed login attempts from the same user and source IP.","action.escu.eli5":"","action.correlationsearch.annotations":"","alert.severity":"3"}} 確認したいのは、statsとwhereを含むSPLをどう扱うか、似たprebuilt ruleへマッピングされるか、元の閾値と時間条件が維持されるかです。 Case C:Proxy+macro+lookup {"preview":false,"offset":2,"result":{"id":"https://dummy-splunk.example.local:8089/servicesNS/nobody/search/saved/searches/Proxy%20Access%20To%20Suspicious%20Domains%20By%20Finance%20Users","title":"Proxy Access To Suspicious Domains By Finance Users","search":"index=proxy sourcetype=bluecoat:proxysg `suspicious_domains` | lookup internal_users user OUTPUT department | where department=\"finance\"","description":"Detects proxy access to suspicious domains by finance users.","action.escu.eli5":"","action.correlationsearch.annotations":"","alert.severity":"4"}} このルールには、Splunk固有の依存が2つあります。 macro : suspicious_domains の部分です。Splunk search macroは再利用可能なSPLの断片で、バッククォートで囲んで参照します。ルール本文にはmacro名しかなく、実際の条件は別のmacro定義に保存されています。 lookup : | lookup internal_users user OUTPUT department の部分です。Splunk lookupは、イベント内の値を外部表と照合し、追加フィールドを付けます。外部表にはCSVファイルのほか、KV Storeを使えます。KV StoreはSplunkに内蔵されたkey-value型のデータベースで、CSVより大きなデータや頻繁に更新するデータの保存先に向きます。 つまりこのルールは、文法だけでなく、別管理されている依存資産(macroの展開内容、lookup definitionと実データ)がないと意味を完全に解釈できません。 アップロード:ファイル形式とmacro/lookupの検出 JSON配列では失敗し、NDJSONで成功 最初は通常のJSON配列を作りましたが、今回のアップロードには失敗しました。Splunkの検索結果エクスポートに近い、1行1JSONのNDJSON形式へ変更すると成功しました。 {"preview":false,"offset":0,"result":{...}} {"preview":false,"offset":1,"result":{...}} {"preview":false,"offset":2,"result":{...}} これは「必ずNDJSONしか受け付けない」と断定する結果ではありません。今回のダミーデータでは、Splunkが出力する検索結果の構造へ近づける必要があった、という観測です。実環境では、Automatic Migration画面に表示されるSplunk用エクスポートクエリを使って結果をJSONで出力するのが安全です。対象が多い場合は、LLMのcontext window(一度に読み込める入力量の上限)を超えないよう複数ファイルへ分割できます。 macroとlookupの不足を自動検出 ruleファイルをアップロードすると、Automatic MigrationはCase Cのmacroとlookupを検出し、追加アップロードを求めました。不足したまま処理を続けることもできますが、その依存情報が必要なruleはPartially translatedになる可能性があります。 今回は不足時の挙動を見るため、あえて追加せずに進めました。実案件の視点では、これは重要な示唆です。saved searchだけでなく、macroやlookupも一緒に棚卸ししないと正確な移行は難しい、ということを画面が教えてくれます( 11章 )。 実行と結果サマリー TranslateからStartまで 9.4系相当の今回のUIでは、Upload画面でTranslate、Migration作成後にStartという2段階に見えました。Translateを押すと「Preparing environment for the AI powered translation」と表示され、数分後に次のメッセージが出ました。 Migration of 3 rules is created and ready to start. Startを押すと処理が始まります。公式ドキュメントでは操作がTranslateとしてまとめて説明される場合があります。UIのボタン名や段階はリリースで変わる可能性があるため、本記事では今回観測した画面を記録しています。 結果 合計実行時間は12分でした。3件だけでも初回準備を含めると時間がかかるため、本番の大量移行では事前検証とバッチ分割を考える必要があります。 Status 件数 Translated 2 Partially translated 1 Not translated 0 Failed 0 ここで重要なのは、Translatedに2種類の結果が含まれることです。公式ドキュメントでも、Translatedは「Elastic-authored ruleにマッピングされたルール」と「AIで新規翻訳されたルール」の両方を含むと定義されています。一覧のAuthor列で見分けられます。 Author 意味 Elastic Elastic-authored ruleへマッピング(自動更新の対象) Custom Automatic Migrationがcustom ruleを生成(利用者側で維持・調整) Integrations列は、ruleを動かすために必要と判断されたElastic Integration数を示します。0/1は、必要なIntegrationが1つあり、現在利用可能なものが0という読み方です。 Serverlessで発生したELSERエラーと切り分け 発生したエラー Startの後、次のエラーが表示されました。 Migration initialization failed. Error: Failed to populate ELSER indices. Make sure the ELSER model is deployed and running at Machine Learning > Trained Models. ConnectionError: Connection closed while reading the body ローカル環境ではML容量不足が原因でしたが、今回はServerlessです。Serverlessでは学習済みモデルのautoscalingが常に有効なため、単純な容量不足とは限りません。そこで順に切り分けました。 切り分けの手順と結果 Trained Modelsで確認 :Machine Learning > Trained Modelsでは、ELSER(.elser_model_2_linux-x86_64)がDeployedでした。 Dev Toolsでdeploymentを確認 :Dev Toolsは、KibanaからElasticsearchのAPIを直接実行できる画面です。 GET _ml/trained_models/.elser_model_2_linux-x86_64/_stats { "deployment_stats": { "deployment_id": ".elser-2-elasticsearch", "state": "started", "allocation_status": { "allocation_count": 1, "target_allocation_count": 1, "state": "fully_allocated" } } } deploymentはstartedで、allocationはfully_allocated、failure countは0でした。追加のStart deploymentを押す必要はありません。 ELSERへ直接推論 : POST _ml/trained_models/.elser_model_2_linux-x86_64/_infer { "docs": [ { "text_field": "Suspicious PowerShell encoded command execution" } ] } 多数のtokenとweightが返り、ELSER単体の推論は成功しました。 言えること、言えないこと ここまでで言えるのは、ELSERモデルが存在しない問題ではないこと、deploymentが停止していたわけでもないこと、ELSER単体の推論は可能なことの3点です。 一方、どの時点で接続が閉じたか、ELSER index populationが何割完了したか、自動再試行があったかは、UIからは断定できません。実際には、赤いエラー表示が残った一方で、1件のprebuilt rule mappingを含む翻訳結果が生成されていました。エラー発生前に候補検索が完了していたのか、バックグラウンドで一部が完了したのか、UIに過去のエラーが残っただけなのかは、この検証だけでは確定できません。 同じエラーが繰り返される場合は、project名、migration名、実行時刻、完全なエラーメッセージ、ELSERのstats、直接推論の成否、変換結果の有無を記録して、Elastic Supportへ相談するのが現実的です。 3つの結果を読み解く Case B:Failed Loginは既存Elastic ruleへ置き換わった 変換前: index=auth sourcetype=linux_secure action=failure | stats count by user, src_ip | where count > 5 変換後: Potential External Linux SSH Brute Force Detected Author: Elastic Rule type: Event Correlation (EQL) 既存ruleへのマッピングにより、Elasticが作成した説明、MITRE ATT&CK(攻撃者の戦術・手法を整理した業界標準のフレームワーク)への対応づけ、Investigation guide、Setup guide、Related integrations、Required fields、severity/risk score、scheduleをそのまま利用できます。ゼロからruleを書くのではなく、Elasticが用意した運用情報を再利用できる点が大きな利点です。 ただし、検知ロジックは元ルールと大きく異なります。 比較項目 元のSplunkルール マッピング先Elastic rule 失敗回数 5回超 60回 時間窓 SPL内に明示なし 30秒 対象 一般的なauth failure Linux SSH 送信元 制限なし 外部IPに限定 grouping user, src_ip host.id, source.ip, user.name Rule type statsベース EQL sequence このマッピングの価値は「候補探しの自動化」にあります。実際の移行では、Elasticの多数のprebuilt rulesから人が1件ずつ似たruleを探すことになります。Automatic Migrationを使えば、ゼロからルールを探すのではなく、提示された候補が元ルールの目的を満たすかの比較から始められます。 インストール前の判断は、次のように整理できます。 判断 対応 目的と条件が十分近い Install without enabling → 実データで検証 → Enable 目的は近いが閾値が違う Install後にruleを調整し、テスト 目的が違う mappingを採用せず、prebuilt matchingをOFFにしてcustom translationを再実行、または手動作成 Case A:PowerShellはcustom ES|QL ruleになった 変換前: index=windows sourcetype=WinEventLog:Security EventCode=4688 process_name="powershell.exe" (CommandLine="*-enc*" OR CommandLine="*-EncodedCommand*") 変換後: FROM logs-endpoint.action.responses-*,logs-endpoint.actions-*,logs-endpoint.alerts-*,logs-endpoint.events.api-*,logs-endpoint.diagnostic.collection-*,logs-endpoint.events.device-*,logs-endpoint.events.file-*,logs-endpoint.heartbeat-*,logs-endpoint.events.library-*,logs-endpoint.events.network-*,logs-endpoint.events.process-*,logs-endpoint.events.registry-*,logs-endpoint.events.security-* | WHERE event.category == "process" AND event.type == "start" AND TO_LOWER(process.name) == "powershell.exe" AND (process.command_line LIKE "*-enc*" OR process.command_line LIKE "*-EncodedCommand*") | KEEP @timestamp, host.hostname, user.name, process.name, process.pid, process.command_line, process.executable, process.parent.name, process.parent.executable | SORT @timestamp DESC | LIMIT 100 event.categoryとevent.typeはどこから来たか :ECSでは、イベントを大きな種類へ分類します。event.category == “process”はプロセスに関するイベント、event.type == “start”は開始イベントです。元SPLの文字をそのまま置換したのではなく、Elastic側のデータモデルに合わせて検知意図を表現し直しています。 なぜEvent ID 4688が消えたか :変換後にはevent.code == “4688”がなく、FROMがlogs-endpoint.*を検索しています。これは、Windows Security Logの4688を探すruleから、Elastic Defendが収集するEndpointプロセスイベントを探すruleへ、意味的に書き換えられたことを示します。因果関係に注意してください。4688が消えたからElastic Defendが必要なのではありません。生成されたクエリのdata sourceがlogs-endpoint.*になったため、そのデータを出す候補としてElastic Defendが必要と判断され、結果として4688条件が使われなくなった、という順序です。 なお、Windows Security Event ID 4688は新しいプロセスの作成時に記録される監査イベントです。command lineを4688に含めるには、WindowsのInclude command line in process creation eventsポリシーを有効にする必要があり、デフォルトでは空になることがあります。 このES|QLをそのまま有効化してよいか :修正と検証が必要です。確認すべき点は5つあります。 データソースの前提が変わった :組織がWindows Security Logを取り込む設計なら、event.code == “4688”と実際のWindows data streamを使うruleの方が自然です。Elastic Defendを導入済みなら、この変換は合理的です。 LIKEはcase-sensitive :ES|QLのLIKEは大文字・小文字を区別するため、-ENCを見逃す可能性があります。 TO_LOWER(process.command_line) LIKE "*-enc*" が改善候補です。-eや-enといったさらに短い省略形まで対象にするかは、検知方針と誤検知を見て決めます。 FROMが広い :プロセスイベントだけが必要なら、 FROM logs-endpoint.events.process-* まで絞れます。実際に使うdata streamをDiscover(Kibanaでデータを対話的に検索・閲覧できる画面)で確認してから変更します。なお、data streamは時系列データを格納するElasticsearch側の保存先で、Kibanaのdata view(どのindex/data streamを画面に表示するかの定義)とは別の概念です。ES|QLのFROMに書くのはdata streamやindexの名前です。 LIMIT 100 :ES|QL ruleでは各結果行がアラート候補です。LIMITとMax alerts per run(ルール実行1回あたりのアラート数上限の設定)では小さい方が上限になるため、大量発生時の101件目以降の扱いを検討します。LIMITの調整、検知条件の絞り込み、alert suppression、実行間隔の短縮が選択肢です。 MITRE ATT&CKがない :元のダミーJSONでは action.correlationsearch.annotations が空でした。Automatic Migrationは、source assetが持つMITRE mappingを追加アップロードする仕組みを持ちますが、クエリ内容から新しいmappingを必ず推測・付与する機能だとは考えない方が安全です。レビュー候補はT1059.001(PowerShell)とT1027.010(Command Obfuscation)で、最終的には組織の検知意図に合わせて人が設定します。 また、KEEPで_idを結果から落とすと、アラートのdeduplicationに影響する可能性があります。現在の公式ドキュメントでは、非集約クエリにMETADATA _idが自動追加される場合でも、KEEPの内容によっては重複アラートの警告が出ると説明されています。保存時のwarningとExecution resultsを確認してください。 Case C:Proxy ruleはPartially translated 生成結果: FROM logs-proxysg.log-* | WHERE [macro:suspicious_domains] | LOOKUP JOIN internal_users ON user.name | WHERE department == "finance" | LIMIT 100 Partially translatedとはいえ、元のSPLの4つの構成要素は、それぞれ生成結果に引き継がれています。対応を並べると次のようになります。 元のSPL 生成されたES|QL 状態 index=proxy sourcetype=bluecoat:proxysg FROM logs-proxysg.log-* ProxySGログに相当するdata streamへ変換済み `suspicious_domains`(macro) WHERE [macro:suspicious_domains] 位置は維持。ただし中身は未展開のplaceholder | lookup internal_users user OUTPUT department | LOOKUP JOIN internal_users ON user.name lookupの意図はES|QL構文へ変換済み。ただし参照先のlookup indexは未作成 where department=”finance” WHERE department == “finance” 変換済み つまり「クエリの骨組みは全部できたが、2行目と3行目を動かすための実体(macroの中身とlookupデータ)が足りない」という状態です。[macro:suspicious_domains]は完成したES|QLではなく、macroの展開内容を入れるplaceholderです。LOOKUP JOIN internal_usersも、Elasticにinternal_usersというlookup indexが存在することを前提にしています。 ここで誤解しやすいのは、「Elasticにlookup機能がないから失敗した」のではない点です。不足しているのは、Splunk側のlookup資産と中身です。ElasticにはES|QLのLOOKUP JOINがあり、lookup modeのindexと検索結果を結合して追加フィールドを付けられます。Automatic Migrationの公式説明でも、lookupファイルをアップロードすればElasticsearchのlookup indexとして取り込みます。今回はアップロードしていないため、名前だけがクエリに残りました。 完成させる方法は2つあります。 方法A:不足資産を追加アップロード :suspicious_domainsのmacro定義と、internal_usersのlookup definition/CSVをSplunkからエクスポートして追加し、再処理します。 方法B:Elastic側で手動実装 : FROM logs-proxysg.log-* | WHERE url.domain IN ("evil.example", "malware.example") | LOOKUP JOIN internal_users ON user.name | WHERE department == "finance" その前に、internal_usersをindex.mode: lookupで作成し、userとdepartmentを登録します。join fieldの型も一致させる必要があります。 また、Automatic MigrationはIntegration候補としてBroadcom ProxySGを提案しました。クエリを完成させるだけでなく、そのクエリが検索するProxySGデータ自体を取り込む必要があります。 Rule・Data source・Integration・ECSの関係 この4つは別々の話ではありません。PowerShell ruleを例にすると、次の依存関係があります。 Rule process.name == "powershell.exe" を検索したい | v ECS field process.name / process.command_line が必要 | v Data source Endpointプロセスイベントが必要 | v Integration Elastic Defendがそのデータを収集しECSへ整形する Integrationが未導入だと、対象data streamが存在せず、必要なECS fieldも入りません。ruleはインストールできても一致するデータがなく、アラートは出ません。 Automatic MigrationのIntegration表示は、rule translationの合格/不合格ではありません。「Translated=ruleの形が作られた」「Integration ready=ruleを動かすデータが準備された」という別の状態を、分けて確認する必要があります。 インストールからEnableまでのレビュー手順 Translatedになった2件は、無効状態でインストールしました(Install without enabling)。安全な流れは次のとおりです。 Translate / Map     → Source ruleとElastic ruleを比較     → Install without enabling     → 実データでクエリを検証     → Rule settingsを調整     → Enable レビューの起点は、元の検知目的を一文で書くことです。たとえばCase Bなら「同一ユーザー・同一送信元IPからの短時間の連続ログイン失敗を検知する」です。この一文が書けないと、マッピング先や翻訳結果が目的を満たすかを判断する基準がありません。クエリの字面同士ではなく、この一文と比較します。 そのうえで、各段階の確認点は次の表のとおりです。いずれも今回の検証で実際に問題になった観点です。 段階 目的 主な確認点 Logic review(インストール前) 検知の意味が変わっていないか 閾値・時間窓・grouping・除外条件を「目的の一文」と比較する。マッピングの場合はsource queryとtranslated queryを横に並べる Data review ruleを動かすデータがあるか index/data streamの存在、Integrationの導入とデータ到着、必要なECS field、lookup index Query review クエリ自体が動くか DiscoverでのES|QL実行、LIKEのcase sensitivity、KEEPと_id、LIMITとMax alerts per run Rule setting review(インストール後) 運用設定が適切か severity/risk score、MITRE ATT&CK、schedule、alert suppression、exceptions、rule actions Validation(Enable前後) 実データで意図どおり動くか 既知イベントへの一致、Execution resultsのエラーとgap、アラート量とfalse positive 本番移行前に棚卸しするSplunk資産 今回のCase Cが示したとおり、rule本文だけをエクスポートしても依存情報が欠けます。本番移行前に、次の資産を棚卸ししてください。 資産 簡単な説明 移行で必要な理由 saved search 保存されたSPL。report、alert、correlation searchにも使う rule本体 macro definition SPLの再利用可能な断片 展開しないと完全な検索条件が分からない lookup file CSV/KV Storeの参照データ user、asset、domain情報の追加に必要 lookup definition lookup名とファイル/入出力fieldの対応 SPLのlookup名だけでは実体を特定できない data model CIMベースの論理的なデータ構造 tstatsやaccelerated data modelを使うruleに必要 sourcetype Splunkがログ形式を識別する分類 Elasticで対応Integration/datasetを選ぶ手掛かり field extraction 生ログからfieldを取り出す定義 Elastic側でpipelineやmappingを再現するため CIM mapping ベンダー固有fieldを共通fieldへ正規化する対応 ECS mappingを決めるため MITRE annotations tactic/techniqueのmetadata Elastic ruleのMITRE coverageを維持するため index/retention データの保存先と保存期間 Elasticのdata stream、ILM(index lifecycle management:保存期間の管理機能)、検索範囲を設計するため まとめ:Automatic Migrationの価値 今回の検証では、Splunk本体がなくても、saved searchエクスポートを模したダミーデータでAutomatic Migrationの主要な動きを確認できました。 3件をNDJSONでアップロードできた 1件はElastic-authored EQL ruleへマッピングされた 1件はcustom ES|QL ruleへ変換された 1件はmacro/lookup不足でPartially translatedになった 必要なIntegrationとしてElastic DefendとBroadcom ProxySGが示された ServerlessでもELSER index populationの接続エラーが発生したが、ELSERのdeploymentと直接推論は正常だった マッピング先のruleは、元SPLと閾値/時間窓/対象が異なっていた custom ES|QLも、data source、case sensitivity、LIMIT、MITRE、_idの確認が必要だった Automatic Migrationは、移行を完全自動で終わらせる魔法ではありません。より正確には、次の4つを自動化・可視化する機能です。 似たElastic ruleを探す SPLをES|QLのたたき台へ変換する 不足したmacro/lookupを発見する 必要なIntegrationを提案する この分類は工数見積もりにも使えます。たとえば1,000件のruleがある場合、「Mapped 300/Fully translated 450/Partially translated 180/Not translated 70」のように結果を分ければ、そのままレビューできる範囲、データやmacro/lookupの追加が必要な範囲、手動再設計が必要な範囲を分けて見積もれます。 移行の主役は依然として、検知目的を理解し、データと閾値を検証するエンジニアです。Automatic Migrationは、その出発点を「空のエディタ」から「レビュー可能なたたき台」へ引き上げてくれます。 参考資料 本記事は、以下のElastic公式情報に基づいています。 Automatic migration | Elastic Docs https://www.elastic.co/docs/solutions/security/get-started/automatic-migration Fast-track your switch from your current SIEM with Automatic Migration | Elastic Blog https://www.elastic.co/blog/automatic-migration-ai-rule-translation AI can do what now?! Accelerating SIEM migration | Elastic Blog https://www.elastic.co/blog/accelerating-siem-migration Potential External Linux SSH Brute Force Detected | Prebuilt detection rules reference https://www.elastic.co/guide/en/security/current/potential-external-linux-ssh-brute-force-detected.html ES|QL rules | Elastic Docs https://www.elastic.co/docs/solutions/security/detect-and-alert/esql The post Elastic Automatic MigrationをダミーSplunkルールで検証してみた first appeared on Elastic Portal .
1年ほど前に、日本語アナライザーを比較する記事を書きました。 前回の記事: 日本語アナライザーの比較(Kuromoji / Sudachi / MeCab / LLM の性能検証) あれから1年がたち、日本語の検索まわりは少しずつ変わりました。 新しい選択肢も出てきましたし、考え方も少し変わりました。 そこで今回は、続編としてもう一度比較します。 ただし、前回とまったく同じことを繰り返すわけではなく、 2026年の今なら、こう測るともっと良い、というやり方で見直します。 今回の検証は「去年と同じ条件での定点観測」ではありません。そのため、今回の数値を前回のものとそのまま比較できません。 検証に使用したプログラム等は GitHub リポジトリで公開しています。同リポジトリ内の GLOSSARY.md にまとめた用語集を参照してください。 目次 この記事で見ること、見ないこと この1年で変わったこと 1. 既存のアナライザーは、ちゃんと進化していた 2. 「Elasticsearch の中で使えるか」で整理すると分かりやすい 3. いちばん大きな変化:形態素解析に頼らない検索 4. LLM は「アナライザー」ではなく「参考枠」 今回の改良点(前回との違い) 再検証:実際に比べてみる 使うテキスト 比べるアナライザー 結果:トークン数 結果:専門用語の扱い 結果:アナライザー間の似ている度合い(Jaccard) 結果:検索クエリでの動作 参考:LLM は何を「キーワード」として拾ったか アナライザーの選び方ガイド まとめ Links この記事で見ること、見ないこと 先に、ゴールを明確に整理します。 読みながら「結局なにを比べているの?」と迷わないためです。 この記事で見ること: それぞれのアナライザーが、日本語をどう単語に区切るか。 検索用のトークンとして、どれが使いやすいか。 専門用語・英数字・単位(例:NSAIDs、300〜500mg)が保たれるか。 実際の検索クエリで、目的の文書がちゃんとヒットするか。 この記事で深くは扱わないこと: 大規模なデータでの検索ランキング評価。 人手による「この結果は正しい」という関連度判定。 LLM を Elasticsearch のアナライザーとして使う構成。 この1年で変わったこと 1. 既存のアナライザーは、ちゃんと進化していた まず押さえたいのは、定番のツールは止まっていない、ということです。 Kuromoji は、Elastic 公式の日本語アナライザーとして引き続き使えます。 Sudachi は、外部プラグイン(Works Applications の elasticsearch-sudachi)として進化を続け、 新しい Elasticsearch にも対応してきました。 Sudachi の辞書は、数か月おきに新語が追加されています。 MeCab や Janome も、Python 前処理用の選択肢として現在も利用されています。 ここで大事なのは、Kuromoji と Sudachi の「立場」が違うことです。 – Kuromoji は Elastic 公式 の Japanese analysis plugin です。 – Sudachi は 外部プラグイン です。 つまり、Sudachi を使うときは、 使っている Elasticsearch のバージョンに対応しているかを必ず確認します。 2. 「Elasticsearch の中で使えるか」で整理すると分かりやすい ここで混乱しやすいのが、「結局どのアナライザーを Elasticsearch で使えるの?」という点です。 実は、全部を同じようには使えません。 3つのグループに分けると分かりやすいです。 Elasticsearch の中で動く(プラグイン):Kuromoji(公式)、Sudachi(外部)。 Elasticsearch の中では動かない:MeCab、Janome、Lindera。 これらは Python などで先にトークン化し、その結果を Elasticsearch に入れて使います。 番外(参考枠):LLM。これはアナライザーとは目的が違います(あとで説明します)。 さらに、実行環境による違いもあります。 Self-Managed(自前で運用):   Kuromoji などの公式プラグインは、各ノードに analysis-kuromoji をインストールし、ノードを再起動して使います。外部プラグイン(Sudachi など)も入れられます。 Elastic Cloud Serverless: Kuromoji などの core analysis plugins は最初から利用できます。 一方で、外部プラグインの追加や、独自ファイルのアップロードはできません。 そのため、Sudachi などの外部プラグインや、ファイルとして配置する独自辞書(synonyms / stop words / language analyzer 用 dictionary files など)を前提にした構成は使えません 。 ただし、同義語についてはファイルアップロードではなく、synonyms API を使って管理できます。 3. いちばん大きな変化:形態素解析に頼らない検索 一言でいうと、この1年で「検索のやり方そのもの」に選択肢が増えました。 これまでの日本語検索は、形態素解析で単語に区切り、その単語で探すのが基本でした。 これは今も有効で、なくなりません。 ただ、もう1つの道が実用的になりました。 意味で探す検索(セマンティック検索) です。 仕組みをシンプルにいうと、こうです。 文章を「意味のベクトル(数字の並び)」に変換し、意味が近いものを探します。 このとき、形態素解析で単語に区切る必要はありません。 Elasticsearch では、semantic_text という仕組みと、 EIS(Elastic Inference Service)経由の多言語の埋め込みモデルを使うことで、 日本語でもこの検索がぐっと手軽になりました(例として、EIS では Jina Embeddings v5 系や Microsoft Multilingual E5 Large などの embedding model が利用できます)。 実務で考えると、これは大きいです。 「ロキソニン」と入れなくても、「痛み止め」で関連文書を拾える、というような検索ができます。 本番環境では、既定の inference endpoint に依存せず、利用する埋め込みモデルの inference_id を明示するのが安全です。既定モデルはバージョンや環境によって変わる可能性があり、複数インデックスで異なる embedding model が混在するとランキングに影響するためです。 4. LLM は「アナライザー」ではなく「参考枠」 前回は LLM(当時は GPT-4o)も比較に入れました。 今回も LLM を見ますが、立ち位置をはっきり分けます。 なぜかというと、LLM はインデックス用のトークナイザーとは目的が違うからです。 LLM を、Kuromoji や Sudachi と横並びにして「どれが良いアナライザーか」と比べると、 かえって混乱します。 そこで今回は、LLM を別カテゴリ(参考枠)として、次の点だけ見ます。 専門語を「意味のまとまり」として拾えるか。 検索の補助(キーワード抽出や意味理解)に使えそうか。 ここで、混同しやすい点を1つ整理します。 「LLM によるトークン分割は再現性がない」という声もありますが、必ずしもそうとは限りません。 LLM の tokenizer そのものは、同じ条件なら基本的に同じ結果になります。 バラつくのは、「重要語を抜き出して」とお願いしたときの 生成結果 のほうです。 なので今回は、再現できるように、モデル名・プロンプト・temperature を記録します。 今回の改良点(前回との違い) 前回より良くした点を、正直に宣言します。 詳しくは METHODOLOGY.md を見てください。ここでは要点だけ。 正規化を「入口」でそろえる。 Python で NFKC 正規化を1回だけかけ、同じ入力を全アナライザーに渡します。 機能語の除去を「品詞ベース」に統一する。 手書きのストップワード一覧ではなく、助詞・記号などの品詞でそろえて除きます。 Kuromoji を「正解」と決めつけない。 類似度を1つの数字で出すだけでなく、全アナライザー間の一致や、専門語の扱いも見ます。 実際の検索クエリで動作を確認する。 トークンが似ているかだけでなく、「探したい文書が見つかるか」を見ます。 バージョンを記録する。 Elasticsearch・プラグイン・辞書・ライブラリ・LLM の情報を残し、来年また比べられるようにします。 再検証:実際に比べてみる 使うテキスト 医療系のテキストを2つ使います。 Text 1:ロキソニンの説明文(前回と同じ、短めの文)。なじみのある例として。 Text 2:アセトアミノフェンの説明文(今回のために書き下ろした、少し長い文)。 専門用語・カタカナの薬品名・英語の略語・数値を多く含みます。 比べるアナライザー Elasticsearch の中: Kuromoji(標準、Elasticsearch にもともとあるアナライザー)、Kuromoji_search( kuromoji_tokenizer を mode: search に設定して、この記事用に作ったアナライザーですのでElasticsearch にもともと入っている名前ではありません。)、Sudachi(A / B / C)。 Python で前処理: MeCab、Janome。 (Lindera は Rust 製の新しい選択肢ですが、今回の環境では Python 版を導入できなかったため、 本文での紹介にとどめ、計測には含めていません。) 参考枠(LLM): openai-gpt-oss-120b(EIS 経由)。 結果:トークン数 クリーニング後の、ユニークなトークン数です(実測値)。 Text 1(ロキソニン、約137文字): アナライザー ユニークなトークン数 Kuromoji(標準) 34 Kuromoji(search) 34 Sudachi A 36 Sudachi B 33 Sudachi C 33 MeCab 35 Janome 38 Text 2(アセトアミノフェン、約290文字): アナライザー ユニークなトークン数 Kuromoji(標準) 64 Kuromoji(search) 65 Sudachi A 64 Sudachi B 58 Sudachi C 56 MeCab 70 Janome 72 ここで読み取れることを少しだけ。 細かく分割する MeCab や Janome はトークン数が多めです。 Sudachi は C(大きい単位)になるほどトークン数が減り、複合語をまとめていることが分かります。 ただし「数が多い=良い」ではありません。大事なのは、次に見る専門用語の扱いと検索のヒットです。 結果:専門用語の扱い ここが検証の肝となる、興味深いポイントです。 特定の専門用語が、意図通りにひと塊のトークンとして保持されたかを確認します(○ = 単一語として検出)。 Text 1(ロキソニン): 用語 kuromoji kuromoji_search sudachi_a sudachi_b sudachi_c mecab janome ロキソニン ○ ○ ○ ○ ○ × ○ 解熱鎮痛 × × × × × × × 非ステロイド性抗炎症薬 × × × × × × × NSAIDs ○ ○ ○ ○ ○ ○ ○ 炎症 ○ ○ ○ ○ ○ ○ ○ 発熱 ○ ○ ○ ○ ○ ○ ○ Text 2(アセトアミノフェン): 用語 kuromoji kuromoji_search sudachi_a sudachi_b sudachi_c mecab janome アセトアミノフェン ○ ○ ○ ○ ○ × ○ 中枢神経系 × × × × × × × 解熱鎮痛薬 × × × × ○ × × 非ステロイド性抗炎症薬 × × × × × × × NSAIDs ○ ○ ○ ○ ○ ○ ○ インフルエンザ ○ ○ ○ ○ ○ × ○ 300mg × × × × × × × 肝機能障害 × × × × ○ × × アナフィラキシーショック × × × × × × × スティーブンス・ジョンソン症候群 × × × × × × × ここから読み取れることを、いくつか。 まず、カタカナの薬品名(ロキソニン、アセトアミノフェン)や インフルエンザ は、 ほとんどのアナライザーが1語のまま残しました。 ただし、今回の MeCab の構成だけは残しませんでした。 一点だけ補足します、 これは「MeCab はダメ」という話ではありません。 分割のされ方は、使う辞書(UniDic 系か IPAdic 系かなど)や設定の影響が大きいです。 今回の MeCab + 使用辞書(UniDic)の組み合わせでは、カタカナ語が細かく分割される傾向がありました。 次に、英字の略語 NSAIDs は、すべてのアナライザーが1語で保持しました。 英字のかたまりは、そのまま残りやすいです。 そして、長い複合語(非ステロイド性抗炎症薬、中枢神経系、アナフィラキシーショック、 スティーブンス・ジョンソン症候群)は、すべてのアナライザーが分割しました。 どれも、そのままでは1語になりません。 面白いのは、解熱鎮痛薬 と 肝機能障害 を、Sudachi の C モードだけが1語で残したことです。 C モードは大きい単位でまとめるため、こうした複合語をひとかたまりにできます。 数値+単位の 300mg は、どのアナライザーも1語にしませんでした (今回の元の文が 300〜500mg なので、300・500・mg に分かれます)。 ここで大事なのは、「1語で残る=良い」ではない、ということです。 細かく分割されると、部分一致で拾いやすくなります(再現率が上がる)。 1語でまとまると、完全一致やフレーズ検索でズレにくくなります(精度が上がる)。 つまり、どちらが良いかは「あなたの検索の目的」で決まります。 非ステロイド性抗炎症薬 のような長い語を1語で完全一致させたいなら、 ユーザー辞書への登録や、フレーズ検索の併用を検討します。 結果:アナライザー間の似ている度合い(Jaccard) 次に、アナライザーどうしがどれくらい似ているかを見ます。 前回は「Kuromoji にどれだけ似ているか」だけを見ましたが、 今回は Kuromoji を正解と決めつけず、全ペアを比べます(1.00 が完全一致)。 Text 1(ロキソニン): kuromoji kuromoji_search sudachi_a sudachi_b sudachi_c mecab janome kuromoji 1.00 1.00 0.84 0.63 0.63 0.64 0.85 kuromoji_search 1.00 1.00 0.84 0.63 0.63 0.64 0.85 sudachi_a 0.84 0.84 1.00 0.64 0.64 0.58 0.72 sudachi_b 0.63 0.63 0.64 1.00 1.00 0.42 0.54 sudachi_c 0.63 0.63 0.64 1.00 1.00 0.42 0.54 mecab 0.64 0.64 0.58 0.42 0.42 1.00 0.62 janome 0.85 0.85 0.72 0.54 0.54 0.62 1.00 Text 2(アセトアミノフェン): kuromoji kuromoji_search sudachi_a sudachi_b sudachi_c mecab janome kuromoji 1.00 0.98 0.85 0.67 0.62 0.59 0.74 kuromoji_search 0.98 1.00 0.84 0.69 0.64 0.59 0.76 sudachi_a 0.85 0.84 1.00 0.67 0.64 0.68 0.68 sudachi_b 0.67 0.69 0.67 1.00 0.87 0.44 0.58 sudachi_c 0.62 0.64 0.64 0.87 1.00 0.42 0.54 mecab 0.59 0.59 0.68 0.44 0.42 1.00 0.53 janome 0.74 0.76 0.68 0.58 0.54 0.53 1.00 数字が多いので、読み方をまとめます。 kuromoji と kuromoji_search はほぼ同じでした(1.00〜0.98)。 今回のテキストでは、search モードの差はほとんど出ませんでした。 複合語の固有名詞(例:関西国際空港)が多い文では差が出やすくなります。 (この点は、次の検索クエリの結果で確認します。) kuromoji / janome / sudachi_a は互いに近い(細かく分割するグループ)。 sudachi_b と sudachi_c は互いに近い(大きい単位でまとめるグループ)。 mecab は、他と最も離れていました。 ただしこれは MeCab 固有の特徴というより、今回使用した辞書・設定による切り方の違いです。 この「グループ分け」は、そのまま選び方の指針になります。 細かく拾いたい → kuromoji / sudachi A / janome。 まとめたい → sudachi B / sudachi C。 mecab は独特なので、目的に合うかを個別に確認する。 結果:検索クエリでの動作 最後に、実際の検索で確かめます。 ここが、検索システムとして一番大事なところです。 少数の文書を登録し、クエリごとに「期待する文書が拾えるか」を見ます(○ = ヒット)。 クエリ 期待文書 kuromoji kuromoji_search sudachi_a sudachi_b sudachi_c 空港 doc 1 ○ ○ ○ ○ ○ 関西空港 doc 1 ○ ○ ○ ○ × NSAIDs doc 2 ○ ○ ○ ○ ○ 300mg doc 2 ○ ○ ○ ○ ○ アセトアミノフェン doc 2 ○ ○ ○ ○ ○ (doc 1 は「関西国際空港は大阪府にある国際空港です。」、 doc 2 はアセトアミノフェンの説明文です。) 結果を読み解きます。 まず、ほとんどのクエリは、すべてのアナライザーでヒットしました。 唯一の取りこぼしは、関西空港(略称)を Sudachi C で検索したときだけです。 なぜでしょうか。 Sudachi C は、大きい単位でまとめるため、関西国際空港 を1つのトークンにします。 そのため、略称の「関西空港」とはうまく一致せず、ヒットしませんでした。 これは、まさに精度と再現率のトレードオフです。 大きい単位(Sudachi C)は、正式名称での完全一致に強い。 ただし、略称や部分的なクエリは取りこぼすことがあります。 細かい単位(Kuromoji や Sudachi A)は、部分一致で拾いやすい。 一方で、うれしい結果もあります。 英字の略語 NSAIDs、数値+単位の 300mg、カタカナの専門語 アセトアミノフェン は、 すべてのアナライザーで検索できました。 300mg は1つのトークンではありませんでしたが、300 と mg が別々に索引されるため、検索では拾えます。 ただし、ここは設定に依存します。 今回の query 設定ではヒットしましたが、operator(and / or)、 クエリ側のアナライザー、フィールド側のアナライザーの設定によって結果は変わります。 ここでの学びは、最初に立てた問いそのものです。 トークンが1語できれいに残るかどうかと、検索で見つかるかどうかは、必ずしも一致しません。 最終的に大事なのは「ユーザーが探したい文書が見つかるか」です。 なお、今回の小さな例では、Kuromoji の標準と mode: search で差は出ませんでした。 mode: search の効果は、複合語の固有名詞がもっと多いデータで効いてきます。 参考:LLM は何を「キーワード」として拾ったか 最後に、参考枠の LLM(EIS 経由の gpt-oss-120b)を見ます。 くり返しになりますが、これはアナライザーの比較ではありません。 「意味のまとまりとして、専門語を拾えるか」を見るための参考です。 抽出されたキーワードは次の通りです。 Text 1(ロキソニン): ロキソニン錠 / ロキソニン / 非ステロイド性抗炎症薬 / NSAIDs / 解熱鎮痛作用 / 関節リウマチ / 変形性関節症 / 腰痛症 / 肩こり / 歯痛 / 手術後 / 外傷後 / 炎症 / 痛み / 風邪 / 熱 Text 2(アセトアミノフェン): アセトアミノフェン / 中枢神経系 / 解熱鎮痛薬 / 非ステロイド性抗炎症薬 / NSAIDs / 抗炎症作用 / 一般用医薬品 / 頭痛 / 歯痛 / 月経痛 / 関節痛 / インフルエンザ / 風邪 / 発熱 / 成人 / 1回300〜500mg / 1日3回 / 経口投与 / 肝機能障害 / 高齢者 / 用量調整 / 重篤な副作用 / 肝障害 / アナフィラキシーショック / スティーブンス・ジョンソン症候群 ここが、形態素解析との大きな違いです。 形態素解析がすべて分割してしまった長い専門語を、LLM は1つの意味のまとまりとして拾いました。 たとえば、非ステロイド性抗炎症薬、中枢神経系、アナフィラキシーショック、 スティーブンス・ジョンソン症候群 などです。 さらに、1回300〜500mg や 1日3回 のような、用量を表す「意味のかたまり」も拾っています。 一言でいうと、LLM は「索引用の最小単位」ではなく「意味のまとまり」を取り出します。 このため、LLM が向いているのは次のような場面です。 クエリの意図を理解する(クエリ理解)。 文章から重要語を抜き出す(キーワード抽出)。 意味で探す検索(セマンティック検索)の補助。 逆に、インデックスのトークン化には向きません。 理由は3つあります。 生成結果は毎回まったく同じとは限らない(再現性が低い)。 大量の文書をすべて LLM に通すのはコストが高い。 そもそも目的が、転置インデックス用の最小トークンを作ることではない。 今回使用した LLM の設定(再現性のため): 使用モデル:openai-gpt-oss-120b 実行環境:EIS(Elastic Inference Service)経由 temperature:0 プロンプト:付録(GitHub のリポジトリ)に掲載 アナライザーの選び方ガイド ここまでをふまえて、用途別の選び方をまとめます。 「結局どれを使えばいいの?」への答えです。 部分一致や再現率を重視したい(広く拾いたい) → Kuromoji、または Sudachi A(細かく分割)。 完全一致・フレーズ検索を重視したい(複合語をまとめたい) → Sudachi C。 バランスを取りたい → Sudachi B。 新語・製品名・固有名詞が多い → 辞書更新の速い Sudachi、または Kuromoji に辞書を足す構成。 意味で探したい(言い換えにも強くしたい) → 形態素解析ではなく、semantic_text + 多言語埋め込み(EIS)。 Elasticsearch の中だけで完結させたい → 実質、Kuromoji か Sudachi(ほかは Python 前処理が必要)。 LLM → インデックスのトークン化には向きません。 クエリ理解やキーワード抽出など、検索の「補助」に使うのが向いています。 まとめ 最後に、覚えておきたいことを1つだけ。 「いちばん良いアナライザー」は存在しません。用途で決まります。 この1年での大きな変化は、選択肢が増えたことです。 形態素解析は今も主役の1つですが、意味で探すセマンティック検索という道も、 日本語で手軽に使えるようになりました。 次の一歩としては、自分の検索でよく使うクエリをいくつか決めて、 この記事の方法で実際に試してみるのがおすすめです。 results/ に数値が出るので、自分のデータで「どれが合うか」を確かめられます。 ※本記事の Python コードと検証環境は、Claude Codeを使って作成しました。 Links Kuromoji(analysis-kuromoji)プラグイン kuromoji analyzer kuromoji_tokenizer semantic_text フィールド semantic_text による意味検索 Elastic Inference Service(EIS) EIS の対応モデル (gpt-oss-120b など) 自前クラスタから EIS を使う (Cloud Connect) カスタムプラグイン/バンドルのアップロード (Serverless の制約の出典) Hosted と Serverless の違い Synonyms API (Serverless で同義語を使う方法) The post Kuromoji・Sudachi・MeCab・Janome・LLM・semantic search の使い分け【2026】 first appeared on Elastic Portal .
Kibanaのダッシュボードで、標準の「Lens」では表現できない複雑なチャート(サンキーチャートやカスタムマップ、特殊な散布図など)を作りたいとき、強力な武器になるのが  Vega / Vega-Lite  です。 しかし、これまでは重厚な Elasticsearch の Query DSL(JSON)を手書きしてデータを集計する必要があり、記述の複雑さに頭を悩ませた方も多いのではないでしょうか? そんな開発者・アナリストに朗報です。バージョン 9.4+(Serverless Stack)以降、直感的で強力な新しいクエリ言語  ES|QL(Elasticsearch Query Language)  を Vega のデータソースとして直接利用できるようになりました! 今回は、この  ES|QL × Vega  の組み合わせがもたらすメリットと、具体的な実装方法をコード例付きで解説します。 目次 なぜ ES|QL × Vega なのか? 3つのメリット 1. 複雑な Query DSL からの解放 2. データ形式の自動変換 3. ダッシュボードの「時間範囲」や「フィルター」と完全同期 ES|QL を呼び出すための設定パラメータ Vega / Vega-Lite を使った Visualization の作成手順 【実践】サンプルコードで見る実装例1:折れ線グラフ(Vega-Lite) 💡 コードの解説 🖼️ 実行結果 【実践】サンプルコードで見る実装例2:時間帯×日付のヒートマップ(Vega-Lite) 💡 コードの解説 🖼️ 実行結果 まとめ:データ分析と表現の幅を広げよう なぜ ES|QL × Vega なのか? 3つのメリット 1. 複雑な Query DSL からの解放 パイプライン演算子(  |  )を使ってデータを段階的に加工できる ES|QL を使うことで、ネストの深い Elasticsearch 独自の集計クエリを書く必要がなくなります。クエリの可読性が劇的に向上します。 2. データ形式の自動変換 ES|QL のクエリ結果は本来「列指向(Columnar)」ですが、Kibana の Vega インテグレーターが自動的に  Vega が期待する「行ベース(Row-based / 1行1オブジェクト)」のJSON形式へ変換  してくれます。手動でのパース処理(  format.property  などの指定)の手間が大幅に減ります。 3. ダッシュボードの「時間範囲」や「フィルター」と完全同期 Kibana の拡張トークンを利用することで、ユーザーがダッシュボード上で操作した時間フィルターや検索条件を、ES|QL クエリ内に動的にマッピングできます。 ES|QL を呼び出すための設定パラメータ Vega の  data.url  オブジェクト内に以下のパラメータを指定することで、ES|QL モードが有効になります。 パラメータ 必須/任意 概要 "%type%" 必須 "esql"  を指定します。 "query" 必須 実行したい ES|QL (1行で書く) "%context%" 任意 true  に設定すると、ダッシュボードのグローバルフィルターがクエリに自動適用されます。 "%timefield%" 任意 タイムスタンプのフィールド名を指定。これを設定すると、クエリ内で名前付きパラメータ  ?_tstart  と  ?_tend  が利用可能になります(ダッシュボードの時間範囲が代入されます)。 "dropNullColumns" 任意 true  (デフォルト)の場合、null 値しか含まれない列をレスポンスから自動で除外します。 "params" 任意 クエリに動的に代入したい名前付きパラメータの配列を指定します。 Vega / Vega-Lite を使った Visualization の作成手順 Kibanaにおけるカスタム可視化の作成手順は以下の通りです(従来通り)。 1: Dashboard を新規作成するか、既存の Dashboard を編集モードにします。 2: 右上の [Add panel] プルダウンメニューから [New panel] を選択します。 3: パネル選択画面から [</> Custom visualization] を選択します。 4: Vega / Vega-Lite の作成画面が表示されるので、右側のエディタに JSON を記述していきます。 5: デバッグしたい場合は、上部の Inspect をクリックしてください。 【実践】サンプルコードで見る実装例1:折れ線グラフ(Vega-Lite) 以下は、サンプルデータ(Webログ)を使用し、時間の経過に伴うイベント数を2時間おきに集計して折れ線グラフ(Line Chart)で描画する Vega-Lite (v6) の定義例です。 { "$schema": "https://vega.github.io/schema/vega-lite/v6.json", "title": "Event counts per 2 hours", "data": { "url": { "%type%": "esql", "%context%": true, "%timefield%": "@timestamp", "query": "FROM kibana_sample_data_logs | WHERE @timestamp >= ?_tstart AND @timestamp < ?_tend | STATS doc_count=COUNT() BY tbucket=TBUCKET(2 hour) | SORT tbucket" } }, "mark": "line", "encoding": { "x": { "field": "tbucket", "type": "temporal", "axis": { "title": false } }, "y": { "field": "doc_count", "type": "quantitative", "axis": { "title": "Document count" } } } } 💡 コードの解説 ** %timefield%: "@timestamp"  と  ?_tstart  /  ?_tend** ES|QL クエリ内の  WHERE @timestamp >= ?_tstart AND @timestamp < ?_tend  に注目してください。これにより、Kibana ダッシュボードの右上にある時間セレクター(例: 「過去24時間」など)の範囲が、自動的にこのプレースホルダーに流し込まれます。 STATS ... BY tbucket=TBUCKET(...) ES|QL の強力な関数  TBUCKET  を使い、2時間ごとのバケットに丸めてカウント(  COUNT()  )しています。従来の Query DSL で  date_histogram  アグリゲーションを書くよりも圧倒的にシンプルです。 mark : "line" "mark": "line"  を指定することで、集計データを折れ線グラフとして描画するよう指示しています。 encoding  セクション ES|QL で集計した結果の列名(  tbucket  と  doc_count  )が、そのまま Vega-Lite の  field  として直感的にマッピングされているのがわかります。 🖼️ 実行結果 【実践】サンプルコードで見る実装例2:時間帯×日付のヒートマップ(Vega-Lite) 次に、1時間ごとのイベント数を「曜日や日付×時間帯」のマトリクスで可視化し、アクセスの時間帯トレンドを一目で把握できるヒートマップ(パンチカード)の例をご紹介します。 { "$schema": "https://vega.github.io/schema/vega-lite/v6.json", "title": "kibana_sample_data_logs 内の時間ごとのログ数", "data": { "url": { "%type%": "esql", "%context%": true, "%timefield%": "@timestamp", "query": "FROM kibana_sample_data_logs | WHERE @timestamp >= ?_tstart AND @timestamp < ?_tend | STATS count=COUNT() BY datetime=TBUCKET(1 hour) | LIMIT 10000 | SORT datetime" } }, "config": { "view": { "strokeWidth": 0, "step": 13 }, "axis": { "domain": false } }, "mark": "rect", "encoding": { "x": { "field": "datetime", "timeUnit": "hours", "type": "ordinal", "title": "時" }, "y": { "field": "datetime", "timeUnit": "date", "type": "ordinal", "title": "日" }, "color": { "field": "count", "type": "quantitative", "legend": { "title": "カウント" } } } } 💡 コードの解説 mark : "rect"によるグリッド描画 Vega-Lite でヒートマップを作る際は、タイル(四角形)を描画する  "rect"  マークを使用します。 timeUnit を使った「時」と「日」の切り出し ES|QL 側からは  TBUCKET(1 hour)  で丸められた一連のタイムスタンプが返ってきます。それを Vega-Lite 側の  timeUnit  プロパティを使って、X軸には「時(hours)」、Y軸には「日(date)」として切り出してマッピングしています。これにより、複雑なクエリを書くことなく、フロントエンド側で綺麗な2次元マトリクスを表現できます。 color による密度の可視化 集計したイベント数(  count  )を  color  の  quantitative (量的データ)として指定することで、ログ件数に応じた色の濃淡が自動的に適用されます。 🖼️ 実行結果 まとめ:データ分析と表現の幅を広げよう これまでの Kibana カスタム可視化は、「Query DSL が難解で手が出せない」というエンジニアも多かったかと思います。しかし、ES|QL の登場によって、SQL ライクな直感的な記述でバックエンドのデータを引き出し、Vega の表現力をフルに活かせるようになりました。 ダッシュボードの表現力をもう一段階引き上げたい方は、ぜひ公式ドキュメントの  Custom visualizations with Vega | Elastic Docs  を参考に、ES|QL × Vega の強力なタッグを試してみてください! その他の参考URL Kibana dashboards improvements | Elastic Search Labs Vega公式 Vega-Lite公式 The post Kibanaの新定番!ES|QL と Vega を組み合わせて自由自在なカスタム可視化を実現する first appeared on Elastic Portal .
Elastic 9.4.0 より Elastic Agent Builder が GA になりました。 今回は、Elastic Agent Builder で作成した Tool や AI Agent が Local LLM 環境でも実際に動作するのか検証してみました。 目次 検証環境 準備 Tool, AI Agent, Connector の作成 Tool の作成 AI Agent の作成 Connector の作成 Feature Settings AI Agent の実行 Answer 実行結果の考察 LLMの改善 検証環境 PC : Windows 11 Pro (32 GB RAM) Docker Container : Rancher Desktop 1.22.3 Elastic Stack : Elastic 9.4.2 Trial License (Docker 上で動作) Local LLM 実行環境 : LM Studio 0.4.16 Local LLM : Qwen 3.5 2B (Q4_K_M) Context Length: 14419 / GPU Offload: 24 テストデータ : kibana_sample_data_logs (Kibana に付属のサンプルデータ) 準備 サンプルデータ kibana_sample_data_logs を Kibana の画面から登録しておきます。(※脚注1 1 ) Docker の Host マシン上で LM Studio を起動します。 LM Studio に qwen3.5-2b をダウンロードし、ロードします。 LM Studio の Developer Mode で Server を 11434 ポートで開始します。 Context Length : 15000 程度 GPU Offload : 24 Tool, AI Agent, Connector の作成 今回は、  「kibana_sample_data_logs のログ数を送信先ごとに集計し、上位10件を取得する」  ための Tool, AI Agent を作成していきます。 また、AI Agent と LLM の中継を行う Connector も作成します。 AI Agent のシーケンス図(概略) ※あくまで一例です。 Tool の作成 AI Agent → Tool の順にトップダウンで作成することも可能ですが、 今回は Tool → AI Agent の順にボトムアップで作成していきます。 Kibana にログイン後、Home / Elasticsearch / Agents メニューをクリックします。 Tools メニューをクリックし、さらに、Manage all tools をクリックします。 ※注 [Add tool] ではありません。 Tools library 画面が表示されるので、[+ New tool] をクリックします。 Tool の新規登録画面が表示されます。 下記のように入力していきます。 Type  : ES|QL ES|QL Query  : 下記のクエリーを入力 (ログを送信先ごとに集計し、上位n件を返すクエリー) FROM kibana_sample_data_logs | WHERE @timestamp > ?start_datetime AND @timestamp < NOW() | STATS count = COUNT(*) BY geo.dest | SORT count DESC | KEEP geo.dest, count | LIMIT ?limit ES|QL Parameters (1) Name  : start_datetime Description  : 調査の起点となる日時 Type  : date Optional  : true Default value  : 05/01/2026 ES|QL Parameters (2) Name  : limit Description  : 上位何件のログを取得したいか? Type  : integer Optional  : true Default value  : 10 Tool ID  : tool_get_kibana_sample_data_logs_count_by_geo_dest Description  : 下記を入力 kibana_sample_data_logs について、指定された開始日時 (start_datetime) 以降の送信先 (geo.dest) ごとのログ数を調べる。 ログ数の多い順に上位 limit 件のログ数を返す。 入力し終えたら、[Save & test] を押して、Tool の保存と ES|QL のテストを行います。 AI Agent の作成 Tool を作成し終えたら、次は Tool を呼び出す AI Agent を作成します。 デフォルトで表示されている AI Agent 名の右にある、下向きのアイコンをクリックします。 [Manage agents] をクリックします。 AI Agent の一覧が表示されます。画面右上の [+ New agent] をクリックします。 AI Agent の新規登録画面が表示されます。 下記のように入力していきます。 Agent ID  : get_kibana_sample_data_logs_count_by_geo_dest Custom Instructions  : 下記を入力 あなたは kibana_sample_data_logs についての分析を行うエージェントです。 # 指示1 与えられた質問から、調査対象の開始日時、および取得したい件数を抽出しなさい。 その開始日時を start_datetime 、取得したい件数を limit として記憶しなさい。 # 指示2 次のツールを使って、送信先ごとのログ数を取得しなさい。 その際、指示1 で抽出した開始日時を start_datetime 、取得したい件数を limit parameter として渡しなさい。 - tool : tool_get_kibana_sample_data_logs_count_by_geo_dest Display name  : Get kibana_sample_data_logs count by geo.dest Display description  : 下記を入力する。 kibana_sample_data_logs について 指定された開始日時 (start_datetime) 以降のログ数を送信先 (geo.dest) ごとに集計する。 ログ数の多い順に limit 件の送信先を返却する。 (Custom Instructions が LLM に対する指示となります。) 入力し終えたら、先ほど作成した Tool : tool_get_kibana_sample_data_logs_count_by_geo_dest を参照するよう設定します。 画面上部の Tools タブをクリックします。 デフォルトで設定されている Tool を全てオフにします。 次に、先ほど作成した Tool : tool_get_kibana_sample_data_logs_count_by_geo_dest にチェックを入れます。 画面右上の [Save] をクリックします。 Connector の作成 AI Agent を作成したので、AI Agent と LLM を中継する Connector を作成します。 Stack Management / Alerts and Insights / Connectors をクリックします。 Connector の一覧画面が表示されます。右上の [(+) Create connector] をクリックします。 接続タイプの選択画面が表示されます。 今回は、OpenAI 互換の LM Studio 経由で接続するので、OpenAI を選択します。 OpenAI (互換の)Connector の登録画面が表示されます。 今回は、Docker の Host である host.docker.internal の 11434 ポートが接続先となるので 次のように入力していきます。 Connector name  : local_qwen_3_5_2b Select an OpenAI provider  : OpenAI URL  :  http://host.docker.internal:11 4 34/v1/chat/completions Default model  : qwen3.5-2b API key  : LM Studio で設定した API Key LM Studio で API Key を省略した場合は、dummy など適当に入力する。 Add HTTP header Key  : content-type Value  : application/json 入力し終えたら Test で接続できることを確認する。 Feature Settings 先ほど作成した Connector : local_qwen_3_5_2b を利用できるよう、Feature Settings で設定します。 Stack Management / Model Management / Feature Settings をクリックします。 Feature Settings 画面が表示されます。 Agent Builder の Assigned models の (+) Add a model をクリックして、先ほど作成した local_qwen_3_5_2b を選択します。 AI Agent の実行 準備ができたので AI Agent を実行してみます。 Home / Elasticsearch / Agents から get_kibana_sample_data_logs_count_by_geo_dest を選択します。 Connector に local_qwen_3_5_2b が選択されていることを確認します。 local_qwen_3_5_2b 以外が選択されている場合は、そのコネクター名をクリックして、local_qwen_3_5_2b に変更します。 それでは、チャット欄に質問を入力してみます。 2026-06-01T00:00:00Z 以降のログ数を送信先ごとに表示してください。ただし、ログ数が多い順に上位5件のみ表示してください。 私の環境では、回答を得られるまでに2分40秒ほどかかりました。 回答に至るまでの Reasoning も表示されます。 Reasoning Calling tool tool_get_kibana_sample_data_logs_count_by_geo_dest Parameters { "start_datetime": "2026-06-01T00:00:00.000Z", "limit": 5} ESQL FROM kibana_sample_data_logs | WHERE @timestamp > "2026-06-01T00:00:00.000Z" AND @timestamp < NOW() | STATS count = COUNT(*) BY geo.dest | SORT count DESC | KEEP geo.dest, count | LIMIT 5 Found 5 results 167 seconds ↑ 8,878 tokens ↓ 197 tokens Answer 2026-06-01T00:00:00Z以降のログ数(上位5件) 送信先ごとのログ数は以下の通りです: 送信先 ログ数 CN 723 IN 625 US 311 ID 125 BR 106 このデータは、tool_get_kibana_sample_data_logs_count_by_geo_dest ツールの結果に基づいています。 実行結果の考察 正しい結果が返ってきました。 (上記の結果は、実行するタイミングによって参照するデータの範囲が変わるため、違うタイミングでは異なる結果となります。) このように Tool, AI Agent, Connector を作成することで Local LLM でも AI Agent を動かすことができました。 正しい結果を返すためには、適切な Tool の作成、適切な AI Agent の Instruction の設定、適切な LLM の選択が必要となります。 (なお、Tool から MCP Server へ接続することも可能です。また、AI Agent の実行には Tool だけでなく、Skill や Workflow も利用することが可能です。) LLMの改善 今回のローカル環境 (Qwen 3.5 2B) では、回答を得られるまでに約2分40秒の時間がかかりました。 また、非常に軽量のモデルを利用しているため、より複雑なビジネスの質問には対応しきれない可能性が高いです。(※脚注2 2 ) もし実運用を見据えてパフォーマンスを改善する場合、以下の2つのアプローチが考えられます。 a. ローカル環境のマシンリソースを増強し、より強力な大型モデルを動かす b. クラウド上の強力な LLM 外部 API を呼び出す ローカル環境の増強はコストや手間の面でハードルが高いため、手軽に強力な LLM を試す方法としては EIS(Elastic Integration Server) を使ったクラウド LLM の呼び出しがおすすめです。 EIS を経由すれば、Anthropic Claude Sonnet 4.6 などを簡単に呼び出すことができます。 興味のある方は、ぜひ以下の参考記事もあわせてご覧ください。試しに Anthropic Claude Sonnet 4.6 で同じ質問を入力したところ10秒ほどで結果が返却され、しかも指示していないにもかかわらず、グラフまで表示されました。 (※EISを利用するには、有償の Elastic Cloud 環境が必要です。Anthropic Claude Sonnet 4.6 などの利用料金は別料金となります。) ベクトル検索と EIS を使った AI 生成回答の活用 EIS でクラウド LLM を活用する方法 kibana_sample_data_logs の登録方法 ↩︎ Observability 用の推奨モデル Security 用の推奨モデル ↩︎ The post Elastic AI Agent を Local LLM で動かしてみた。 first appeared on Elastic Portal .
FIFA ワールドカップ 2026は、アメリカ・カナダ・メキシコの3か国開催です。 会場が大陸全体に散らばっているので、チームによって移動の負担がかなり違いそうだな、と思いました。 そこで、各チームのグループステージの「移動スケジュールの重さ」を、Elastic を使って地図とダッシュボードで見えるようにしてみました。この記事では、何を作ったのか、何のデータを使ったのか、そしてどこまでが言えてどこからは言えないのかを、なるべくシンプルに説明します。 目次 概要 着眼点 手法 ダッシュボードの作り方は1つじゃない(しかも AI に任せられる) なぜ Elastic でやると面白いのか まとめ 概要 一言でいえば、「どのチームの移動スケジュールが最も過酷か」を可視化したダッシュボードです。 中心となるのは、独自の「移動負担スコア(travel_burden_score)」です。念のためお伝えしておきますが、これはあくまで仮説に基づいたカスタム指標であり、公式なデータではありません。今回は以下の5つの要素に重みをかけて組み合わせてスコアを算出しました。 ベースキャンプから各試合会場までの距離 ベースキャンプから最も遠い会場までの距離 試合順に見た会場間の移動距離 試合間の休養日数 タイムゾーンの移動(時差) つまり、「長距離の移動が多い」「時差が大きい」チームほどスコアが高くなる仕組みです。 着眼点 なぜ面白いと思ったのかというと同じ「グループステージ3試合」でも、チームによって移動の負担には天と地ほどの差があるからです。  例えばボスニア・ヘルツェゴビナ代表の場合、ベースキャンプはサンディに置かれますが、試合会場はトロント、ロサンゼルス、シアトルと各地に分散しています。これを地図で見ると、大陸を横断するようなハードな移動が必要なことが一目瞭然です。  数字だけではピンと来なくても、地図上に線を描いてみるとその過酷さが伝わりますよね。これがダッシュボードを作ってみようと思った最大の理由です。 手法 背景を知らない方のために、使ったものを簡単に説明します。 データはすべて公開データです。 自分で試合結果や移動データを作ったりはしていません。 試合日程・会場:OpenFootball(無料・自由に使える公開データ) 各チームのベースキャンプ:FIFA の公式発表ページ 会場やベースキャンプの座標:Wikipedia / GeoNames などの公開情報 これを Elastic の仕組みに載せています。Elastic という名前を初めて聞く方向けに、まずひとことで言うと、検索(Search)・監視(Observability)・セキュリティ(Security)を1つにまとめたデータプラットフォームです。 具体的に使ったのは次の3つです。 Elasticsearch :データをためて高速に検索・集計できるエンジン。Elastic の心臓部です。今回の「チームごとの移動データ」をここに入れています。 Kibana :そのデータをグラフや表で可視化するツール。ダッシュボードはここで作ります。 Kibana Maps :地図の上にデータを重ねて見せる機能。ベースキャンプ、試合会場、移動の線を地図に描いています。 データの整形(距離の計算など)は、シンプルな Python スクリプトで行っています。距離は2点間の直線距離で計算しています。 ここはとても大事なので、はっきり書きます。これは 実際の移動ルートや、チームのコンディションを直接示すものではありません。 距離は「直線距離」です。実際の移動は道路や飛行機なので、もっと長くなります。 ベースキャンプは「都市レベル」の座標です。正確な練習場の場所までは使っていません。 あくまで「日程表から見える移動の負担」を推定しているだけです。 なので、「移動が重い=負ける」という話ではありません。 ただ、スケジュール上の移動負担をデータで眺めてみるという意味では、面白い切り口になったと思っています。 ダッシュボードの作り方は1つじゃない(しかも AI に任せられる) 大きく3つあります。 手動で作る :Kibana の画面で、パネルを足したり並べたりして作る。一番わかりやすい方法です。 API で作る :Python などからプログラムでダッシュボードを生成する。今回はこの方法で、ダッシュボードをファイル(NDJSON)として書き出し、誰でも取り込めるようにしました。 AI に任せる :Elastic には、AI エージェント向けのSkillsが公開されていて、その中にはダッシュボード作成用のものもあります。つまり、AI に作らせることもできます。 さらに Agent Builder という機能もあります。これは、自分のデータの上で動く「質問に答えるアシスタント」を作れる仕組みです。実務で複雑なダッシュボードを扱うときに、その裏にあるデータについて「なぜこのチームが1位なの?」のような質問を自然言語で投げて、答えてもらう、といった使い方ができます。 なぜ Elastic でやると面白いのか 今回はサッカーを題材にしましたが、やっていることは、もっと一般的な問題と同じです。 「公開(または社内)の予定データに、場所の情報をくっつけて、距離・休み・時差から負担を点数にして、地図とダッシュボードで見せる」 という流れです。 これは、たとえば次のような場面とそのまま重なります。 現場スタッフをどの拠点からどの現場へ動かすか(フィールドオペレーション) イベントの会場配置と人員の動き 配送・物流の負荷 拠点ごとの混雑やインフラ負荷 セキュリティ:ログインがどの国・拠点から来ているかを地図に出し、ふだんと違う場所からのアクセスを見つける(不正アクセスの兆候の可視化) Elastic は、データの取り込みから、検索、集計(ES|QL という問い合わせ言語。Splunk を使ったことがある方は、あの SPL と同じ立ち位置のものだと思ってください)、ダッシュボード、地図までを1つの基盤でまかなえます。だから「予定データを運用の知見に変える」のに向いています。サッカーの例は、その分かりやすい入り口というわけです。 まとめ 大会が終わったら、実際の結果やチームのパフォーマンスと推定した移動の大変さ見比べてみるのも面白そうだなと思っています。 ここで個人的な感想を少しだけ。 Elastic は、コツをつかむまでは正直ちょっと小難しいところがあります。でも今は GenAI(生成AI)を一緒に使うことで、その最初のハードルがかなり下がってきている感じがします。「全部を自分で覚えてから作る」のではなく、 AI に手伝ってもらいながら作って、動かしながら理解する ことができる時代になってきたな、と実感しました。 最後まで読んでいただき、ありがとうございました。 サイオステクノロジー株式会社 Saman The post ワールドカップ2026の各チームの移動の大変さを Elastic で可視化してみた first appeared on Elastic Portal .
Elasticsearchの次世代クエリ言語「ES|QL」に、強力な新機能「ES|QL Views(ビュー)」が登場しました。(Elastic Stack 9.4+, Preview) この記事では、技術者向けにES|QL Viewsの概要、ユースケース、具体的な実装例、そして内部で動くユニークな最適化ロジック(Query Compaction)までを徹底解説します。 ※参考図(NotebookLMによる概要説明図) 目次 1. ES|QL Views とは? 主な特徴 2. なぜ使うのか?(主要なユースケース) 3. 基本的な使い方 ビューの定義(作成・更新) 4. 応用・実戦パターン集 4.1. シンプルなフィルタリングとデータのカプセル化 4.2. ワイルドカードを用いた複数ビューの一括集計 4.3. サブクエリ(Subqueries)を内包したマルチソース統合 4.4. LOOKUP JOIN を用いたマスタデータとの結合 5. アーキテクチャ深掘り:ネスト制限と「Query Compaction」 ネストとブランチングの制限 自動最適化ロジック「Query Compaction(クエリの平坦化)」 6. 現時点での制限事項(Tech Preview) まとめ 参考URL 1. ES|QL Views とは? ES|QL Viewsは、一言で表現すると「ES|QLクエリの出力結果をベースにした仮想的なインデックス(Virtual Index)」です。 従来のRDBにおける「ビュー」と同様に、実データそのものを持つわけではありません。あらかじめ定義されたES|QLクエリ(ソースコマンドやパイプライン処理を含む)に名前をつけて保存し、他のクエリから通常のインデックスと全く同じように FROM 句で呼び出すことができます。 主な特徴 動的な実行 (Dynamic Execution) メインクエリが実行される際、参照されているビューもその場でオンデマンドに実行されます。そのため、元となるソースインデックスが更新されていれば、常に最新のデータが反映されます。 インデックスと同等の扱い 通常のインデックス名だけでなく、ワイルドカードやインデックスパターンと組み合わせて、シームレスに FROM 句に指定可能です。 2. なぜ使うのか?(主要なユースケース) ES|QLパイプラインが複雑化するにつれ、Viewsは以下のような場面で真価を発揮します。 複雑なクエリの再利用(DRY原則の適用) 頻繁に使用するフィルタや集計(STATS)、計算(EVAL)のパイプラインをビューとしてカプセル化することで、クエリの重複を排除し、メンテナンス性を向上させます。 データ構造の抽象化 フィールド名の変更(RENAME)や型変換、派生フィールドの生成をビュー側で集中管理できます。クエリの利用者は、背後の複雑なマッピングを気にせず、一貫したカラムを参照できます。 マルチソースの事前処理と結合 異なるデータソースごとに個別のフィルタや前処理を施したビューを作成し、それらをメインクエリの FROM 句で一元的に結合・クエリできます。 下流ツールの簡素化 Kibanaのダッシュボードやアラート、アドホックな分析を行うアナリストに対して、裏側のインデックスや煩雑な前処理を隠蔽したシンプルな「ビュー」だけを提供できます。 3. 基本的な使い方 具体的な実装の流れを見てみましょう。ここでは例として、住所データ(addresses)から国名を統一してカウントするビューを作成し、それを呼び出します。 ビューの定義(作成・更新) REST API を使用して、view_country_addresses という名前のビューを定義します。 PUT /_query/view/view_country_addresses { "query": """ FROM addresses | RENAME city.country.name AS country | EVAL country = CASE(country == "United States of America", "United States", country) | STATS count = COUNT() BY country """ } ビューの呼び出し 定義したビューは、通常のインデックスと全く同じように FROM でクエリできます。 FROM view_country_addresses 出力結果イメージ: count country 1 Japan 1 Netherlands 1 United States 4. 応用・実戦パターン集 ※ 以下の例では、ビューの名前をインデックスと明示的に区別するために view_ プレフィックスを付与しています(付与は任意です)。 4.1. シンプルなフィルタリングとデータのカプセル化 特定の条件(例: HTTP Response のエラー)に合致するログだけを抽出するビューです。裏側の複雑なフィルタ条件をダッシュボードや他のアナリストから隠蔽できます。 ビューの定義 PUT /_query/view/view_error_triage { "query": """ FROM kibana_sample_data_logs | WHERE response == "404" OR response == "503" """ } ビューの参照 FROM view_error_triage | STATS error_count = COUNT(*) BY url | WHERE error_count > 20 | SORT error_count DESC ※Discover での実行例 4.2. ワイルドカードを用いた複数ビューの一括集計 同じスキーマ構造を持つ複数のビューが存在する場合、ワイルドカード(*)を使って同時に呼び出し、さらにマージ・集計(SUM)することが可能です。 複数ビューをまたぐ集計クエリ FROM view_country_* | STATS total_count = SUM(count) BY country | WHERE total_count > 10 | SORT total_count DESC, country ASC (※ 事前に view_country_addresses、view_country_airports などが定義されているケースを想定) 4.3. サブクエリ(Subqueries)を内包したマルチソース統合 異なる複数のデータソース(ゲートウェイ、決済、認証など)のログを、ビューの定義内でサブクエリとして並列展開(ブランチ)して統合する、より高度な構成です。 ビューの定義 PUT /_query/view/view_error_triage_multisource { "query": """ FROM (FROM svc-gateway-* | WHERE http.response.status_code >= 500), (FROM svc-payments-* | WHERE http.response.status_code >= 500), (FROM svc-auth-* | WHERE http.response.status_code >= 500) """ } 💡 技術的ポイント (Query Compaction): ES|QLは通常1レベルのブランチ(並行処理)しか許容しませんが、ビュー内に記述されたサブクエリは、メインクエリ実行時に後述の「Query Compaction」によって自動的に最適化されます。これにより、ネスト制限を回避しながら複雑なマルチソースクエリをカプセル化できます。 4.4. LOOKUP JOIN を用いたマスタデータとの結合 インデックス同士を LOOKUP JOIN で結合した結果をビューとして保存できます。以下は、特定の空港マスタに合致するデータだけの「フィルタリング済みサブセット」を定義する例です。 ビューの定義 PUT /_query/view/view_airports_mp_filtered { "query": """ FROM airports | RENAME abbrev AS code | LOOKUP JOIN airports_mp ON abbrev == code | WHERE abbrev IS NOT NULL | DROP code """ } 作成したビュー(結合済みデータ)と、元の未加工インデックスを同時に FROM 句で呼び出して、データの重複度合いを調査するような高度なアドホック分析も行えます。 ビューと通常インデックスを組み合わせた比較クエリ FROM view_airports_mp_filtered, airports | STATS duplications = COUNT() BY abbrev | STATS count = COUNT() BY duplications | SORT count DESC 5. アーキテクチャ深掘り:ネスト制限と「Query Compaction」 技術者として最も押さえておきたいのが、ビューが実行される際のクエリプランと最適化の挙動です。 ネストとブランチングの制限 ES|QL Viewsは、ビューの中に別のビューを含める「ネスト」を最大10階層までサポートしています。 また、1つのインデックスパターン(FROM 句)で複数のビューを指定すると、それらは並列(ブランチ)で実行されます。ただし、リソース制限の観点から、ビュー・サブクエリ・FORK の組み合わせによる最大ブランチ数は「8」に制限されています。 自動最適化ロジック「Query Compaction(クエリの平坦化)」 通常、階層構造を持つブランチ(入れ子になった並列処理)はクエリプランを複雑化させるため、制限を超えるとエラーになります。しかし、ES|QL Viewsには Query Compaction という最適化ロジックが組み込まれています。 例えば、内部でそれぞれ2つのサブクエリ(2ブランチ)を持つ2つのビュー(view_x と view_y)を、メインクエリで同時に呼び出したとします。 論理的な階層: メインクエリ(2つのビューを呼び出す) → 各ビュー内部(2ブランチずつ) = 2階層の複雑なプラン 実際の挙動 (Compaction): ES|QLは自動的に内部のビューブランチを外側に「フラット化(展開)」し、単一レベルの「4つの並列ブランチ」として実行プランを再構成します。これによってネストによる階層制限の上限に抵触するのを防いでいます。 ⚠️ 注意:Query Compaction の適用条件 Query Compactionが適用されるには条件があります。ビュー定義内のサブクエリの後ろにコマンド(STATS など)が続いていない必要があります。後ろに別の処理が挟まっていると、ブランチを綺麗にバラしてフラット化できないため、ブランチ数制限の上限を超えてクエリが失敗する原因になります。 ※参考図 (Gemini による Query Compaction の説明図) 6. 現時点での制限事項(Tech Preview) 実戦投入する前に、現在の技術プレビュー(Tech Preview)段階における制限を把握しておきましょう。 Serverless環境での未対応: 初期フェーズにおいて、Serverless環境およびクロスプロジェクト検索では利用できません。 クロス・クラスター検索 (CCS) の制限: リモートクラスターのビューを指定する FROM cluster:view_name のようなクエリは、ビューではなく「インデックス」としてマッチしようとするため、現状はエラーになります。 クエリパラメータの隔離: メインクエリに指定したクエリパラメータ(引数)は、ビューの定義内には引き継がれません。 Query DSL フィルタの影響: 現段階ではメインクエリに指定したQuery DSLフィルタがビューの「ソースインデックス」にまで影響を及ぼす挙動になっています(将来のリリースで、ビューの「出力結果」に対してフィルタがかかるよう修正予定)。 まとめ ES|QL Viewsの登場により、Elasticsearchでのデータパイプライン構築の柔軟性が大幅に向上しました。 複雑なロジックをビューに閉じ込めることで、クエリの可読性が上がるだけでなく、チーム間でのデータ利用の標準化(抽象化レイヤーの構築)が容易になります。現在はTech Preview(Stack 9.4+)ですが、将来の正式リリースに向けて、今のうちに検証環境でこの強力な仮想インデックス機能を試してみてはいかがでしょうか? 参考URL https://www.elastic.co/docs/reference/query-languages/esql/esql-views https://www.elastic.co/search-labs/blog/elasticsearch-esql-logical-views The post ES|QL Views の概要とアーキテクチャ深掘り first appeared on Elastic Portal .
目次 1. はじめに 2. 検証環境 3. Downsampling の設定方法 4. Downsampling の実行と容量削減効果 5. ES|QL(TSコマンド)によるデータ確認と注意点 6. まとめ 7. 参考URL 1. はじめに Elastic Stackの比較的新しい機能として、 TSDS (Time Series Data Stream)  に対する  Downsampling(ダウンサンプリング)  がサポートされています。 これは、例えば「1秒ごとに収集された高頻度なメトリクス」を「1分ごと、あるいは1日ごとの統計値」へと自動的に集計・集約することで、データ量を劇的に削減し、長期保存データのクエリを高速化するための機能です。 今回は、この Downsampling 機能が実際にどのように動作し、どれほどの効果があるのかを検証してみました。 2. 検証環境 今回の検証は、以下の環境で行いました。 Elastic Stack:  v9.4.2 (Self-Managed, Trial License) 収集データ:  Elastic を動作させている Windows ホストのパフォーマンスメトリクス(OpenTelemetry Collector経由) 3. Downsampling の設定方法 Downsampling の実行方法はいくつかありますが、今回は最も実用的な  Index Lifecycle Management (ILM)  のポリシー内に組み込む方法を採用しました。 ILMポリシー名:   metric-otel-ilm-policy フェーズ遷移: Hotフェーズ:  データのインジェストと直近データの保持 Coldフェーズ:  移行タイミングで Downsampling を実行 Downsampling interval:   1 days  (1日粒度に集約) ※参考画面 💡  ※注意:  今回の  1 days  という設定値は、検証結果(変化)をわかりやすく確認するための極端な設定です。本番環境での推奨値ではありません。 4. Downsampling の実行と容量削減効果 設定後、データがある程度蓄積され、インデックスが Rollover して Cold フェーズへ移行するのを待ちました。 Cold フェーズ移行前後のデータ量の変化は以下の通りです。 ステータス ドキュメント数 インデックスサイズ Rollover 直前 (Hotフェーズ) 約 650,000 件 約 20 MB Cold フェーズ移行後 (Downsampling 適用後) 5,865 件 1.14 MB インデックスサイズが約20分の1、ドキュメント数にいたっては 約110分の1 にまで圧縮されており、期待通りの強力なデータ削減効果が確認できました。 (※注 メトリクスは24時間取得していたわけではありません。24時間取得し続けていたら、もっと大きな圧縮率になっていたと思われます。) ※Cold フェーズ移行後の参考画面 (※Rollover 直前のデータ量に関するスクリーンショットは取り損ねてしまいました。) 5. ES|QL(TSコマンド)によるデータ確認と注意点 Kibana の Discover から、ES|QL の  TS  コマンドを使用して、格納されたデータを集計してみます。 TS metrics-hostmetricsreceiver.otel-default* | WHERE state == "free" or state == "used" | STATS mem = AVG(metrics.system.memory.usage) BY TBUCKET(1h), state | KEEP `TBUCKET(1h)`, mem, state | SORT `TBUCKET(1h)` desc, state ※参考画面 クエリ結果の考察 出力された結果(一部抜粋)を確認すると、Downsampling の仕様が顕著に現れた挙動を示していました。 TBUCKET(1h) mem state データの特徴 Jun 12, 2026 @ 11:00:00.000 11,889,684,480 free (*1) Jun 12, 2026 @ 11:00:00.000 21,892,382,720 used (*1) Jun 12, 2026 @ 10:00:00.000 11,387,027,456 free (*1) Jun 12, 2026 @ 10:00:00.000 22,395,039,744 used (*1) … … … … Jun 9, 2026 @ 09:00:00.000 12,531,630,920.205 free (*2) Jun 9, 2026 @ 09:00:00.000 21,250,436,279.795 used (*2) Jun 8, 2026 @ 09:00:00.000 14,159,069,970.101 free (*2) Jun 8, 2026 @ 09:00:00.000 19,622,997,229.899 used (*2) Jun 7, 2026 @ 09:00:00.000 7,128,812,202.667 free (*2) Jun 7, 2026 @ 09:00:00.000 26,653,254,997.333 used (*2) … … … … (*1) 直近データ(未圧縮)、1時間単位で取得可能 (*2) Downsampling 適用済み(1日1バケットのみ出力) クエリでは TBUCKET(1h)(1時間ごと)の集計を要求しているにもかかわらず、Cold Tier に格納されている過去データ(Jun 9 以前)は「1日(24時間)に1データ」しか返ってきていません。 これは、Downsampling によってデータがすでに 1 days の粒度に丸められ、それより細かい時間軸のデータが消失しているためです(内部的に事前集計された代表値のみが残るため)。クエリ側でどれだけ細かいバケットを指定しても、保持されている最小粒度(今回は1日)でしか結果を得られないという特性がよくわかります。 検証用のデータのためクエリの速度向上までは測定できていませんが、集計対象のデータ量が劇的に少なくなっているため、理論上は従来よりも大幅な速度向上が見込めます。 6. まとめ 今回、Elastic TSDS の Downsampling 機能を検証し、以下のことが分かりました。 圧倒的なストレージ削減効果 ドキュメント数やデータサイズを劇的に削減できるため、長期的なトレンド分析用のインデックスにおいて非常に有効です。 データ粒度とのトレードオフ 今回の検証結果が示す通り、Downsampling を適用した期間のデータは、指定したインターバルより詳細な分析(例:瞬間的なスパイクの検知など)ができなくなります。 実運用においては、 直近のトラブルシューティング用に、Hot フェーズでは生データを数週間保持する。 それ以降の長期的なキャパシティプランニング用に、Warm/Cold フェーズで1時間〜1日粒度へDownsampling する。 といった、要件に合わせたメリハリのあるILMポリシーの設計が重要になりそうです。 7. 参考URL Configuring a time series data stream for downsampling Downsample Elastic’s metrics analytics gets 5x faster Configure downsampling directly in Elastic Streams, no more JSON editing needed The post Elastic TSDS の Downsampling 機能を試してみた first appeared on Elastic Portal .
サイオステクノロジー株式会社 Saman Elastic Stack を学んだりデモしたりするとき、いつも困ることがありました。 ちょうどいい練習用データがない という問題です。 本番ログは使えない、ランダムなダミーログは退屈すぎる。ES|QL の練習や SOC ラボ、ダッシュボードのデモには、もう少し「意味のあるデータ」が欲しい。そこで、自分で作ってみました。 GitHub に公開しています: GitHub – SIOS-Technology-Inc/elastic-eventgen Contribute to SIOS-Technology-Inc/elastic-eventgen development by creating an account on GitHub. github.com 目次 何のするツールか データセット linux.auth(SOC 寄り) network.flow(SRE / observability 寄り) どう使うのか どんな場面で役立つか 何のするツールか 一言でいうと、 ECS スタイルの NDJSON イベントを生成するシミュレーター です。Splunk の Eventgen にインスパイアされていますが、最初から Elastic Stack(ECS、ES|QL、observability、detection engineering)向けに設計しています。 ポイントは、ただランダムなログを吐き出すのではなく、 軽い「振る舞いのパターン」を持ったデータを作る ところです。 データセット 現在は2種類のジェネレーターが入っています。 linux.auth(SOC 寄り) Linux の auth.log を想定したデータです。20人の従業員、複数の部署、社内 IP、VPN、攻撃者 IP(国情報つき)、ブルートフォース攻撃のセッション、そして「正規ユーザーのタイポによるログイン失敗バースト」まで含まれています。攻撃と正常な失敗が同じ形をしているので、検知ルールの練習にちょうどいいデータになっています。 network.flow(SRE / observability 寄り) 日本の小さな EC サービスを模した、4つのマイクロサービス間の通信データです。普段は健全な状態ですが、`latency_spike` や `error_spike` のシナリオを有効にすると、特定の時間帯だけ遅延やエラーが上がる、というデータを生成できます。 どう使うのか ローカルで uv run python generator/main.py を実行するだけで NDJSON ファイルが出力されます。それを _bulk API か Kibana の File Upload で Elasticsearch に入れれば、すぐに Discover や ES|QL で触れます。 詳しいセットアップ手順、CLI オプション、ES|QL のサンプルクエリは GitHub の README にすべてまとめています。コピペで動くコマンドを並べているので、興味があれば README から順に試してみてください。 どんな場面で役立つか ES|QL を手を動かして覚えたいとき SOC アナリスト向けのトレーニング教材を作りたいとき ダッシュボードや検知ルールのデモ環境を素早く立ち上げたいとき お客様向けのワークショップや PoC の素材として 「本物そっくりだけど安全に使えるデータで、ちゃんと動くデモがしたい」場面で、特に役に立つはずです。 The post Elastic用の自動生成ログ「elastic-eventgen」を作りました first appeared on Elastic Portal .