AmazonLinuxでfluentdを使ってApacheログをDynamoDBとmongoDBへ転送する

両者を比較する機会があり、ApacheのログをDynamoDBとMondgoDBに転送してみました。

DynamoDBへの転送

fluentdのインストール

転送手段はfluentdでと思ったら、http://docs.fluentd.org/articles/install-by-rpmに、

Currently, Amazon Linux is NOT supported.

とあり、使えないっぽいことがわかりました。。

でもRPMを自作するか、トレジャーデータのリポジトリからrpmを落としてくるかすればよいようです。自作なんてしたくないのでrpmを落としてきます。

https://shrub.appspot.com/packages.treasuredata.com/2/redhat/6/x86_64/

では、現時点での最新版はtd-agent-2.1.4-0.x86_64.rpmでした。

# rpm -ihv http://packages.treasuredata.com.s3.amazonaws.com/2/redhat/6/x86_64/td-agent-2.1.4-0.x86_64.rpm
http://packages.treasuredata.com.s3.amazonaws.com/2/redhat/6/x86_64/td-agent-2.1.4-0.x86_64.rpm を取得中
警告: /var/tmp/rpm-tmp.HadUid: ヘッダー V4 DSA/SHA1 Signature、鍵 ID a12e206f: NOKEY
準備しています... ################################# [100%]
更新中 / インストール中...
 1:td-agent-2.1.4-0 ################################# [100%]
adding 'td-agent' group...
adding 'td-agent' user...
Installing default conffile...
Configure td-agent to start, when booting up the OS...

という感じで何事も無くインストール出来ました。

DynamoDBのテーブル作成

続いてDynamoDBのテーブルを作ります。

Primary Key TypeはHash、Hash Attribute Nameはidにします。

CreateTable

あとはとりあえずSNS通知を外す以外はデフォルトで進めます。

fluent-plugin-dynamodbの設定

Apacheのログ転送にはfluent-plugin-dynamodbを使います。

# td-agent-gem install fluent-plugin-dynamodb
Fetching: fluent-plugin-dynamodb-0.1.11.gem (100%)
Successfully installed fluent-plugin-dynamodb-0.1.11
Parsing documentation for fluent-plugin-dynamodb-0.1.11
Installing ri documentation for fluent-plugin-dynamodb-0.1.11
Done installing documentation for fluent-plugin-dynamodb after 0 seconds
1 gem installed

/etc/td-agent/td-agent.confに以下のように設定を入れます。

<source>
type tail
format apache
path /var/log/httpd/access_log
tag httpd.dynamodb
pos_file /var/log/td-agent/httpd.pos
</source>

<match httpd.dynamodb.**>
type dynamodb
aws_key_id 【アクセスキー】
aws_sec_key 【シークレットキー】
dynamo_db_endpoint dynamodb.ap-northeast-1.amazonaws.com
dynamo_db_table apachelog
</match>

このままだと

# ls -la /var/log/ | grep httpd
drwx------ 2 root root 4096 2月 10 21:07 httpd

で、td-agentユーザがapacheのログを読めないので、

chmod 755 /var/log/httpd

しておきます。

これで適当にApacheにアクセスすると、

dynamoapachelog

のようにログが転送されることが確認できました。

MongoDBへの転送

MongoDBのインストール

とりあえずApacheと同じサーバにMongoDBを同居させてしまいます。

まず以下の内容で/etc/yum.repos.d/mongodb.repoを作成します。

[mongodb]
name=MongoDB repo
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1

MongoDBをインストールして起動します。

# yum install mongodb-org
# service mongod start

MongoDBへの転送設定

fluent-plugin-mongoは最初から入っていますので、/etc/td-agent/td-agent.confを以下のように設定変更します。

<source>
type tail
format apache
path /var/log/httpd/access_log
tag httpd.mongodb
pos_file /var/log/td-agent/httpd.pos
</source>

