AWS/EC2で fluentd を使ってS3へログを送りたい
CentOS 7.x のインスタンスで試した。
参考URL
- EC2のログをfluentdを使ってタグ情報を利用したフォルダ構成でS3にアップロードする
- fluent-plugin-forest released!
- あと fluentd 各プラグインの GitHub ページ
EC2の初期設定
ややこしいのでタイムゾーンの修正と、rsyslog の再起動、SELinuxの無効化と更新・再起動だけしとく。
$ sudo timedatectl set-timezone Asia/Tokyo$ timedatectl =>"Time zone"がJSTになってる事を確認$ sudo systemctl restart rsyslog$ sudo sed -i s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config$ sudo yum upgrade -y && sudo shutdown -r now
fluentd
インストール
公式の Installing Fluentd Using rpm Package を参照、 curl でスクリプトを拾い sudo で入れる。
$ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sudo sh
プラグインのインストール
以下3つのプラグインをインストールした。
- fluent-plugin-s3
- S3へログデータを送るためのプラグイン
- fluent-plugin-ec2-metadata
- EC2インスタンスのメタデータを取得するためのプラグイン
- fluent-plugin-forest
- タグを使って動的にタグ毎に出力を変えたり出来るプラグイン
$ sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-ec2-metadata$ sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-s3$ sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-forest
IAMユーザの作成とポリシーの割り当て
IAMで最低限の権限を持ったユーザを作成する。 アクセスキーの作成はするが、コンソールへのアクセスは許可せず、ポリシーも割り当てないまま進め、アカウント作成後にインラインポリシーを作成・設定した。 インラインポリシーの内容については fluent-plugin-ec2-metadata や fluent-plugin-s3 に掲載されているものを参考にした。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:Describe*", "Resource": "*" }, { "Effect": "Allow", "Action": "elasticloadbalancing:Describe*", "Resource": "*" }, { "Effect": "Allow", "Action": [ "cloudwatch:ListMetrics", "cloudwatch:GetMetricStatistics", "cloudwatch:Describe*" ], "Resource": "*" }, { "Effect": "Allow", "Action": "autoscaling:Describe*", "Resource": "*" }, { "Effect": "Allow", "Action": "s3:*", "Resource": "arn:aws:s3:::YOUR_S3_BUCKET_NAME/*" } ]}
S3バケットのアクセス許可設定
コンソールからS3を開き、ログを保管するバケットのプロパティを表示する。 プロパティ内のアクセス許可を開き "さらにアクセス許可を追加する" をクリックし 認証済みユーザ に リスト と アップロード/削除 の許可を与える(チェックボックスにチェックを入れる)
設定例
とりあえずオリジナルの設定ファイルを退避
$ cd /etc/td-agent$ sudo mv td-agent.conf td-agent.conf.orig
こちらの記事を参考に、下記のような設定ファイルを作成した。
$ sudo vi td-agent.conf
<source> type tail format syslog pos_file /tmp/syslog.pos path /var/log/messages tag syslog.messages</source><match syslog.**> type ec2_metadata aws_key_id YOUR_AWS_KEY_ID aws_sec_key YOUR_AWS_SECRET_KEY ## EC2インスタンスのタグ Name を取得して tag: syslog.messages の前に付ける。 ## ここで付与した Name でアウトプット先を変える。 output_tag ${tagset_name}.${tag}</match><match {YOUR_EC2_INSTANCE_TAG_NAME}.**> type forest subtype s3 <template> aws_key_id YOUR_AWS_KEY_ID aws_sec_key YOUR_AWS_SECRET_KEY s3_bucket YOUR_S3_BUCKET_NAME s3_region ap-northeast-1 buffer_path /var/log/td-agent/buffer/${tag} time_slice_format ${tag_parts[0]}/${hostname}/%Y/%m/%d/${tag_parts[1..-1]}-%Y-%m-%d-%H flush_at_shutdown true </template></match>
起動と動作確認
ターミナルを2つ開き、片方で fluentd をトレースモードで起動する。
$ sudo td-agent -vv
syslog に適当なメッセージを流す。 上記 td-agent のトレースログでエラーが出ていないか確認
$ logger -p local1.error "test"
トレースモードで起動していた td-agent を [CTRL]+[C] で落とし、実際にS3へログが出力されているか確認する。
自動起動の有効化
特に問題がなければ自動起動を有効にしておく。 上記手順でインストールした fluentd は、まだsystemdに対応してないので必要なら systemd の設定を作った方がよいかも。
$ sudo systemctl enable td-agent =>/etc/init.d/td-agent で native なサービスじゃないから chkconfig td-agent on が実行したーと出力があった。
これでS3へのログ保管方法は分かったので、あとはサービスの常時起動や、各ミドルウェアに合わせたログ設定を入れてけばなんとかなるかも。
以上、なにごとも適当に。