fluentdのfluent-plugin-kinesisプラグインを使って、Kinesis Firehoseにログを送信する。

最近、自分が関わっているような新しい技術の導入に保守的なプロジェクトでも、「AWSのAutoScalingを使いたい」というような話が浮上するようになった。

自動的にサーバが増減するシステムとなると、各サーバに保存しているログをバッチ処理で収集するなんて方法では対応ができなくなってしまう。ログをリアルタイムに収集し続ける仕組みが必要なわけだが、かといってsyslogはログの出力元のアプリケーションを色々変更する必要があり面倒くさい。

そうなると、今流行り(というかすでに成熟期な気もするが)のfluentdやLogStashを勉強する必要があるのだろう。また、最近はログ収集サーバを立てるのではなく、収集から分析までクラウドのマネジメントサービスを使うのがクールな風潮だ。

そこで今回は、とりあえず「収集」の観点で、サーバのログをfluentdを使ってAWSのログ収集マネジメントサービスであるKinesis Firehoseに送信し、S3に保存するところまでを作成してみた。

環境

対象サーバ:ローカルPCのVirtualBox上に作ったCentOS7.5
対象ログ:Apacheアクセスログ

f:id:xpost:20180911212149p:plain:w500

作業

S3バケットの作成

ここではすでに作成済みとする。
リージョン:東京
バケット名:awslearn-bucket

Kinesis Firehoseの作成

AWSのサービス一覧から「Kinesis」で検索し、「Kinesis Firehose 配信ストリーム」の「配信ストリームを作成する」をクリックする。

リージョン:東京
Delivery stream name:awslearn-stream
DestinationAmazon S3
S3 bucket:awslearn-bucket
Prefix:firehose_awslearn
その他:デフォルト

ログ収集対象サーバの設定

apacheのインストール・起動を行う。インストールが完了したら、ブラウザからwebサーバにアクセスできることを確認する。

# yum install -y httpd
# systemctl stop firewalld 
# systemctl disable firewalld
# systemctl start httpd

aws cliのインストールを行う。fluent-plugin-kinesisプラグインaws cliに設定したIAMユーザーのアクセスキーIDとシークレットアクセスキーを使ってKinesis Firehoseにログ転送を行う。対象サーバがEC2インスタンスであればIAMロールの割り当てでもよい。この作業は検証のため、IAMにはAdministrator権限を付与した。必要なアクセス権限については以下を参照。

Amazon Kinesis Data Firehose によるアクセスの制御 - Amazon Kinesis Data Firehose

# yum install epel-release
# yum install python-pip
# pip install pip --upgrade
# pip install awscli --user

awsコマンドのパスを通す。

# vi ~/.bash_profile

===
- PATH=$PATH:$HOME/bin
+ PATH=$PATH:$HOME/bin:$HOME/.local/bin
===

アクセスキーIDとシークレットアクセスキーを設定する。

# aws configure

td-agent(fluentd)とfluent-plugin-kinesisプラグインをインストールする。

# curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.5.sh | sh
# td-agent-gem install fluent-plugin-kinesis

td-agentの実行ユーザをtd-agentからrootに変更する。
td-agentのままだと、apacheアクセスログが読み込めず、Permission Deniedで怒られる。td-agentの実行ユーザを変えなくても、/var/log/httpdディレクトリに一般ユーザの実行権限を与えれば解消するらしい。

# vi /lib/systemd/system/td-agent.service

===
...

[Service]
- User=td-agent
+ User=root
- Group=td-agent
+ Group=root

...
===

td-agentの設定を変更する。

# cat /etc/td-agent/td-agent.conf

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

<match log.httpd.*>
  @type kinesis_firehose
  delivery_stream_name awslearn-stream
  region ap-northeast-1
</match>

td-agentを起動する。

# systemctl start td-agent

全ての設定が完了したら、webサーバにブラウザからアクセスする。5分ほど待つと、S3バケットapacheアクセスログが収集されていることが確認できる。 f:id:xpost:20180911205042p:plain

fluentdの機能でしっかりjson化もされている。

{"host":"192.168.56.1","user":null,"method":"GET","path":"/","code":403,"size":4897,"referer":null,"agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"}
{"host":"192.168.56.1","user":null,"method":"GET","path":"/noindex/css/fonts/Bold/OpenSans-Bold.woff","code":404,"size":239,"referer":"http://192.168.56.105/noindex/css/open-sans.css","agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"}
{"host":"192.168.56.1","user":null,"method":"GET","path":"/noindex/css/fonts/Light/OpenSans-Light.woff","code":404,"size":241,"referer":"http://192.168.56.105/noindex/css/open-sans.css","agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"}
{"host":"192.168.56.1","user":null,"method":"GET","path":"/noindex/css/fonts/Bold/OpenSans-Bold.ttf","code":404,"size":238,"referer":"http://192.168.56.105/noindex/css/open-sans.css","agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"}
{"host":"192.168.56.1","user":null,"method":"GET","path":"/noindex/css/fonts/Light/OpenSans-Light.ttf","code":404,"size":240,"referer":"http://192.168.56.105/noindex/css/open-sans.css","agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"}
...