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


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

Prologue - はじめに
=====
今回は、<a href="http://www.fluentd.org/" title="Fluentd | Open Source Data Collector | Unified Logging Layer" target="_blank">Fluentd</a> から <a href="http://aws.amazon.com/jp/s3/" title="Amazon S3 (クラウドストレージサービス Amazon Simple Storage Service) | アマゾン ウェブ サービス（AWS 日本語）" target="_blank">Amazon S3</a> へのログを送ってみます。

S3 への出力は、デフォルトで <a href="http://docs.fluentd.org/articles/out_s3" title="Amazon S3 Output Plugin | Fluentd" target="_blank">out_s3</a> プラグインが用意されています。セキュアな通信にするには、Credentials ( `aws_key_id` と `aws_sec_key` ) を設定すればよいのですが、設定ファイルに Creadentials を記載するのは、セキュリティやメンテナンスの点で不便です。

そこで、AWSが提供する <a href="http://aws.amazon.com/jp/iam/" title="AWS Identity and Access Management（IAM クラウドのアクセス・認証管理）| アマゾン ウェブ サービス（AWS 日本語）" target="_blank">AWS IAM</a> の機能を利用して、<a href="http://aws.amazon.com/jp/ec2/" title="Amazon EC2（スケーラブルなクラウド上の仮想サーバー） | アマゾン ウェブ サービス（AWS 日本語）" target="_blank">Amazon EC2</a> インスタンスと Amazon S3 の通信を制限し、上記を実現してみたいと思います。

