Amazon Data FirehoseでCloudTrailログをSplunkに取り込む
10/3にSplunkパートナー向けオフラインの勉強会を開催していただきました。
その中でPUSH型取り込みのAmazon Data Firehoseを連携させたデータ取り込みをハンズオン形式で実施したので、その内容を皆様に共有させていただきたいと思います。
講師およびハンズオンの概要
- 講師: Splunk APAC クラウドテクニカルストラテジスト Trav Kane(T-REX)さん
- 所要時間: 20分
- 前提知識: Splunk Basic Workshop受講済みレベルの知識(Splunkの不定期開催ワークショップから申し込み可)、AWSサービスに関する一般知識
- ハンズオン資料: こちらに公開されています
- コンテンツ: 上記資料のLAB3 - CloudTrail logs to Splunk via Amazon Data Firehose PUSH method
※本ブログは上記ハンズオン内容に沿った内容となっております。
設定の流れ
- SplunkコンソールでHEC(HTTP Endpoint Collector)を作成
- CloudTrail証跡ログの設定
- Amazon Data Firehoseの設定
- CloudWatchサブスクリプションフィルターの設定
- Splunkコンソールでデータ取り込み確認
データ送信アーキテクチャ
HECはHTTPプロトコルでSplunk側がログを受け取るためのエンドポイントを作成します。
送信側はアウトバウンドで、Splunk側はインバウンドで443または80の通信許可が必要です。
このアーキテクチャを採用した場合、ほぼリアルタイムでログの取り込みが可能となり、大量のログ送信に対しても高い信頼性で取り込みを行うことができます。
その他のアーキテクチャについてはこちらでも紹介しておりますので、気になる方はぜひご覧ください。
コストは以下がおおよその目安です。
- 想定条件: 月1TBのログデータ(毎秒約80レコード発生することを想定)
- 1ヶ月間のレコード数: 80レコード x 60秒 x 60分 x 730時間(1ヶ月) = 210,240,000レコード / 月
- 1レコード5KB未満の容量と想定して、計算ユニットが5KB数の倍数に切り上げられるので: 210,240,000 レコード x 5 KB = 1,051,200,000.00 KB
- 1,051,200,000.00 KB / 1,048,576 KB in a GB = 1,002.50244140625 GB
- 1ヶ月分の想定コスト: 1,002.50244140625 GB x 0.036 USD = 36.09 USD / 月
Amazon Data Fireshose料金
ログ送信アーキテクチャ別のコストに関する参考資料
ただ注意すべき点としては、Data Firehoseを連携するには同時にCloudWatch Logsと連携が必要なことがあることです。
Data Firehoseだけだとさほど料金がかからないと思っても、CloudWatch Logsに取り込む構成に変える場合はこちらでも料金がかかってしまいます。
またCloudWatch Logsのインジェスト料金は割高なので、注意が必要です。
執筆時点ですと、アジアパシフィック(東京)で USD 0.76/GB
なので、月に1TBのログが発生すると以下の料金目安になります。
- 0.76 USD x 1,000 = 760 USD / 月
CloudWatch Logs料金
コスト観点ではData Firehoseと連携するのに、CloudWatch Logsを経由しなくても良いAWS WAFやVPCフローログなどのサービスがおすすめです。
やってみる
最初にSplunkのデータ入力の設定でHEC(HTTP Endpoint Collector)を作成します。
Splunkコンソールで、設定 > データ入力 に進みます。
HTTPイベントコレクター > 新規作成
コレクターの名前(任意)と インデクサー確認を有効化
にチェックします。
インデクサー確認を有効化
はデータ取り込み時のデータ損失を防ぐための機能です。
また、インデクサー確認を有効化
はSplunk Enterpriseでサポートしていますが、Splunk CloudではAmazon Data Firehoseのみでサポートされています。
データ取り込みの信頼性が増すため、チェックすることがおすすめですが、Splunk側でackIDとステータス情報をメモリ上に保存する点は覚えておいた方が良いです。
詳細についてはこちらの公式ドキュメントを参照してください。
ソースタイプは aws:cloudtrail
を選択します。インデックスは任意でOKですが、このワークショップではあらかじめ aws-data
というインデックスを作成しているので、これを選択します。
確認して、作成すると、トークン値が発行されるのでコピーしておきます。(後から設定からコレクターを選択して確認することもできます)
次はAWSコンソールの操作になります。
CloudTrailで証跡ログの設定をします。
CloudTrailの名前を入力します。
S3バケットを新規作成します。
KMSキーを設定する場合は設定を行います。
CloudWatchログを有効にして、ロググループの作成とIAMロールの作成を行い、作成します。
CloudWatchで作成したロググループでログが出力されていることを確認します。
ログが生成されていない場合は少し待ちます。
次にData FirehoseでFirehoseストリームを作成します。
ソースは Direct PUT
、送信先は Splunk
を選択します。
Firehoseストリーム名は任意の名前で入力します。
解凍をオンにする
にチェック、メッセージ抽出をオンにする
をチェックします。
CloudWatch Logs経由のログはGZipで圧縮されているので、この機能を使って解凍してから送信する必要があります。
このオプションの補足情報としてこちらも参考にしていただけます。
アクセスしているSplunkコンソールURLを確認して Splunkクラスターエンドポイント
に入れます。
利用しているSplunkの環境によってエンドポイントのURLやポートが違うので、以下の公式ドキュメントで確認してください。(今回はSplunk Enterprise環境です)
認証トークン
に前の手順で作成したHECのトークンを入れます。
次にCloudWatchサブスクリプションフィルターに設定するIAMロールを作成します。
IAMで新規ロール作成します。
カスタム信頼ポリシーを選択します。
カスタム信頼ポリシーにステートメントを入力します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "logs.us-west-1.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
許可ポリシーはここでは選択せずに、ロール名をつけて保存します。
作成したロールを選択して、ポリシーを追加していきます。
以下のインラインポリシーを追加しました。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"firehose:*"
],
"Resource": "arn:aws:firehose:<your-aws-region>:<your-aws-account>:deliverystream/*",
"Effect": "Allow"
}
]
}
ポリシーの名前をつけて保存します。
同じように、以下のインラインポリシーをもう一つ追加します。
※ロール名は自分で設定したロール名を指定してください。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"iam:PassRole"
],
"Resource": "arn:aws:iam::*:role/SplunkGDIWorkshopCTrailSubscriptionRole",
"Effect": "Allow"
}
]
}
ポリシーの名前をつけて保存します。
以下のようなロールができていればOKです。
次にCloudWatchでサブスクリプションフィルターの設定を行います。
CloudTrailログ証跡のロググループを選択します。
サブスクリプションフィルターのタブで作成を選択し、Amazon Data Firehoseサブスクリプションフィルターを作成をします。
Data Firehoseストリームを選択し、アクセス許可で先程つっくったIAMロールを設定します。
ストリーミングを開始
で設定を保存します。
これでログ連携の設定ができたので、Splunk側で入ってきているか確認します。
入ってきたことが確認できました!
まとめ
データ送信連携のアーキテクチャの中で最も信頼性とリアルタイム性の高い、Amazon Data Firehoseを使ったログ連携方法についてご紹介しました。
大容量のログソースでは抑えておきたいアーキテクチャになるかと思います。
またAmazon CloudWatchを経由するアーキテクチャになる場合は、コストに注意が必要な点は覚えておく必要があります。
最後にもう一度、設定箇所や関連するサービスをまとめておきます。
Splunk側
- データの入力(HEC)設定
AWS側
- 取得対象となるサービスのログ出力設定(今回はCloudTrail、出力先はCloudWatch Logs)
- Data Firehoseのストリーム設定
- IAMで各種権限設定
- CloudWatch Logsのサブスクリプション設定(出力先がCloudWatch Logsの場合)
最後までお付き合いいただきありがとうございました。