EC2からFluentdを使ってApacheのログをRedShiftに保存

  • 20
    Like
  • 0
    Comment
More than 1 year has passed since last update.

やりたいこと

  • EC2からFluentdを使ってApacheのアクセスログをRedshiftに保存したい
  • ※Redshiftに保存するプラグインがS3を使用するためS3にも保存される

使用するAWSサービス

  • EC2のインスタンス
  • S3のバケット
  • IAMのユーザ
  • Redshiftのインスタンス

EC2の作成

  • Redshiftを操作するためにpostgresqlをインストール

以下、cloud-init部分だけを抜粋

#cloud-config
repo_upgrade: all

packages:  
- httpd
- postgresql
- postgresql-devel

runcmd:
- [sed, -i, 's/en_US/ja_JP/', /etc/sysconfig/i18n]
- [cp, /usr/share/zoneinfo/Asia/Tokyo, /etc/localtime]
- [chkconfig, httpd, "on"]
- [service, httpd, start]

S3の作成

  • 「Tokyo」リージョンにバケットを作成
  • バケットの中に「logs」フォルダを作成

IAMの作成

  • ユーザを作成
  • Attach Policyで「AmazonS3FullAccess」を追加

Redshiftの作成

  • インスタンスを作成

Redshiftテーブルの作成

※sshでEC2にログイン

# psql -U ≪ユーザ≫ -W -h ≪RedshiftのEndpoint≫ -d ≪データベース名(デフォルトのままならdev)≫ -p ≪ポート番号(デフォルトのままなら5439)≫

※下記のSQLを入力

CREATE TABLE access_log (
host         varchar(15) not null default '-',
username     varchar(255) not null default '-',
request_time timestamp not null,
method       varchar(10) not null default '-',
path         varchar(65535) not null,
status       varchar(3) not null default '-',
size         varchar(255) not null default '0',
referer      varchar(65535) not null default '-',
agent        varchar(255) not null default '-'
);

※テーブル確認コマンド

# \d access_log

td-agent(Fluentdのラッパー)のインストール

# yum groupinstall -y "Development Tools"
# vi /etc/yum.repos.d/td.repo

※以下4行を記述して保存

[treasuredata]
name=TreasureData
baseurl=http://packages.treasure-data.com/redhat/$basearch
gpgcheck=0
  • td-agent、プラグインのインストール
# yum install -y td-agent
# /usr/lib64/fluent/ruby/bin/gem install fluent-plugin-redshift
# /usr/lib64/fluent/ruby/bin/gem install fluent-plugin-jsonbucket
  • td-agentにaccess_logの読み込み権限をあたえる
# chgrp td-agent /var/log/httpd/
  • td-agent.confの設定
# vi /etc/td-agent/td-agent.conf

※以下の内容に書き換える

<source>
  type tail
  path /var/log/httpd/access_log
  pos_file /tmp/access.log.pos
  tag apache.access
  format /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<request_time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<status>[^ ]*) (?<size>[^ ]*) "(?<referer>[^\"]*)" "(?<agent>[^\"]*)"$/
  time_format %d/%b/%Y:%H:%M:%S %z
</source>
<match apache.access>
  type jsonbucket
  output_tag redshift.apache.access
  json_key log
</match>
<match redshift.apache.access>
  type redshift

  # s3
  aws_key_id ≪アクセスキー≫
  aws_sec_key ≪シークレットキー≫
  s3_bucket ≪バケット名≫
  s3_endpoint s3-ap-northeast-1.amazonaws.com
  path logs/
  timestamp_key_format %Y%m%d/%Y%m%d-%H%M

  # redshift
  redshift_host ≪RedshiftのEndpoint≫
  redshift_port ≪ポート番号デフォルトのままなら5439≫
  redshift_dbname ≪データベース名デフォルトのままならdev≫
  redshift_user ≪ユーザ≫
  redshift_password ≪パスワード≫
  redshift_schemaname public
  redshift_tablename access_log
  redshift_copy_base_options TIMEFORMAT 'auto' TRUNCATECOLUMNS COMPUPDATE ON
  file_type json

  # buffer
  buffer_type file
  buffer_path /var/log/td-agent/buffer
  flush_interval 1m
  buffer_chunk_limit 1g
</match>
  • td-agentを起動
# chkconfig td-agent on
# service td-agent start

※上記で[OK]と表示されていてもエラーの場合があるためログを確認する

# less /var/log/td-agent/td-agent.log

※formatの正規表現(Redshiftのカラムデータ取得部分)は下記のサイトで正規表現チェックができる
http://fluentular.herokuapp.com/
1. Regular Expressionに正規表現を入力する
2. Test Stringにアクセスログの1行を貼り付ける
3. Parseボタンをクリック
4. 正規表現が正しければData Inspectorに取得データが表示される


動作確認

  1. EC2のサーバにブラウザなどでアクセスする
  2. /var/log/td-agent/td-agent.log にエラーが出ていないことを確認する
  3. 1分くらい待機してからS3のバケットにアクセスログが保存されていることを確認する
  4. Redshiftにログインしてデータが保存されていることを確認する
# psql -U ≪ユーザ≫ -W -h ≪RedshiftのEndpoint≫ -d ≪データベース名デフォルトのままならdev≫ -p ≪ポート番号デフォルトのままなら5439≫
# select * from access_log;

参考サイト

http://laporz.blogspot.jp/2014/08/apachefluentdredshift.html