Slide 1

Slide 1 text

Splunk Federated Search for S3 ✕ AWS連携 〜実践的データパイプライン構築のポイントを公開〜 2025/07/17 クラスメソッド株式会社 酒井 剛

Slide 2

Slide 2 text

Profile クラスメソッド クラウド事業本部 コンサルティング部 ソリューションアーキテクト 酒井 剛 クラスメソッド アライアンス事業部で Splunk をはじめセキュリティ SaaS のプリセールス・デリバリーを担当。 ↓ クラウド事業本部で AWS ソリューションを中心としたコンサルティ ング支援。 日々の提案活動の中で AWS と Splunk のインテグレーションスペシャ リストとして活動。

Slide 3

Slide 3 text

3 ©Classmethod, Inc. 2022年 世界一 SI Partner of the Year 8年連続 受賞 AWS資格 保有数 2800 以上 日本一 SI Partner of the Year 支援中の顧客 3600 以上 AWS プレミアティア パートナー 2023年 APJ一 SI Partner of the Year 2018,2020,2021年 会社紹介 クラスメソッド株式会社 AWSなら私たちといっしょに

Slide 4

Slide 4 text

目次 4 1. Splunk Federated Search for S3 (FSS3) とは 2. データパイプラインの構築 3. パフォーマンステスト 4. まとめ

Slide 5

Slide 5 text

Splunk Federated Search for S3 (FSS3) とは

Slide 6

Slide 6 text

Splunk Federated Search for S3 (FSS3) とは 6 .conf 23 で発表 みなさん使ってますか?

Slide 7

Slide 7 text

7 Splunk運用における悩み • クラウドの有効活用やDX移行が進むにつれて、ログの量が増える • Splunkは取り込みデータ量がライセンス費用の大部分

Slide 8

Slide 8 text

Splunk Cloud に 直接取り込まず に ダイレクトクエリ Splunk Cloud で利用可能 顧客AWSと同じリージョンの Splunk Cloud Stack DSUライセンスの購入 ・データスキャン量に対し、ライセンスを消費 ・1DSU = 10TB Scan 8 ライセンス概要 https://www.splunk.com/en_us/legal/licensed-capacity.html 改めて Splunk Federated Search for S3 (FSS3) とは

Slide 9

Slide 9 text

9 Amazon Simple Storage Service (Amazon S3) AWS Glue

Slide 10

Slide 10 text

どんな時にFSS3を使う? 10 ユースケース 想定場面 説明 低頻度アクセス 頻繁には利用しないが万が一のセキュリティ調査の際にアクセス 過去データの分析 セキュリティインシデント時の侵入経路調査等 過去データの統計 長期レポート コンプライアンス 規制を満たすための長期保管 ログ分析の中央化 クエリ実行を中央化して、簡便さ、素早さ、アクセス性を向上

Slide 11

Slide 11 text

データパイプラインの構築

Slide 12

Slide 12 text

12 図 Splunk Managed Account Customer Managed Account Ingest Actions S3 Standard File shares Social Devices Media Logs SQL/NoSQL DBs IaaS など SaaS 1 AWS Glue Data Catalog IAM Role Indexer Indexer Indexer Search Head 2 3

Slide 13

Slide 13 text

13 図 Splunk Managed Account Customer Managed Account Ingest Actions S3 Standard File shares Social Devices Media Logs SQL/NoSQL DBs IaaS など SaaS 1 AWS Glue Data Catalog IAM Role Indexer Indexer Indexer Search Head 2 3 データの送信

Slide 14

Slide 14 text

インジェストアクション 14 データの送信 – Splunk Cloud データ取り込み前に以下の処理を行う • データの変換 フィルタをかける マスクをかける • データの転送 Amazon S3転送時にパーティションを切る(詳細については後ほどのスライドで) ※フィルタリング・転送されたデータはライセンスカウントなし

Slide 15

Slide 15 text

Amazon S3 とは 15 オブジェクトストレージ キーと呼ばれる論理的なプレフィックスを含むオブジェクトを識別するための名前 実態はフラットな構造(ディレクトリ構造でない) sample-bucket hogehoge/object.txt fugafuga/object.txt バケット名 キー プレフィックス

