share facebook facebook2 twitter menu hatena pocket slack

2015.06.16 TUE

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

大平 かづみ

WRITTEN BY大平 かづみ

こんにちは、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 インスタンスの起動時にしか付与できません。

ポーン ((=ω=))

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

作業イメージ

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

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


  type 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関連
fluentd関連
Amazon ECS関連

元記事はこちら

Check! Amazon EC2 Container Service で Docker を学びたい!(準備編)

大平 かづみ

大平 かづみ