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