fluentd(td-agent)の検証環境を作成するCloudFormationワンライナー(2014.09版)


#はじめに

ログコレクタのfluentdの検証環境をCloudFormationで作りました。fluentdのインストールは簡単ですので素のOSにいれてもよいのですが、EC2の場合ですとSecurityGroupの設定だったり、保存先をS3にする場合の設定だったり、なにかと面倒だったりします。

クラスメソッド都元さんの[CloudFormationでfluentdサーバを一発構築する](http://dev.classmethod.jp/cloud/aws/cfn-template-for-fluentd/)のブログでCloudFormation(CFn)テンプレートを見つけましたが、こちらは最新版の2014.06のAmazon Linux AMIには対応していないようでした。追加プラグインも含めたかったので、こちらをベースにスクリプトを作成しました。

# Fluentd CloudFormation テンプレートの概要

AWSアイコンの枠線で囲まれた部分が今回の構築対象です。

![CFN_Fluent.png](https://qiita-image-store.s3.amazonaws.com/0/51203/2db8abac-5985-f2fd-d88b-09b8de6c727b.png "CFN_Fluent.png")

テンプレートは[gist](https://gist.github.com/takekawa/6b9eae8a3f594ee03664)と[s3](https://s3-ap-northeast-1.amazonaws.com/takekawa-fluentd-test/fluentd.cfn)におきました

# 元のテンプレートからの変更点
以下となります。

* 2014/06 AMIイメージ対応 (元からあった2013/*は削除しました)
* HVM形式対応 (PVには非対応です)
* fluentd-secure-forward-plugin追加 (24225番ポート利用)
* InternetからfluentdにアクセスできるようにSecurityGroupを修正
* CloudFormation スタックを削除してもインスタンスとバケットが消えないように"DeletionPolicy" : "Retain"を追加

#CloudFormation スタックの作成

GUIで行なうのは面倒ですので、スクリプトで実行したいとおもいます。[AWS CLI](http://aws.amazon.com/jp/cli/)が使える前提です。

スタック作成には以下の3つのパラメータを必要とします。

| パラメータ名 | 意味 |
|--------|--------|
|stack-name  | CloudFormationのスタック名です(重複だめ)       |
|KeyName| EC2にログインするためのKeyPair名です。 |
|SSLSharedKey| FluendのSecure Forwardプラグインで利用する暗号化キーです| 

それぞれシェル変数にして渡して実行します。(ワンライナーといいつつ4行になってしまいますが実行は1行ということで。。。)

```bash:
CFN_STACKNAME=fluentd-test   #CloudFormaionのスタック名です。
CFN_KEYNAME='key_takekawa'   #EC2にログインするためのキー名です。
CFN_SSLKEY='XXXXXXXXXX'      #fluentdのsecure fowardプラグインで利用する暗号化キーです。

aws cloudformation create-stack --disable-rollback --region ap-northeast-1 --stack-name $CFN_STACKNAME --parameters  ParameterKey=KeyName,ParameterValue=$CFN_KEYNAME  ParameterKey=SSLSharedKey,ParameterValue="$CFN_SSLKEY" --template-url https://s3-ap-northeast-1.amazonaws.com/takekawa-fluentd-test/fluentd.cfn
```

実際の実行例はこんなかんじです。

```bash:
$ CFN_STACKNAME='fluentd-test'   #CloudFormaionのスタック名です。
$ CFN_KEYNAME='key_takekawa'   #EC2にログインするためのキー名です。
$ CFN_SSLKEY='XXXXXXXXXX'      #fluentdのsecure fowardプラグインで利用する暗号化キーです。
$
$ aws cloudformation create-stack --disable-rollback --region ap-northeast-1 --stack-name $CFN_STACKNAME --parameters  ParameterKey=KeyName,ParameterValue=$CFN_KEYNAME  ParameterKey=SSLSharedKey,ParameterValue="$CFN_SSLKEY" --template-url https://s3-ap-northeast-1.amazonaws.com/takekawa-fluentd-test/fluentd.cfn
A client error (AlreadyExistsException) occurred when calling the CreateStack operation: Stack [fluentd-test] already exists

```

エラーでてますね。同じ名前のスタックは作れないというエラーです。
ということで修正して再実行します。

```bash:


$ CFN_STACKNAME='fluentd-test3'   #CloudFormaionのスタック名です。
$ aws cloudformation create-stack --disable-rollback --region ap-northeast-1 --stack-name $CFN_STACKNAME --parameters  ParameterKey=KeyName,ParameterValue=$CFN_KEYNAME  ParameterKey=SSLSharedKey,ParameterValue="$CFN_SSLKEY" --template-url https://s3-ap-northeast-1.amazonaws.com/takekawa-fluentd-test/fluentd.cfn
{
    "StackId": "arn:aws:cloudformation:ap-northeast-1:180400166198:stack/fluentd-test3/0e5b7000-3f29-11e4-9047-507bfc8840a6"
}
$

```

作成に10分ほどかかります。進捗は[マネージメントコンソール](https://console.aws.amazon.com/cloudformation/home?region=ap-northeast-1)で確認するとよいです。

エラーになった場合は、Eventsを確認すると原因がわかることが多いです。ないKeyPairを指定していたりするとエラーになります。

#fluentd 動作確認

構築がおわったら、動作確認です。クライアントのMacからサーバーにfluentのメッセージを送ってみましょう。fluent-postというコマンドが便利です。

```bash:
$ sudo gem install --no-ri --no-doc fluent-logger
Fetching: fluent-logger-0.4.9.gem (100%)
Successfully installed fluent-logger-0.4.9
1 gem installed
```

使い方はこんなかんじです。 %%PUBLIC_IP%% の部分はfluentdのPublicIPを指定してください。

```bash:
$ fluent-post
Usage: fluent-post -t tag.foo.bar -v key1=value1 -v key2=value2
    -t [tag (default nil)]
    -p [port (default 24224)]
    -h [host (default localhost)]
    -v [key=value]

$ fluent-post -t test -h %%PUBLIC_IP%% -v key=value -v key2=value2
post successed. #=> {"key"=>"value", "key2"=>"value2"}
```

しばらく待って、以下のようにS3にファイルが出てきたら、成功です。

![スクリーンショット 2014-09-18 21.25.51.png](https://qiita-image-store.s3.amazonaws.com/0/51203/571cd974-9921-ca81-1090-94430a179b67.png "スクリーンショット 2014-09-18 21.25.51.png")

#おわりに

fluentdの環境構築をCloudFormationで作成してみました。書くと簡単ですが、HVMのディスクの配置にはまったり、fluentdの設定をあやまったりと、なんだかんだで時間がかかってしまいました。

今後は、これをベースにkibana/elastic search/fluent cloudwatch pluginを追加して簡易的な監視メトリクスの調査環境を作っていきたいとおもいます。