Slide 16

Slide 16 text

16 フラットな構造 を持つストレージを検索するとどうなるのでしょうか?

Slide 17

Slide 17 text

17 sample-bucket a/file1 100GB a/file2 b/file1 b/file2 b/file3 300GB 200GB 50GB 350GB

Slide 18

Slide 18 text

18 sample-bucket a/file1 100GB a/file2 b/file1 b/file2 b/file3 300GB 200GB 50GB 350GB 1TB

Slide 19

Slide 19 text

19 DSUライセンスはデータスキャン量に応じたライセンス消費

Slide 20

Slide 20 text

20 DSUライセンスはデータスキャン量に応じたライセンス消費 データ量が増えるとスキャン量が増え、ライセンスを多く消費する

Slide 21

Slide 21 text

パーティショニング 21 データの送信 - AWS パーティショニング前 全てのデータを対象にスキャンする コスト効率と検索パフォーマンスが低下 s3://sample-bucket/LogFile

Slide 22

Slide 22 text

パーティショニング 22 データの送信 - AWS パーティショニング前 全てのデータを対象にスキャンする コスト効率と検索パフォーマンスが低下 s3://sample-bucket/LogFile s3://sample-bucket/ServerA/LogFile s3://sample-bucket/ServerB/LogFile s3://sample-bucket/ServerC/LogFile システム名や日付など /2025/07/09 プレフィックス

Slide 23

Slide 23 text

パーティショニング 23 データの送信 - AWS パーティショニング前 全てのデータを対象にスキャンする コスト効率と検索パフォーマンスが低下 プレフィックスをつけた後 パーティショニング単位でスキャンするための準備 コスト・検索の両方で◎ s3://sample-bucket/LogFile s3://sample-bucket/ServerA/LogFile s3://sample-bucket/ServerB/LogFile s3://sample-bucket/ServerC/LogFile システム名や日付など /2025/07/09 プレフィックス

Slide 24

Slide 24 text

インジェストアクションを使ったS3の自動プレフィックス 24 データの送信 – Splunk Cloud インジェストアクションの設定で ログのタイムスタンプを読み取り、 日付(YYYY/MM/DD)などの形式で 自動でプレフィックスをつけながらS3へ転送するこ とができる

Slide 25

Slide 25 text

25 図 Splunk Managed Account Customer Managed Account Ingest Actions S3 Standard File shares Social Devices Media Logs SQL/NoSQL DBs IaaS など SaaS 1 AWS Glue Data Catalog IAM Role Indexer Indexer Indexer Search Head 2 3 メタデータの登録

Slide 26

Slide 26 text

AWS Glue (AWS Glue Data Catalog)とは 26 メタデータリポジトリ 様々なデータソースのメタデータ(スキーマ、場所など)を一元的に保存・管理 メタデータによって、データソースの構造(テーブル・フィールド・レコード)や パーティションを認識し分析するための情報を定義

Slide 27

Slide 27 text

AWS Glue Data Catalogにメタデータを登録 27 メタデータの登録 - AWS • AWS Glue Data Catalogを使った登録 • AWS Glue Crawlerを使った登録 • Amazon Athena の DDL (Data Defined Language)による登録

Slide 28

Slide 28 text

28 図 Splunk Managed Account Customer Managed Account Ingest Actions S3 Standard File shares Social Devices Media Logs SQL/NoSQL DBs IaaS など SaaS 1 AWS Glue Data Catalog IAM Role Indexer Indexer Indexer Search Head 2 3 メタデータの登録

Slide 29

Slide 29 text

29 図 Splunk Managed Account Customer Managed Account Ingest Actions S3 Standard File shares Social Devices Media Logs SQL/NoSQL DBs IaaS など SaaS 1 AWS Glue Data Catalog IAM Role Indexer Indexer Indexer Search Head 2 3 Amazon Athena メタデータの登録

Slide 30

Slide 30 text

30 メタデータの登録(Amazon Athena DDL) - AWS Amazon Athena のクエリエディタや CLI から DDLステートメント を発行

Slide 31

Slide 31 text

