AWS CloudWatch LogsからFirehose経由でログを収集

Tips & Tricks Paul Davies

CloudWatch Logsを使用すれば、AWS環境からすべてのパフォーマンスログと運用ログを1カ所に収集することができます。この柔軟なプラットフォームのおかげで、多くのログソースを、ソースとログ形式ごとに複数のロググループにまとめて収集することができます。たとえば、VPCフローログ、CloudTrailログ、RDSログはすべてログ構造が異なります。この記事では、あらゆる形式のログファイルをCloudWatchからSplunkに取り込む方法、そして別のユースケースのために用意されたサンプルを拡張あるいは変更できるケースについてご紹介します。

Splunkは、AWSアドオンを使用する方法、Lambda 関数 (ラムダ式)やKinesis Firehoseを介してサーバーレスで取り込む方法、さらにはProject Trumpetを使用して自動的にサーバーレスで取り込む方法など、AWSデータを取り込むためのさまざまな方法を提供しています。しかし、CloudWatch Logsからの取り込みには、大規模なログ収集を実行でき、複数のAWSアカウントからログを収集する柔軟性を備えたKinesis Firehoseがおすすめです。

Firehoseの機能の1つに、Lambda関数を呼び出してログコンテンツの変換や処理を行うオプションがあります。これにより、CloudWatchログから取得したメッセージパッケージを開いてSplunkイベントに変換できるほか、ログコンテンツに基づいて、ソース、ソースタイプ、ホスト、インデックスなどのイベント情報を、柔軟に設定できるようになります。

この変換のバージョンの1つは、SplunkとAWSがFirehoseの統合を発表した際にすでにご紹介しています。この例で使用されたLambda関数は、VPCフローログを抽出したあと、それらのログをSplunkに送信します。この関数については、AWS LambdaのBlueprint、kinesis-firehose-cloudwatch-logs-processorまたは kinesis-firehose-cloudwatch-logs-processor-python でご覧いただけます。このブログではさらに一歩進み、CloudWatchのあらゆるログに使用できる、Splunkでの一般的なログ収集方法の基本事項についてご説明します。

以下の図は、Firehoseでログを取り込む方法のアーキテクチャをまとめたものです。

Firehoseでログを取り込む方法のイメージ図

FirehoseとSplunkの設定

FirehoseとSplunkの設定に必要な手順のほとんどは、以前のブログでご確認いただけます。また、こちらに記載されている設定プロセスも参照してください。このページには、前述のブログに記載された手順のあとに実行する別の手順が記載されているほか、新しいLambda関数について追記されています。

新しいLambda 関数 (ラムダ式)の機能

以前のブログでは、Lambda関数のテンプレートを使ってログストリームから個々のログイベントを抽出し、そのイベントを変更することなくFirehoseに送信しています。これらはJSON形式ではなく単純なVPCフローログであるため、ログのコンテンツをRawイベントとして簡単にSplunkに送信できます。この標準テンプレートでは、注意するべきいくつかの重要なポイントがあります。

新しいLambda関数を使用すると、CloudWatchからログを収集し、JSON形式のSplunk HECイベントとしてパッケージできます。これにより、さらに以下のメリットが得られます。

この関数テンプレートのサンプルは、以下のことを実行します。

  1. CloudWatchからFirehoseに送信されたメッセージバンドルを受け取り、データを解凍します。

  2. 各「message」ペイロードが「transformLogEvent」関数へと送信され、ペイロードメッセージがSplunk JSONイベント形式に変換されます。

    • イベントのHost値が、FirehoseストリームのARNに設定されます。
    • Sourceは、サブスクリプションフィルター名とCloudWatchのロググループ名の両方の値に設定されます。
    • ロググループ名に「CloudTrail」が含まれている場合はSourcetypeが「aws:cloudtrail」に設定され、「VPC」が含まれている場合は「awsvpcflow」に設定されます。それ以外の場合はすべて、Lambda関数設定の環境変数の値に設定されます。
    • Indexは関数内では設定されませんが、ロググループ名またはサブスクリプションフィルター名の内容によって簡単に設定できます。
  3. 結果をFirehoseに返します。

HECイベントの形式を設定する方法について詳しくは、こちらをご覧ください。

次のステップ

この変換関数の例では、Firehoseに送信されるイベントの形式をSplunk HEC JSON形式に変換し、ログ情報に基づいて、イベントの詳細の一部を設定する方法を示しています。関数を変更すれば、柔軟性を高めたり、要件に合わせたりできます。簡単な変更を行うだけで、Splunkのインデックス、ホスト、ソース、ソースタイプを独自の方法で設定できるようになります。以下に、2つの例を示します。

1) CloudWatchにログを送信するRDSインスタンスがある場合、1つのFirehoseで複数のRDSインスタンスやログタイプを使用できるようにロググループ名を使用できます。たとえば、2つのRDSインスタンスがあり、それらのログが以下のロググループに送信されるとします。

/aws/rds/mydatabse1/audit 
/aws/rds/mydatabse1/error 
/aws/rds/mydatabse2/audit
/aws/rds/mydatabse2/error 

監査ログとエラーログではソースタイプが異なるため、そのログが監査ログなのかエラーログなのかによって簡単にソースタイプの値を設定できます。この場合、同じFirehoseにサブスクリプションフィルターを追加するだけで、他のデータベースログからロググループを追加することもできます。Splunk側で変更を行う必要はありません。

2) もう1つの例は、複数のAWSアカウントからログを収集する際、セキュリティ上の理由からこれらのログを別々のSplunkインデックスに保存する必要がある場合です。変換関数にインデックスの値を設定すれば、関数によって各アカウントに異なるインデックス名が設定されます。

Splunkのメリットをどうぞお試しください。

関連記事

Splunkクイックガイド:クエリー、SPL、正規表現、コマンド
Tips
24 分程度

Splunkクイックガイド:クエリー、SPL、正規表現、コマンド

このブログ記事では、Splunk CloudとSplunk Enterpriseでよく使われる、クエリー、コマンド、正規表現、SPLなどの基本をご紹介します。
書籍「Splunkエンジニアのための教科書」発刊に寄せて
Tips
3 分程度

書籍「Splunkエンジニアのための教科書」発刊に寄せて

本書では、Splunkの基本的な使い方から、セキュリティイベントの検出、運用管理の効率化、さらにAIを活用した高度な技術に至るまで、幅広いトピックを扱います。本書を通じて、Splunkを利用してシステムの健全性を監視し、障害の早期発見と対応、セキュリティ強化の方法を習得することができます。Splunkをどのように活用するか詳細に解説します。
SPLのコマンドタイプを学ぶ~効率的なサーチの実行順序とその調査方法~
Tips
8 分程度

SPLのコマンドタイプを学ぶ~効率的なサーチの実行順序とその調査方法~

Splunkでは、サーチを実行する際に独自言語であるSPL(Search Processing Language)を使用します。今回は、SPLのタイプについてそれぞれ解説し、効率的なサーチの実行順序とその調査ツールであるSearch Job Inspectorの使い方をお伝えします。