LoginSignup
19
19

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-02-17

やりたいこと

  • 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;

参考サイト

19
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
19