[余談] 実は、起動中のEC2インスタンスにはIAMロールを付与できない…のですよ…
====
ずっと悩んでいたんです。<a href="http://qiita.com/dz_/items/960319ffffa0d7355f8c" title="Check! はじめての fluentd を Amazon Linux で動かしてみる (ログを PHP から送る) - Qiita" target="_blank">前回</a>作った 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](https://qiita-image-store.s3.amazonaws.com/0/3812/803361e3-95ba-6a1b-3c22-8bc4be1ca199.png)

![20150405_fluentd-to-s3-by-iam-role_002.png](https://qiita-image-store.s3.amazonaws.com/0/3812/d9bc872c-61d6-7d17-5f9a-0eb61f9af82f.png)

![20150405_fluentd-to-s3-by-iam-role_001-1.png](https://qiita-image-store.s3.amazonaws.com/0/3812/7b4e3bf4-fbcb-9380-50f0-f54ffcd98a26.png)

![20150405_fluentd-to-s3-by-iam-role_003.png](https://qiita-image-store.s3.amazonaws.com/0/3812/bc699922-1c27-ed0b-adbc-411d5e8cee84.png)

![20150405_fluentd-to-s3-by-iam-role_004.png](https://qiita-image-store.s3.amazonaws.com/0/3812/f0e67a44-aaed-f4ab-9a9d-84d6e376ae8f.png)

![20150405_fluentd-to-s3-by-iam-role_005.png](https://qiita-image-store.s3.amazonaws.com/0/3812/cc86c313-5d72-1a63-9109-10416191fa92.png)

![20150405_fluentd-to-s3-by-iam-role_006.png](https://qiita-image-store.s3.amazonaws.com/0/3812/8e037d76-6c83-69b3-59da-eb02bec5f229.png)

![20150405_fluentd-to-s3-by-iam-role_007.png](https://qiita-image-store.s3.amazonaws.com/0/3812/15147b18-dc06-0ac9-442b-2e7a2e95a7ae.png)

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

- [fluent&#x2F;fluent-plugin-s3 · GitHub](fluentd-phttps://github.com/fluent/fluent-plugin-s3#iam-policy "fluent/fluent-plugin-s3 · GitHub")

> ```json
{ "Statement": [
 { "Effect":"Allow",
   "Action":"s3:*",
   "Resource":"arn:aws:s3:::my-s3bucket*"
  } ]
}
```

これを設定しましょう。 `my-s3bucket` の部分は、上記で作成したバケット名に置換えて下さい。
![20150405_fluentd-to-s3-by-iam-role_008.png](https://qiita-image-store.s3.amazonaws.com/0/3812/cbce8a19-28c5-9e0f-2440-3848b5950da2.png)

3. Amazon EC2 インスタンス作成時に、IAMロールを設定する
----
さて、インスタンス作り直して、IAMロールを設定します。
![20150405_fluentd-to-s3-by-iam-role_009.png](https://qiita-image-store.s3.amazonaws.com/0/3812/21a338df-df83-c536-546b-8c37d74974bb.png)

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

4. Fluentd の out_s3 プラグインで S3 にログを書き出す
----
### out_s3 プラグインの準備
今回使う `out_s3` プラグインは、td-agent には含まれているので大丈夫です。もし Fluentd gem を利用している場合は、以下のコマンドで別途インストールしてください。

```bash
# Fluentd gem に fluent-plugin-s3 をインストール
fluent-gem install fluent-plugin-s3
```

### バッファ用ディレクトリの作成
任意のディレクトリで構わないのですが、td-agentが読み書きできるように、所有者を `td-agent` に変更しておきます。

```bash
# バッファ用のディレクトリを作成
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>
```

<table>
<thead><tr><th>パラメータ名</th><th>設定値</th><th>説明</th></tr></thead>
<tbody>
<tr><td>type</td><td>s3</td><td>out_s3 プラグインを指定</td></tr>
<tr><td>s3_bucket</td><td>S3バケット名</td><td>ログ送信先のS3バケット名を指定</td></tr>
<tr><td>buffer_path</td><td>バッファ用ディレクトリパス</td><td>上記で用意したディレクトリを指定</td></tr>
</tbody>
</table>

これで準備完了です。

ログを送信してみよう！
----

この <a href="http://qiita.com/dz_/items/960319ffffa0d7355f8c#httpからログを送信してみる" title="httpからログを送信してみる - Check! はじめての fluentd を Amazon Linux で動かしてみる (ログを PHP から送る) - Qiita" target="_blank">httpからログを送信してみる</a> を参考に、 `s3.**` のタグをつけてログを送ってみましょう。

```bash
# 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](https://qiita-image-store.s3.amazonaws.com/0/3812/24b628bf-4916-6ac0-e268-e49f2a52547f.png)

![20150405_fluentd-to-s3-by-iam-role_011.png](https://qiita-image-store.s3.amazonaws.com/0/3812/5abd8d28-e13b-ba24-201c-acf0a6fb0873.png)

キターーーー！！！(\*'ω'\*)

無事、タイムスライスのルールに従ったログファイルが格納されていましたよ☆
※ 3番目のログファイルがそれです。上2つは設定にミスして*H*が混入しています(笑)

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

近況
===================================================

Phalcon関連
---------------------------------------

- [爆速フレームワーク!! Phalcon PHP Framework](
http://qiita.com/dz_/items/55ae18f7fe3a873bace1 "爆速フレームワーク!! Phalcon PHP Framework")
- [Meet Volt ! Phalcon 謹製テンプレートエンジン Volt - from 第71回 PHP勉強会](http://qiita.com/dz_/items/974a90b32ba6a6e38182 "Meet Volt ! Phalcon 謹製テンプレートエンジン Volt - from 第71回 PHP勉強会")
- [Meet Phalcon! - Phalcon PHPフレームワークを Nginx on Amazon EC2 にインストール！](http://qiita.com/dz_/items/e70d61487224b854b971 "Meet Phalcon! - Phalcon PHPフレームワークを Nginx on Amazon EC2 にインストール！")

fluentd関連
---------------------------------------
- [Check! はじめての fluentd を Amazon Linux で動かしてみる (ログを PHP から送る)](http://qiita.com/dz_/items/960319ffffa0d7355f8c "Check! はじめての fluentd を Amazon Linux で動かしてみる (ログを PHP から送る)") ← :new: :sparkles:

Amazon ECS関連
---------------------------------------

- [Check! Amazon EC2 Container Service で Docker を学びたい！(準備編)][my-amazon-ecs-docker-vol1]
- [Check! Amazon EC2 Container Service で Docker を学びたい！ (IAMポリシー編)][my-amazon-ecs-docker-vol2]

[my-amazon-ecs-docker-vol1]:http://qiita.com/dz_/items/625f55bc5de371d15caa "Check! Amazon EC2 Container Service で Docker を学びたい！(準備編)"
[my-amazon-ecs-docker-vol2]:http://qiita.com/dz_/items/44388a0908f8d18fe42d "Check! Amazon EC2 Container Service で Docker を学びたい！(IAMポリシー編)"

技術ブログ寄稿
-----------------------------------------

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

- <a href="http://blog.cloudpack.jp/author/oohira/" title="大平 かづみ の記事一覧 | cloudpack技術情報サイト"　target="_blank" rel="nofollow">大平 かづみ の記事一覧</a>


[cloudpack]:https://cloudpack.jp/ "cloudpack（クラウドパック） 400社を超える導入実績! EC2などAWSクラウドの導入設計、構築、運用保守サービス"
[cloudpack-blog]:http://blog.cloudpack.jp/ "cloudpack技術情報サイト"
[大平かづみ]:http://blog.cloudpack.jp/author/oohira/ "大平かづみの記事一覧"