AWSの多種多彩なサービスが生成したログ、つまり、S3サーバーアクセスログやELBアクセスログ、CloudWatchログ、VPCフローログなどのログは、S3バケットに格納できます。たとえばS3サーバーログには、バケットに対して行われたリクエストの詳細な記録が含まれており、情報としては大変有用です。しかしAWSは複数のオペレーションで複数の.txt
ファイルを作成するため、そのログファイルにどのオペレーションの記録が含まれるかは、.txt
ファイルをいちいち開かないとわかりません。また、S3サーバーアクセスログは複雑なフォーマットで記録されており、.txt
ファイルを開くだけで必要な情報を見つけることは困難です。
でも、ご心配には及びません。Elastic Stackを使えば、あらゆるAWSのログを簡単にインデックス、分析、および可視化でき、そこの含まれる重要な情報を活用することができます。この記事で、その簡単な手順を具体的にご説明します。
はじめに
Filebeat 7.4より、オプションにs3インプットが加わりました。ユーザーはこのオプションでS3バケットのファイルからイベントを取得し、各ファイルの個々の行を個別のイベントとして扱うことができます。s3インプットに加えて、7.5よりFilebeat AWSモジュールが新たに2つのファイルセット、すなわちs3access
ファイルセットとelb
ファイルセットのサポートを開始しました。これらを使えば、S3のファイルをダウンロードしたり、手動で1つひとつ開いたりすることなく、異なるS3バケットからログを1か所に収集し、可視化・分析できます。
各S3バケットからすべてのログファイルをポーリングすれば大きなラグが生じます。今回の手法では、このラグを回避するために通知とポーリングを組み合わせます。つまり、新規のS3オブジェクトが生成された際、Amazon S3にAmazon Simple Queue Service(SQS)を使って通知を実行します。Filebeatのs3インプットはSQSを確認してS3での新規オブジェクト生成に関するメッセージがあるかどうか判断し、また、そのメッセージにある情報を使ってS3バケットのログを取得します。このセットアップに、各S3バケットからの定期的なポーリングは必要ありません。ポーリングがなくても、Filebeat s3インプットは確かなスピードと信頼性で、ほぼリアルタイムにS3バケットからのデータ収集を実施します。
SQSを使ってS3イベント通知を設定する
このセクションにある4つの手順に沿って、AWS S3にリクエストするバケットに関する通知を設定すると、s3:ObjectCreated:*
タイプのイベントをAWS SQSキューにパブリッシュできます。詳しくは、configure a bucket notification example walkthrough(バケット通知設定の事例ウォークスルー)をご覧ください。
手順1.SQSキューとS3バケットを作成する
Amazon SQSコンソールを使って、AWSの同じリージョンにSQSキューとS3バケットを作成します。
手順2.SQSキューを設定する
以下のキューポリシーを使用して、キューに付属するアクセスポリシーを書き換えます。
{ "Version":"2012-10-17", "Id": "example-ID", "Statement": [ { "Sid": "example-statement-ID", "Effect":"Allow", "Principal": { "AWS":"*" }, "Action": [ "SQS:SendMessage" ], "Resource": "<SQS-queue-ARN>", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:*:*:<bucket-name>" } } } ] }
<sqs-queue-arn>
および<bucket-name>
は、お使いのSQSキューARN(Amazonリソースネーム)とS3バケット名にかならず変更してください。
手順3.S3バケットを設定する
Amazon S3コンソールを使ってAmazon S3にリクエストする通知を追加し、 s3:ObjectCreated:* タイプのイベントをAmazon SQSキューにパブリッシュします。
手順4.S3-SQSのセットアップをテストする
S3バケットにオブジェクトをアップロードし、Amazon SQSコンソールにイベント通知が来るか確認します。
Filebeat s3インプットを使う
Filebeat s3インプットを有効化すると、AWS S3バケットからログを収集できるようになります。各ログファイルにある1つの行が個別のイベントとして扱われ、設定済みのFilebeatアウトプット(例:Elasticsearch)に格納されます。s3インプットのみを使用する場合、ログメッセージはパースされることなく、各イベントのmessage
フィールドに格納されます。
SQSメッセージが参照するS3オブジェクトを処理する際に、設定された可視性タイムアウトの半分を経過しても処理が続いている場合、処理中のメッセージがキューに戻ることのないよう、そのSQSメッセージの可視性タイムアウトはリセットされます。S3オブジェクトの処理中にエラーが生じた場合、プロセスは停止し、SQSメッセージはキューに戻されます。
手順0:IAMポリシーを作成する
IAMポリシーは、AWS環境内のオブジェクトの権限を定義するエンティティです。特定のパーミッションを規定した、Filebeat用のカスタマイズされたIAMポリシーを作成することが必要です。詳細については、IAMポリシーの作成をご覧ください。以下は、SQSとS3へのアクセスに必要な権限のリストです。- s3:GetObject
- sqs:ReceiveMessage
- sqs:ChangeMessageVisibility
- sqs:DeleteMessage
手順1:Filebeatをインストールする
Filebeatをダウンロード、およびインストールする場合、システムによって使用するコマンドが異なります。たとえばMacの場合、次の通りです。
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.5.1-darwin-x86_64.tar.gz tar xzvf filebeat-7.5.1-darwin-x86_64.tar.gz
詳しくは、Filebeatのインストールページをご覧ください。
手順2.s3インプットを設定する
以下は、filebeat.yml
でS3インプットを有効化する設定の例です。
filebeat.inputs: - type: s3 queue_url: https://sqs.us-east-1.amazonaws.com/1234/test-fb-ks visibility_timeout:300s credential_profile_name: elastic-beats
この設定でFilebeatにtest-fb-ks
AWS SQSキューを確認させて、通知メッセージを読み取ることができます。Filebeatはそのメッセージから特定のS3オブジェクトに関する情報を入手し、その情報を使って1行ずつオブジェクトを読み取ります。「visibility_timeout」は、受信したメッセージがReceiveMessageリクエストによって取得された後、後続の取得リクエストから見えない時間(単位は秒)です。デフォルトで、visibility_timeoutは300秒に設定されており、最小で0秒、最大で12時間に設定可能です。AWS APIコールを行うため、s3インプットの設定にAWSの認証情報を含める必要があります。上の例では、AWS APIコールを実施するためにelastic-beats
というプロフィール名が作成されています。詳しくは、AWS認証情報設定のページをご覧ください。
手順3.Filebeatを起動する
MacおよびLinuxでは、以下を使用します。
sudo chown root filebeat.yml sudo ./filebeat -e
詳しくは、Filebeatの起動のページをご覧ください。
s3accessファイルセットを使ってS3サーバーアクセスログを収集する
s3access
ファイルセットは、s3インプットを使ったS3サーバーアクセスログ収集のためにFilebeat 7.4から導入されています。サーバーアクセスログは、バケットに対して行われたリクエストの詳細な記録を含むため、セキュリティやアクセス監査に非常に有用です。デフォルトで、サーバーアクセスのロギングは無効化されています。バケットへのアクセスをトラッキングするには、サーバーアクセスのロギングを有効化します。各アクセスログ記録には、リクエスト元やバケット名、リクエスト時間、リクエストしたアクション、レスポンスステータス、エラーコードなど、単一のアクセスリクエストの詳細情報が含まれます。
手順1:サーバーアクセスロギングを有効化する
対象のS3バケットの[Properties](プロパティ)で、[Enable logging](ロギングを有効化)を選択することにより、サーバーアクセスロギングを有効化できます。
手順2.Filebeatでawsモジュールを有効化する
Filebeatのデフォルトの設定で、awsモジュールは有効化されていません。MacOSおよびLinuxシステムでは、以下のコマンドでmodules.dディレクトリのawsモジュールを有効化できます。
sudo ./filebeat modules enable aws
手順3.awsモジュールを設定する
デフォルトで、s3access
ファイルセットは無効化されています。s3access
ファイルセットを有効化するには、以下のaws.ymlを参照します。
- module: aws s3access: enabled: true var.queue_url: https://sqs.myregion.amazonaws.com/123456/myqueue var.credential_profile_name: fb-aws
手順4.Filebeatを起動する
MacおよびLinuxでは、以下を使用します。
sudo chown root filebeat.yml sudo ./filebeat -e
詳しくは、Filebeatの起動のページをご覧ください。
手順5.Kibanaのs3accessファイルセットダッシュボードを使う
s3access
ファイルセットには、“[Filebeat AWS] S3 Server Access Log Overview”([Filebeat AWS] S3サーバーアクセスログの概要)という事前定義済みダッシュボードが含まれます。Filebeat起動時にセットアップコマンドを実行すると、Kibanaでこれらのダッシュボードが自動的にセットアップされます。
MacおよびLinuxでは、以下を使用します。
./filebeat setup --dashboards
詳しくは、Kibanaのダッシュボードセットアップに関するドキュメントをご覧ください。
このダッシュボードは、AWS S3サーバーアクセスログの概要を示します。上位のURLとともに、レスポンスコード、時間軸におけるHTTPステータス、すべてのエラーログを表示します。
おわりに
Filebeat s3インプットを使えば、AWSサービスから手軽にログを収集して、Elasticsearch Service on Elastic Cloudやデフォルト配布パッケージで実行するクラスターにシッピングできます。7.4で登場したs3access
ファイルセットで、S3サーバーアクセスログの収集と分析が可能になりました。7.5で登場したelb
ファイルセットを使うと、クラシックロードバランサー、アプリケーションロードバランサー、ネットワークロードバランサーからログを収集することができます。今後さらに、VPCフローログやCloudWatchログ、Cloudtrailなどの、よく使われるログをサポートするファイルセットを追加していく予定です。ご質問やフィードバックがおありの場合は、Beatsディスカッションフォーラムにお気軽にお寄せください。