こんにちは、cloudpack の @dz_ こと大平かづみです。
Prologue – はじめに
今回は、Fluentd から Amazon S3 へのログを送ってみます。
S3 への出力は、デフォルトで out_s3 プラグインが用意されています。セキュアな通信にするには、Credentials ( aws_key_id
と aws_sec_key
) を設定すればよいのですが、設定ファイルに Creadentials を記載するのは、セキュリティやメンテナンスの点で不便です。
そこで、AWSが提供する AWS IAM の機能を利用して、Amazon EC2 インスタンスと Amazon S3 の通信を制限し、上記を実現してみたいと思います。
[余談] 実は、起動中のEC2インスタンスにはIAMロールを付与できない…のですよ…
ずっと悩んでいたんです。前回作った Fluentd 起動中のサーバーに IAMロールを付与したいのに、AWSコンソールのどこを探しても設定できる場所がない… (汗)
IAMロールは、Amazon EC2 インスタンスの起動時にしか付与できません。
ポーン ((=ω=))
ということで、インスタンスを作り直しました…!
作業イメージ
なにはともあれ、実践です☆
- Amazon S3 バケットを作成する
- このS3バケットへのアクセス権を持ったIAMロールを作成する
- Amazon EC2 インスタンス作成時に、IAMロールを設定する
- Fluentd の out_s3 プラグインで S3 にログを書き出す
手順のポイント
1. Amazon S3 のバケットを作成する
AWSコンソールなどを利用して、任意のバケットを作成します。
2. IAMロールを作成する
IAMポリシーには何を設定するの?
なんともありがたいことに、Fluentdマスター @inokara 大先輩が、ヒントを教えてくださいました!こちら↓の fluent-plugin-s3 のgithubに設定すべきIAMポリシーが掲載されています。
{ “Statement”: [
{ “Effect”:”Allow”,
“Action”:”s3:*”,
“Resource”:”arn:aws:s3:::my-s3bucket*”
} ]
}
これを設定しましょう。 my-s3bucket の部分は、上記で作成したバケット名に置換えて下さい。
3. Amazon EC2 インスタンス作成時に、IAMロールを設定する
さて、インスタンス作り直して、IAMロールを設定します。
ここまでくれば、残りの作業は簡単です!
4. Fluentd の out_s3 プラグインで S3 にログを書き出す
out_s3 プラグインの準備
今回使う out_s3
プラグインは、td-agent には含まれているので大丈夫です。もし Fluentd gem を利用している場合は、以下のコマンドで別途インストールしてください。
# Fluentd gem に fluent-plugin-s3 をインストール fluent-gem install fluent-plugin-s3
バッファ用ディレクトリの作成
任意のディレクトリで構わないのですが、td-agentが読み書きできるように、所有者を td-agent
に変更しておきます。
# バッファ用のディレクトリを作成 mkdir /var/log/fluent chown -R td-agent:td-agent /var/log/fluent
Fluentd の設定
Fluentd に out_s3 の設定を追記します。以下は、 s3.**
に一致するログを、S3 に転送します。
/etc/td-agent/td-agent.conf ... # 以下を追加type s3 s3_bucket my-s3bucket buffer_path /var/log/fluent/s3
パラメータ名 | 設定値 | 説明 |
---|---|---|
type | s3 | out_s3 プラグインを指定 |
s3_bucket | S3バケット名 | ログ送信先のS3バケット名を指定 |
buffer_path | バッファ用ディレクトリパス | 上記で用意したディレクトリを指定 |
これで準備完了です。
ログを送信してみよう!
この httpからログを送信してみる を参考に、 s3.** のタグをつけてログを送ってみましょう。
# HTTPからログを送信してみる curl -X POST -d 'json={"json":"message to s3!"}' http://localhost:8888/s3.test # 送信直後はまだバッファに格納されたままです ls /var/log/fluent/ s3.201504061559.b5131063452159925.log # 中身には送ったログが含まれています cat /var/log/fluent/s3.201504061559.b5131063452159925.log 2015-04-06T15:59:49+00:00 s3.test {"json":"message to s3!"}
この後、1時間ほど待てば S3 に収まります。
ログローテートのタイミングを設定する
S3に格納されるまで1時間待つのは長い!ので、タイムスライスを変更して、1分毎にログがS3に格納されるように調整してみました。
/etc/td-agent/td-agent.conftype s3 s3_bucket my-s3bucket buffer_path /var/log/fluent/s3 time_slice_format %Y%m%d%H%M # ← タイムスライスの設定を追加
どれどれ、S3で確認してみる
キターーーー!!!(‘ω’)
無事、タイムスライスのルールに従ったログファイルが格納されていましたよ☆
※ 3番目のログファイルがそれです。上2つは設定にミスしてHが混入しています(笑)
Epilogue – おわりに
今回は、IAMロール適用のためにインスタンスを作り直さなければならなかったのですが、AWS通の中ではあるあるノウハウだったようです。まだまだ奥が深いです!精進します!
近況
Phalcon関連
- 爆速フレームワーク!! Phalcon PHP Framework
- Meet Volt ! Phalcon 謹製テンプレートエンジン Volt – from 第71回 PHP勉強会
- Meet Phalcon! – Phalcon PHPフレームワークを Nginx on Amazon EC2 にインストール!
fluentd関連
Amazon ECS関連
- Check! Amazon EC2 Container Service で Docker を学びたい!(準備編)
- Check! Amazon EC2 Container Service で Docker を学びたい! (IAMポリシー編)