Logstash S3入力プラグインを使用してS3アクセスログを処理しています。
アクセスログはすべて1つのバケットに保存され、数千に上ります。特定の接頭辞を持つS3オブジェクトのみを含めるようにプラグインを設定しました(日付に基づいて2016-06など)。
ただし、Logstashがバケット内のすべてのオブジェクトを再ポーリングしており、以前に分析したオブジェクトを考慮していないことがわかります。
{:timestamp=>"2016-06-21T08:50:51.311000+0000", :message=>"S3 input: Found key", :key=>"2016-06-01-15-21-10-178896183CF6CEBB", :level=>:debug, :file=>"logstash/inputs/s3.rb", :line=>"111", :method=>"list_new_files"}
すなわち
Logstashは毎分(または設定した間隔)にバケットの先頭から開始し、見つかったすべてのオブジェクトに対してAWS API呼び出しを行います。これは、オブジェクトの最終変更時刻が何であるかを見つけるためにこれを行うようで、分析に関連するファイルを含めることができます。これは明らかにすべてを遅くし、アクセスログのリアルタイム分析を提供しません。
最近のファイルのみに一致するように常にプレフィックスを更新する以外に、Logstashに古いS3オブジェクトの読み取りをスキップさせる方法はありますか?
プラグインにはsincedb_pathパラメータがありますが、これは、最後に分析されたファイルに関するデータが書き込まれる場所にのみ関連しているようです。
これはこのプラグインのデフォルトの動作のようですので、プラグイン機能を使用して管理する必要があります。
基本的に、同じバケットのプレフィックスを持つオブジェクトをバックアップしてから削除するようにプラグインを設定する必要があります。このようにして、Logstashは次の間隔後にバケットをポーリングするときにオブジェクトをスキップします。
サンプル構成:
s3 {
bucket => "s3-access-logs-eu-west-1"
type => "s3-access"
prefix => "2016-"
region => "eu-west-1"
sincedb_path => "/tmp/last-s3-file-s3-access-logs-eu-west-1"
backup_add_prefix => "logstash-"
backup_to_bucket => "s3-access-logs-eu-west-1"
interval => 120
delete => true
}
この構成では、120秒ごとにバケットをスキャンして、
2016-
それらのオブジェクトを処理し、プレフィックスを付けて同じバケットにバックアップします
logstash-
次にそれらを削除します。
つまり、次のポーリング間隔では検出されません。
2つの重要な注意事項:
Backup_add_prefixを単独で使用することはできません(ドキュメントで推奨されています)。このパラメーターは、backup_to_bucketと組み合わせてのみ使用できます
S3とのインターフェースに使用しているIAMアカウント/ロールに、使用しているバケットに対する書き込み権限があることを確認してください(他のLogstashはオブジェクトを削除/名前変更できません)。