31 メタデータの登録(フィールド定義) - AWS CREATE EXTERNAL TABLE apache_logs ( `client_ip` string, `client_id` string, `user_id` string, `request_received_time` string, `method` string, `client_request` string, `http_version` string, `server_status` string, `returned_obj_size` string, `http_referer` string, `user_agent` string ) ROW FORMAT SERDE 'com.amazonaws.glue.serde.GrokSerDe' WITH SERDEPROPERTIES ( 'input.format'='^%{IPORHOST:client_ip} %{USER:client_id} %{USER:user_id} \\[%{HTTPDATE:request_received_time}\\] \"%{WORD:method} %{NOTSPACE:client_request} HTTP/%{NUMBER:http_version}\" %{NUMBER:server_status} %{NUMBER:returned_obj_size} \"%{DATA:http_referer}\" \"%{DATA:user_agent}\"$’ ) STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3:////'; 例:Apache access log の場合 参考: https://docs.aws.amazon.com/ja_jp/athena/latest/ug/q uerying-apache-logs.html • CREATE EXTERNAL TABLE でフィールドを定 義 • ROW FORMAT SERDE で Grok の利用を指定 • WITH SERDEPROPERTIES で Grokパターン を使ってフィールドを抽出 参考: https://docs.aws.amazon.com/ja_jp/athena/latest/ug/g rok-serde.html

Slide 32

Slide 32 text

32 メタデータの登録(パーティション定義) - AWS CREATE EXTERNAL TABLE apache_logs ( `client_ip` string, `client_id` string, `user_id` string, `request_received_time` string, `method` string, `client_request` string, `http_version` string, `server_status` string, `returned_obj_size` string, `http_referer` string, `user_agent` string ) PARTITIONED BY ( `day` string ) ROW FORMAT SERDE 'com.amazonaws.glue.serde.GrokSerDe' WITH SERDEPROPERTIES ( 'input.format'='^%{IPORHOST:client_ip} %{USER:client_id} %{USER:user_id} \\[%{HTTPDATE:request_received_time}\\] \"%{WORD:method} %{NOTSPACE:client_request} HTTP/%{NUMBER:http_version}\" %{NUMBER:server_status} %{NUMBER:returned_obj_size} \"%{DATA:http_referer}\" \"%{DATA:user_agent}\"$’ ) STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3:////'; 例:Apache access log の場合 • PARTITIONED BY でパーティションキーを設 定 参考: https://docs.aws.amazon.com/ja_jp/athena/latest/ug/p artitions.html

Slide 33

Slide 33 text

33 メタデータの登録(パーティションのロード/追加) - AWS 例:Apache access log の場合 • ALTER TABLE で存在するパーティションを指 定してロード 参考: https://docs.aws.amazon.com/ja_jp/athena/latest/ug/p artitions.html s3://sample-bucket/web/2025/07/01/access_log s3://sample-bucket/web/2025/07/02/access_log s3://sample-bucket/web/2025/07/03/access_log ・・・

Slide 34

Slide 34 text

34 メタデータの登録(パーティションのロード/追加) - AWS ALTER TABLE apache_logs ADD IF NOT EXISTS PARTITION (day=‘2025-07-01') ALTER TABLE apache_logs ADD IF NOT EXISTS PARTITION (day=‘2025-07-02') ALTER TABLE apache_logs ADD IF NOT EXISTS PARTITION (day=‘2025-07-03’) ・ ・ ・ 例:Apache access log の場合 • ALTER TABLE で存在するパーティションを指 定してロード 参考: https://docs.aws.amazon.com/ja_jp/athena/latest/ug/p artitions.html s3://sample-bucket/web/2025/07/01/access_log s3://sample-bucket/web/2025/07/02/access_log s3://sample-bucket/web/2025/07/03/access_log ・・・ ロード

Slide 35

Slide 35 text

35 メタデータの登録(パーティションのロード/追加) - AWS ALTER TABLE apache_logs ADD IF NOT EXISTS PARTITION (day=‘2025-07-01') ALTER TABLE apache_logs ADD IF NOT EXISTS PARTITION (day=‘2025-07-02') ALTER TABLE apache_logs ADD IF NOT EXISTS PARTITION (day=‘2025-07-03’) ・ ・ ・ 例:Apache access log の場合 • ALTER TABLE で存在するパーティションを指 定してロード 参考: https://docs.aws.amazon.com/ja_jp/athena/latest/ug/p artitions.html 運用上の課題 パーティションが追加されるたびにロードを 行う必要がある ↓ パーティション管理が必要、運用負荷が膨大 s3://sample-bucket/web/2025/07/01/access_log s3://sample-bucket/web/2025/07/02/access_log s3://sample-bucket/web/2025/07/03/access_log ・・・ ロード

Slide 36

Slide 36 text

36 メタデータの登録 - AWS パーフォーマンス上の課題 • パーティショニングによって、スキャン量の軽減には成功するものの、経年とと もにパーティション数があまりにも増えるとクエリ時間が大幅に伸びる なぜか? • スキャン時にGetPartitionsを実行。パーティション一覧の取得、利用するパー ティションの絞り込みの処理が膨大になる

Slide 37

Slide 37 text

Partition Projection 37 メタデータの登録 - AWS CREATE EXTERNAL TABLE apache_logs ( `client_ip` string, `client_id` string, `user_id` string, `request_received_time` string, `method` string, `client_request` string, `http_version` string, `server_status` string, `returned_obj_size` string, `http_referer` string, `user_agent` string ) PARTITIONED BY ( `day` string ) ROW FORMAT SERDE 'com.amazonaws.glue.serde.GrokSerDe' WITH SERDEPROPERTIES ( 'input.format'='^%{IPORHOST:client_ip} %{USER:client_id} %{USER:user_id} \\[%{HTTPDATE:request_received_time}\\] \"%{WORD:method} %{NOTSPACE:client_request} HTTP/%{NUMBER:http_version}\" %{NUMBER:server_status} %{NUMBER:returned_obj_size} \"%{DATA:http_referer}\" \"%{DATA:user_agent}\"$’ ) STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3:////’ TBLPROPERTIES ( 'projection.day.format'='yyyy/MM/dd’, 'projection.day.interval'='1’, 'projection.day.interval.unit'='DAYS’, 'projection.day.range'='2025/01/20,2025/03/18’, 'projection.day.type'='date’, 'projection.enabled'='true’, 'storage.location.template'='s3:////${day}’ ) パーティションの値と場所をテーブルのプロパ ティ設定を基に自動で算出 → ALTER TABLE によるパーティションロード の必要なし メモリ内で計算処理を行うため高速 → GetPartitions を呼び出す必要なし • TBLPROPERTIES でテーブルプロパティを設定 参考: https://docs.aws.amazon.com/ja_jp/athena/latest/ug/p artition-projection-supported-types.html 最終的なAthena クエリで 実行するDDL

Slide 38

Slide 38 text

38 メタデータの登録 - AWS

Slide 39

Slide 39 text

39 図 Splunk Managed Account Customer Managed Account Ingest Actions S3 Standard File shares Social Devices Media Logs SQL/NoSQL DBs IaaS など SaaS 1 AWS Glue Data Catalog IAM Role Indexer Indexer Indexer Search Head 2 3 Amazon Athena データアクセス権限 /マッピング

Slide 40

Slide 40 text

Federated Providers 40 データアクセス権限 – Splunk Cloud Splunk Cloud が Glue Data Catalog を参照するためのポリシー 設定 Splunk Cloud が S3 にアクセスす るためのポリシー設定

Slide 41

Slide 41 text

Federated Index 41 マッピング – Splunk Cloud Splunk Cloudで内部時間として扱えるようにGlue Data Catalogの時間フィールドをマッピング タイムフォーマット変数: https://help.splunk.com/en/splunk-cloud-platform/search/search-reference/9.3.2411/time- format-variables-and-modifiers/date-and-time-format-variables Splunk Cloud検索時にパーティションフィールドを識別で きるようにマッピング

Slide 42

Slide 42 text

パフォーマンステスト

Slide 43

Slide 43 text

検索してみる 43 いざ!Federated Search! sdselect コマンドでクエリを書く SQLライクで通常のSPLとは構文が異なる 基本構文 | sdselect count FROM federated:access_logs WHERE field2 = ‘apple’ GROPUBY field1

Slide 44

Slide 44 text

パフォーマンステスト 44 いざ!Federated Search! 3つのパーティションに分割し、異なるオブジェクト数とデータ量のサンプルを用意 S3パーティション オブジェクト数 圧縮形式 データ量 /2025/01/27 567 gzip 475MB /2025/01/28 2,695 gzip 3.4GB /2025/01/29 5 gzip 1.7MB

Slide 45

Slide 45 text

/2025/01/27 45 パフォーマンステスト

Slide 46

Slide 46 text

/2025/01/27 46 パフォーマンステスト

Slide 47

Slide 47 text

/2025/01/28 47 パフォーマンステスト

Slide 48

Slide 48 text

/2025/01/28 48 パフォーマンステスト

Slide 49

Slide 49 text

/2025/01/29 49 パフォーマンステスト

Slide 50

Slide 50 text

/2025/01/29 50 パフォーマンステスト

Slide 51

Slide 51 text

結果 51 パフォーマンステスト S3パーティション オブジェクト数 データ量 圧縮形式 検索時間 /2025/01/27 567 475 MB gzip 29.038 秒 /2025/01/28 2,695 3.4 GB gzip 51.904 秒 /2025/01/29 5 1.7 MB gzip 2.352 秒

Slide 52

Slide 52 text

AWSのコストを試算してみる 52 パフォーマンステスト S3パーティション オブジェクト数 データ量 圧縮形式 検索時間 /2025/01/27 567 475 MB gzip 29.038 秒 /2025/01/28 2,695 3.4 GB gzip 51.904 秒 /2025/01/29 5 1.7 MB gzip 2.352 秒

Slide 53

Slide 53 text

AWSのコストを試算してみる(ざっくり月換算) 53 パフォーマンステスト • Amazon S3 • S3 標準: 最初の50TB $0.025/GB, 次の450TB $0.024/GB, 500TB以上 $0.023/GB • 3.4GB x 30日 x $0.025 = $2.55 / 月 • PUT API: $0.0047/1,000リクエスト • 2695(オブジェクト数) / 1,000 x $0.0047 = $0.013 / 月 • データ転送: IN 無料 • $0 / 月 • AWS Glue Data Catalog • メタデータのストレージ: 最初の100万個のメタデータ 無料, 以降 $1/100万個 • $0 / 月 • メタデータのリクエスト: 最初の100万回のメタデータ無料,以降 $1/100万回 • $0 / 月 ※料金算出の計算式は厳密ではありませんのであくまで参考程度でご参照ください

Slide 54

Slide 54 text

コンパクション 54 パフォーマンステスト(追加) • コンパクション = 複数ファイルのデータをまとめる +(JSON -> Parquet) S3パーティション オブジェクト数 データ量 圧縮形式 検索時間 /2025/07/02 26,123 2.5 GB なし 40.118 秒 S3パーティション オブジェクト数 データ量 圧縮形式 検索時間 /2025/07/02 1 1.6 MB Snappy 3.682 秒 コンパクション AWS Glueジョブでやってみた!

Slide 55

Slide 55 text

分かったこと 55 パフォーマンステスト • 構文がSQLライクなので、SPLとは異なるものの敷居は低い • 検索時間が30秒を超えると調査などの利用には辛い • ファイル数が増えると検索時間も延びる(だろう)ので、データのコンパクション (複数の小さいファイルをまとめる)なども検討する • インジェストアクションでコンパクションに対応したらすごそう(期待!)

Slide 56

Slide 56 text

まとめ

Slide 57

Slide 57 text

57 まとめ • FSS3 (Splunk Federated Search for S3) はデータを直接取り込まずにダイレクトク エリ • S3 はフラット構造なストレージなため、S3、Glueを使ったパーティショニングでコ スト・検索パフォーマンスをアップ • 検索スピードの面で使い所の見極めは必要だが、ひと工夫加えたり、Splunk側での今 後のアップデートにも期待 • FSS3 を使って未活用データを活用

Slide 58

Slide 58 text

58 参考 Splunk Federated Search for S3 で大容 量かつ低頻度なアクセスデータに対 してコストを最小にSIEM機能を活用 する Splunk Federated Analytics を試してみ た

Slide 59

Slide 59 text

59 おわり