Edited at

Check! はじめての Fluentd 〜 IAMロールで Amazon EC2 と S3 間をセキュアに

More than 3 years have passed since last update.

こんにちは、cloudpack@dz_ こと大平かづみです。


Prologue - はじめに

今回は、Fluentd から Amazon S3 へのログを送ってみます。

S3 への出力は、デフォルトで out_s3 プラグインが用意されています。セキュアな通信にするには、Credentials ( aws_key_idaws_sec_key ) を設定すればよいのですが、設定ファイルに Creadentials を記載するのは、セキュリティやメンテナンスの点で不便です。

そこで、AWSが提供する AWS IAM の機能を利用して、Amazon EC2 インスタンスと Amazon S3 の通信を制限し、上記を実現してみたいと思います。


[余談] 実は、起動中のEC2インスタンスにはIAMロールを付与できない…のですよ…

ずっと悩んでいたんです。前回作った Fluentd 起動中のサーバーに IAMロールを付与したいのに、AWSコンソールのどこを探しても設定できる場所がない… (汗)

IAMロールは、Amazon EC2 インスタンスの起動時にしか付与できません。

ポーン ((=ω=))

ということで、インスタンスを作り直しました…!


作業イメージ

なにはともあれ、実践です☆


  1. Amazon S3 バケットを作成する

  2. このS3バケットへのアクセス権を持ったIAMロールを作成する

  3. Amazon EC2 インスタンス作成時に、IAMロールを設定する

  4. Fluentd の out_s3 プラグインで S3 にログを書き出す


手順のポイント


1. Amazon S3 のバケットを作成する

AWSコンソールなどを利用して、任意のバケットを作成します。


2. IAMロールを作成する

20150405_fluentd-to-s3-by-iam-role_001.png

20150405_fluentd-to-s3-by-iam-role_002.png

20150405_fluentd-to-s3-by-iam-role_001-1.png

20150405_fluentd-to-s3-by-iam-role_003.png

20150405_fluentd-to-s3-by-iam-role_004.png

20150405_fluentd-to-s3-by-iam-role_005.png

20150405_fluentd-to-s3-by-iam-role_006.png

20150405_fluentd-to-s3-by-iam-role_007.png


IAMポリシーには何を設定するの?

なんともありがたいことに、Fluentdマスター @inokara 大先輩が、ヒントを教えてくださいました!こちら↓の fluent-plugin-s3 のgithubに設定すべきIAMポリシーが掲載されています。


{ "Statement": [

{ "Effect":"Allow",
"Action":"s3:*",
"Resource":"arn:aws:s3:::my-s3bucket*"
} ]
}

これを設定しましょう。 my-s3bucket の部分は、上記で作成したバケット名に置換えて下さい。

20150405_fluentd-to-s3-by-iam-role_008.png


3. Amazon EC2 インスタンス作成時に、IAMロールを設定する

さて、インスタンス作り直して、IAMロールを設定します。

20150405_fluentd-to-s3-by-iam-role_009.png

ここまでくれば、残りの作業は簡単です!


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

...

# 以下を追加
<match s3.**>
type s3
s3_bucket my-s3bucket
buffer_path /var/log/fluent/s3
</match>

パラメータ名
設定値
説明

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.conf

<match s3.**>

type s3
s3_bucket my-s3bucket
buffer_path /var/log/fluent/s3
time_slice_format %Y%m%d%H%M # ← タイムスライスの設定を追加
</match>


どれどれ、S3で確認してみる

20150405_fluentd-to-s3-by-iam-role_010.png

20150405_fluentd-to-s3-by-iam-role_011.png

キターーーー!!!(*'ω'*)

無事、タイムスライスのルールに従ったログファイルが格納されていましたよ☆

※ 3番目のログファイルがそれです。上2つは設定にミスしてHが混入しています(笑)


Epilogue - おわりに

今回は、IAMロール適用のためにインスタンスを作り直さなければならなかったのですが、AWS通の中ではあるあるノウハウだったようです。まだまだ奥が深いです!精進します!


近況


Phalcon関連


fluentd関連


Amazon ECS関連


技術ブログ寄稿

cloudpack技術ブログでも、AWS Lambda や 運用ツール Serf に関して記事を書いています。ご興味あれば読んでいただけると嬉しいです!