2015年2月20日金曜日

Fluentdを使ってApacheのログをRDS(Postgresql)に入れる

このエントリーをはてなブックマークに追加 はてなブックマーク - Fluentdを使ってApacheのログをRDS(Postgresql)に入れる

Fluentdを使ってApacheのログをRDS(Postgresql)に入れる対応をした時のメモ。

環境

  • AWS EC2 on Red Hat Enterprise Linux 6.6 (HVM)
  • RDS on PostgreSQL 9.3.5

EC2とRDS作成は省略。EC2とRDSは接続可能なようにネットワークとセキュリティグループの設定をしておくこと

Flunetdインストールの準備

Fluentdインストールの前にを参考に準備を行います。

NTP

こちらを参考に。

CentOSにntpサーバを入れて、日本標準時刻に自動的に合わせるためのメモ

まず、UTCからJST形式に変更します。

$cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

NTP自体はすでにインストールされていたので、設定ファイルを日本の設定に変更します。/etc/ntp.confを開いて

server 0.rhel.pool.ntp.org iburst
server 1.rhel.pool.ntp.org iburst
server 2.rhel.pool.ntp.org iburst
server 3.rhel.pool.ntp.org iburst

となっている部分を

server -4 ntp.nict.jp
server -4 ntp1.jst.mfeed.ad.jp
server -4 ntp2.jst.mfeed.ad.jp
server -4 ntp3.jst.mfeed.ad.jp

と変更。

サービスを起動します。

$sudo service ntpd start

確認。

$ntpq -p

自動起動ON。

 $sudo chkconfig ntpd on

ファイルディスクプリンタ

扱えるファイル数を増やすためにファイルディスクプリンタの設定をします。 /etc/security/limits.confを開いて、以下を末尾に追加します。

root soft nofile 65536
root hard nofile 65536
* soft nofile 65536
* hard nofile 65536

再起動。

$sudo shutdown -r now

確認。

$ulimit -n

ネットワーク関連のパラメータ変更

多分ここあたりの話が関係しているっぽい。

ぜんぶTIME_WAITのせいだ!

/etc/sysctl.confを開いて追記します。

net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 10240    65535

反映。

 $sudo sysctl -p

確認。

$sudo sysctl -a |grep -e recycle -e reuse -e port_range

Flunetdインストールのインストール

fluentd-インストールのページからインストール対象のディストリビューションを選んでインストール方法を確認します。 Redhatの場合、インストールスクリプトが用意されているのでそれを利用します。

$curl -L http://toolbelt.treasuredata.com/sh/install-redhat.sh | sh

これでインストールは完了です。

サービスが起動するか確認します。

$sudo /etc/init.d/td-agent start
Starting td-agent:                                         [  OK  ]

Fluent-catコマンドを使って挙動を確認する

fluentdの簡単な使い方、設定方法一覧

上記を参考にやってみました。 その他全体の概要についても詳しく書いてあり、参考になりました。

fluentdの設定を変更します。 /etc/td-agent/td-agent.confを以下のようにします。

<source>
  type forward
</source>
<match debug.**>
  type stdout
</match>

今回はわかりやすいようにtraceモードで起動したいので、一旦デーモンの方は停止させます。

$sudo /etc/init.d/td-agent stop

traceモードをバックグラウンドで起動します。

$td-agent -vv &

fluent-catコマンドを使って確認します。

$ echo '{"json":"message dayo"}' | /usr/lib64/fluent/ruby/bin/fluent-cat debug.test
2015-02-19 22:21:44 +0900 [trace]: plugin/in_forward.rb:189:initialize: accepted fluent socket from '127.0.0.1:23200': object_id=11839160
2015-02-19 22:21:44 +0900 debug.test: {"json":"message dayo"}
2015-02-19 22:21:44 +0900 [trace]: plugin/in_forward.rb:245:on_close: closed fluent socket object_id=11839160

debug.testというファイル名がマッチして表示されている事が確認できます。 試しに他のファイル名でやってみます。

$echo '{"json":"message dayo"}' | /usr/lib64/fluent/ruby/bin/fluent-cat debugaaaa.test
2015-02-19 22:23:56 +0900 [trace]: plugin/in_forward.rb:189:initialize: accepted fluent socket from '127.0.0.1:23201': object_id=70330928356440
2015-02-19 22:23:56 +0900 [warn]: fluent/engine.rb:330:emit: no patterns matched tag="debugaaaa.test"
2015-02-19 22:23:56 +0900 [trace]: plugin/in_forward.rb:245:on_close: closed fluent socket object_id=70330928356440

パターンにマッチしていない事が確認できます。

確認は終わったので、プロセスをkillします。

$ps aux|grep fluentd
$kill KILL hoge
$kill KILL fuga

Apacheのアクセスログをfluentdにかませてファイル出力する

RDSに入れる前にファイル出力が出来るか確認しました。 下記を参考にさせて頂きました。

fluentdを試してみた

まず、Apacheをインストールします。

$sudo yum install httpd -y

起動します。

$sudo service httpd start

また、td-agentがアクセスログの読み取りが出来るように権限を変更します。

$sudo chmod a+rx /var/log/httpd