<match httpd.mongodb.**>
type mongo
host localhost
port 27017
database apachetomongo
collection apachelog
capped
capped_size 1024m
flush_interval 10s
</match>

td-agentをrestartします。

# service td-agent restart

これでMongoDBへのログ転送が始まります。

# mongo
MongoDB shell version: 2.6.7
connecting to: test
2015-02-22T02:22:57.448+0900 [initandlisten] connection accepted from 127.0.0.1:43711 #15 (3 connections now open)
> show dbs
admin (empty)
apachetomongo 2.077GB
local 0.078GB
test (empty)
> use apachetomongo
switched to db apachetomongo
> show collections
apachelog
system.indexes
> db.apachelog.count()
22
> db.apachelog.find().limit(10)
{ "_id" : ObjectId("54e8bef2beddad20c9000001"), "host" : "127.0.0.1", "user" : "-", "method" : "GET", "path" : "/", "code" : "403", "size" : "3839", "referer" : "-", "agent" : "curl/7.40.0", "time" : ISODate("2015-02-21T17:22:47Z") }
{ "_id" : ObjectId("54e8bef2beddad20c9000002"), "host" : "127.0.0.1", "user" : "-", "method" : "GET", "path" : "/", "code" : "403", "size" : "3839", "referer" : "-", "agent" : "curl/7.40.0", "time" : ISODate("2015-02-21T17:22:48Z") }
{ "_id" : ObjectId("54e8bef2beddad20c9000003"), "host" : "127.0.0.1", "user" : "-", "method" : "GET", "path" : "/", "code" : "403", "size" : "3839", "referer" : "-", "agent" : "curl/7.40.0", "time" : ISODate("2015-02-21T17:22:48Z") }
{ "_id" : ObjectId("54e8bef2beddad20c9000004"), "host" : "127.0.0.1", "user" : "-", "method" : "GET", "path" : "/", "code" : "403", "size" : "3839", "referer" : "-", "agent" : "curl/7.40.0", "time" : ISODate("2015-02-21T17:22:48Z") }
{ "_id" : ObjectId("54e8bef2beddad20c9000005"), "host" : "127.0.0.1", "user" : "-", "method" : "GET", "path" : "/", "code" : "403", "size" : "3839", "referer" : "-", "agent" : "curl/7.40.0", "time" : ISODate("2015-02-21T17:22:49Z") }
{ "_id" : ObjectId("54e8bef2beddad20c9000006"), "host" : "127.0.0.1", "user" : "-", "method" : "GET", "path" : "/", "code" : "403", "size" : "3839", "referer" : "-", "agent" : "curl/7.40.0", "time" : ISODate("2015-02-21T17:22:49Z") }
{ "_id" : ObjectId("54e8bef2beddad20c9000007"), "host" : "127.0.0.1", "user" : "-", "method" : "GET", "path" : "/", "code" : "403", "size" : "3839", "referer" : "-", "agent" : "curl/7.40.0", "time" : ISODate("2015-02-21T17:22:50Z") }
{ "_id" : ObjectId("54e8bef2beddad20c9000008"), "host" : "127.0.0.1", "user" : "-", "method" : "GET", "path" : "/", "code" : "403", "size" : "3839", "referer" : "-", "agent" : "curl/7.40.0", "time" : ISODate("2015-02-21T17:22:50Z") }
{ "_id" : ObjectId("54e8bef2beddad20c9000009"), "host" : "127.0.0.1", "user" : "-", "method" : "GET", "path" : "/", "code" : "403", "size" : "3839", "referer" : "-", "agent" : "curl/7.40.0", "time" : ISODate("2015-02-21T17:22:51Z") }
{ "_id" : ObjectId("54e8bef2beddad20c900000a"), "host" : "127.0.0.1", "user" : "-", "method" : "GET", "path" : "/", "code" : "403", "size" : "3839", "referer" : "-", "agent" : "curl/7.40.0", "time" : ISODate("2015-02-21T17:22:51Z") }