fluentdでS3に送信したログをQuickSightで見える化!

記事タイトルとURLをコピーする

こんにちは、技術3課の峯です。

前に『【やってみた】ZabbixのアラートをQuickSightで見える化!』という記事を書きましたが、今回もQuickSightを使った記事になります。

今回はfluentdを利用してS3バケットに送信されたログをQuickSightで見える化したいと思います。

fluentdとは?

そもそもfluentdとは何でしょうか?fluentdとはデータのやり取りを管理するオープンソースのソフトウェアです。ログのやり取りに使われることが多いです。pluginを組み合わせることで、いろんな入力先からいろんな出力先へデータを送ることが可能となります。
td-agentとはこのfluentdの安定版になります。

今回やること

今回はtd-agentでApacheのログをS3に送信し、Athenaでテーブルを作成し、QuickSightで見える化、といったことをやってみようと思います。

実際にやってみた

構成

  1. EC2インスタンスにhttpdtd-agentをインストールし、webページへのアクセスログをJSONでS3バケットに送信します。
  2. GlueのクローラーをつかってAthenaに自動でテーブル作成・更新します。
  3. QuickSightで見える化!!!

2、3は【やってみた】ZabbixのアラートをQuickSightで見える化!とほとんど同じで、リソース名が違うくらいです。

手順

では、実際に構築していきましょう。今回はすべてのリソースをバージニア北部リージョンで作成しました。

S3バケットの作成

まずはログの送信先となるS3バケットを作成します。適当なわかりやすい名前を付けます。他の設定はデフォルトのままで問題なしです。

IAMの設定

EC2ンスタンスに割り当てるIAMロールを作成します。IAMポリシーは以下のようにしました。


{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<バケット名>",
                "arn:aws:s3:::<バケット名>/*"
            ]
        }
    ]
}

ここで注意点があります。td-agentでS3にログを送信するときにはfluent-plugin-s3というプラグインを使用します。このfluent-plugin-s3のREADMEにはIAMポリシーの例が記載されています。実はこのIAMポリシーで許可される権限は必要最低限のものとなっているようです。td-agentの設定次第では例のIAMポリシーで動作するようです。今回の設定では、ListBucket・PutObjectに加えてGetObjectを許可します。

EC2インスタンスの作成

今回利用したインスタンスのインスタンスタイプはt2.micro、OSはAmazonLinuxになります。

httpdとtd-agentのインストール・設定

インストール

httpdとtd-agentをインストールしていきます。
td-agentのインストールについては公式のドキュメントにAmazon Linux以外のOSでの方法やRubyを使ったインストール方法などが載っています。先ほど少し紹介したfluent-plugin-s3はデフォルトでtd-agentに入っており、別途インストールする必要がありません。最新版を利用したい場合は、デフォルトのものをアンインストールし、インストールし直す必要があるようです。


#httpdのインストール
$ sudo yum -y install httpd
#td-agentのインストール
$ curl -L https://toolbelt.treasuredata.com/sh/install-amazon1-td-agent3.sh | sh

設定

今回はhttpdの設定はデフォルトのままにしました。webページは以下のような超簡単なものを用意しました。


td-agentの設定ファイルに、httpdのアクセスログをJSONファイルでS3バケットに送信する設定を追記します。設定ファイルは/etc/td-agent/td-agent.confになります。記載した設定は以下のものになります。



  @type tail
  path /var/log/httpd/access_log
  pos_file /var/log/td-agent/httpd.access_log.pos
  
    @type apache2
  
  tag s3.httpd.access



  @type s3
  s3_bucket <バケット名>
  path logs/
  store_as json
  
    @type file
    path /var/log/td-agent/s3
    flush_mode interval
    flush_interval 10s
  
  
    @type json
    include_time_key true
    time_key log_time
  
  time_slice_format %Y%m%d


設定ファイルの各設定項目の詳しい説明については省きますが、S3バケットへの送信の設定について少し説明します。s3_bucketpathで保存するバケットとパスを指定し、store_asでS3に保存するファイル形式にJSONを指定しています。また、今回は検証なので、送信する間隔をflush_intervalで10秒に設定しています。

それでは実際にhttpdとtd-agentを起動し、S3にアクセスログを送信してみましょう。


#httpdの起動
$ sudo service httpd start
#td-agentの起動
$ sudo service td-agent start



S3バケットを確認すると... おっ!ちゃんと、JSONで保存されています!



AthenaとGlueの設定

さて、ここからは【やってみた】ZabbixのアラートをQuickSightで見える化!とほとんど同じです。

まずはマネコンからGlueを開き、わかりやすい名前でcrawlerを作成していきます。

S3バケット名を入力する画面になります。フォルダマークをクリックすると先ほど作成したS3バケットを選択でき入力の手間が省けます。バケットにフォルダがいくつかある場合はパスも指定してやります。※パスの最後に/をつけ忘れると動作しなくなります。

IAMロールの設定画面が出てきますが、新規作成でわかりやすい名前を入れます。

最後に適当なわかりやすい名前でデータベースを追加します。

それではAAhenaを確認してみましょう。

おっ、テーブルが作成されていますね。S3バケットの選択の手順でフォルダを指定すると、特に指定しない限りはそのフォルダ名がテーブル名になるようです。

QuickSightの設定

それでは実際に見える化していきます。その前に【やってみた】ZabbixのアラートをQuickSightで見える化!でも記載しましたが、QuickSightの権限の設定でAthenaだけでなくS3バケットの権限を許可しているか確認してください。

それではNew AnalysisNew Data Set→Athenaと選択し、作成したデータベースとテーブルを選択します。

今回もSPICEは利用しません。



作成したAnalysisを開き見える化します。今回は円グラフを利用し、フィールドはPathを選択しました。 うん、色合いはきれいだ。。。

まとめ

今回はざっくりとtd-agentでS3に送信したログをQuickSightで見える化する方法をご紹介しました。ログに日付を含めると日付ごとのアクセスログが棒グラフで見られてよいかもしれませんね。

ちなみに

今回はtd-agentからS3に送信されるファイルをJSONで設定しましたが、デフォルトではgzip形式になります。仮にgzip形式のまま、今回の手順のようにGlueでテーブル作成などを行うとうまくテーブルの列名が設定されません。この場合、Glueは使わずに、Athenaで直接フォーマットを入力する必要があります。