fluentdの設定をApache用に変更します。 /etc/td-agent/td-agent.confを以下のようにします。

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

<match apache.access>
  type file
  path /var/log/td-agent/access_log
</match>

posファイル用のディレクトリを作成します。

$sudo mkdir /var/log/td-agent/pos
$sudo chown -R td-agent:td-agent /var/log/td-agent/pos

デーモンを起動します。

$sudo service td-agent start

アクセスログが追加されるようにWebサーバーにアクセスします。

$wget http://localhost

うまく動作していれば/var/log/td-agent/access_log.20150219.b50f712d6139bb1bcという感じでファイルが出来ているかと思います。

ダメな場合、/var/log/td-agent/td-agent.logを確認するとエラーの原因が書いているかと思います。

RDSにApacheのアクセスログを送る

プラグインを追加して、RDSへ情報を送ります。

fluent-plugin-pgjson

まず、プラグインで必要なソフトウェア群をインストールします。

$sudo yum groupinstall "Development Tools" -y
$sudo yum install postgresql postgresql-devel -y

また、psqlコマンドを使ってEC2からアクセスできるか確認します。各パラメーターは自分の環境に変更してください。

$psql -U root -p 5432 -d testdb -h dbinstance.c0cdb3a3yekt.ap-northeast-1.rds.amazonaws.com

アクセス後、fluentd用のテーブルを作成します。

CREATE TABLE fluentd (
    tag Text
    ,time Timestamptz
    ,record Json
);

fluent-plugin-pgjsonを追加します。

$sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-pgjson

fluentdの設定ファイルを変更します。設定は適宜変更ください。

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

<match apache.access>
  type pgjson
  host dbinstance.c0cdb3a3yekt.ap-northeast-1.rds.amazonaws.com
  port 5432
  database testdb
  table fluentd
  user root
  password PASSWORD
  time_col time
  tag_col tag
  record_col record
</match>

設定を反映するためにデーモンを再起動します。

 $sudo service td-agent restart

テーブルを確認するとログが登録されているのが確認できます。

testdb=> select * from fluentd;
apache.access | 2015-02-19 14:29:39+00 | {"host":"::1","user":"-","method":"GET
","path":"/","code":"403","size":"3985","referer":"-","agent":"Wget/1.12 (linux-
gnu)"}

自分でフォーマットを決める場合

今回、すでに用意されたapacheのフォーマットを利用しましたが、正規表現を用いて自分で定義することもできます。

例えばスペース区切りでcodeとsizeとkeyとする場合、以下のようにします。

<source> 
  type tail 
  path /var/log/foo/bar.log 
  pos_file /var/log/td-agent/foo-bar.log.pos 
  tag foo.bar 
  format /^(?<code>[^ ]*) (?<size>[^ ]*)$/ 
</source>

詳細や例は公式を見ると良いかと思います。

tailインプットプラグイン

また、以下のサイトで設定した正規表現がどのような挙動となるか確認できます。

Fluentular

2015年2月7日土曜日

SES(Simple Email Service)の監視について確認した時のメモ

このエントリーをはてなブックマークに追加 はてなブックマーク - SES(Simple Email Service)の監視について確認した時のメモ

SESを使うときの監視について確認したのでメモ。

概要

SESでは以下については監視などしておくと良さそうです。

  1. 24時間以内の送信メール数と上限値
  2. Bounce数
  3. Complaint数

1は単純にそれを超えると送信ができなくなるため(上限値は徐々にあがるのを待つか別途申請が必要) 2,3もその割合が多すぎるとAWS側でメールサービスを停止することがあるからです。

具体的にどう監視するかという所で大きく分けて2つあるようです。

  1. AWS CLI(SDK)を使って定期的に取得する
  2. SESの配信通知を使う

1.AWS CLI(SDK)を使って定期的に取得する

AWS CLI(SDK)で監視すべき内容が取得できます(恐らくSDKでも取れると思います)

AWS CLI ses

具体的なオプションとしては「get-send-quota」および「get-send-statistics」が該当します。

get-send-quotaでは24時間以内のメール送信数の上限と現在の送信数が取得でき、get-send-statisticsでは2週間以内の15分ごとの送信状況(何通送って何通がBounceしたかComplaintになったか)などが取得できます。

なので例えば24時間以内のメール送信数と上限の割合を取得する場合、具体的に以下のコマンドでパーセンテージが取得できます。(動作確認済み)

上記を利用してAWSのCloudWatchと連携すると「上限数のhoge%を超えたらアラートメールを送る」などという事が可能です。

CloudWatchとの連携は以下サイトが参考になると思います。(ここで紹介されているPythonツールは個人でメンテナンスしているようでAmazonとしてno longer supportらしいのでSDKかCLIを使ったほうが良さそうです)

Amazon Simple Email Service (SES)の送信件数をCloudWatchのカスタムメトリクスで監視する

2.SESの配信通知を使う

SESで設定をしておけば、

  • Bounce
  • Complaint
  • Delive(正常に宛先に届いたか)

などの時にAWS-SNSを通じて通知が受け取れるようです。

【AWS発表】SESの配信通知

SNSではメール通知やHTTPによって通知などできるので監視やBounceやComplaint時の送信先宛先リストからの削除などが出来ると思います。