エンジニアリング

FilebeatとElastic Stackを使ってS3からAWSログを取得する

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キューにパブリッシュします。

S3バケットの設定

手順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ステータス、すべてのエラーログを表示します。

AWS S3サーバーアクセスログダッシュボード

おわりに

Filebeat s3インプットを使えば、AWSサービスから手軽にログを収集して、Elasticsearch Service on Elastic Cloudデフォルト配布パッケージで実行するクラスターにシッピングできます。7.4で登場したs3accessファイルセットで、S3サーバーアクセスログの収集と分析が可能になりました。7.5で登場したelbファイルセットを使うと、クラシックロードバランサー、アプリケーションロードバランサー、ネットワークロードバランサーからログを収集することができます。今後さらに、VPCフローログやCloudWatchログ、Cloudtrailなどの、よく使われるログをサポートするファイルセットを追加していく予定です。ご質問やフィードバックがおありの場合は、Beatsディスカッションフォーラムにお気軽にお寄せください。