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

やりたいこと
-----------
- 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
```

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

```
[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にアクセスログの１行を貼り付ける
3. Parseボタンをクリック
4. 正規表現が正しければData Inspectorに取得データが表示される
***

動作確認
--------
1. EC2のサーバにブラウザなどでアクセスする
2. /var/log/td-agent/td-agent.log にエラーが出ていないことを確認する
3. １分くらい待機してから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