FluentdでログをS3に保存させようとしたが失敗する
WEBに転がっている記事や公式を元に、EC2に吐かれるログをFluentd→S3という形で保存させようとしたときにめちゃくちゃハマってしまった。
いまいま考えてみれば初歩の初歩だったりして余計に悲しくなるというエンジニアあるあるですが、同じようにハマッている人は以下のことを再確認してみてください。
環境
- Amazon Linux
- インストール前の前提条件は設定済 > Step 0: Before Installation
- インストール方法
> td-agent2をAmazon Linuxで実行する
エラー内容
まず私の環境で発生したエラーログです。UIで確認してます。
再起動ループが発生していたのか、以下のエラーが一生出ているって感じでした。
画像のエラー内容
2017-05-26 11:00:23 +0900 [error]: unexpected error error_class=RuntimeError error=#<RuntimeError: can't call S3 API. Please check your aws_key_id / aws_sec_key or s3_region configuration. error = #<Seahorse::Client::NetworkingError: unable to connect to `logmylog.s3.s3.xxxx.amazonaws.com.amazonaws.com`; SocketError: getaddrinfo: Name or service not known>>
2017-05-26 11:00:20 +0900 [error]: fluentd main process died unexpectedly. restarting.
そのときのconfig
~省略、以下末尾~
<source>
@type tail
format apache2
path /var/log/httpd/access_log
pos_file /var/log/td-agent/apache2.access_log.pos
tag s3.apache.access
</source>
<match s3.*.*>
type s3
aws_key_id xxxxxxxxxx
aws_sec_key xxxxxxxxxxxxxx
s3_bucket logmylog
s3_region s3.xxxxx.amazonaws.com
format out_file
include_time_key false
store_as gzip
use_ssl true
buffer_type memory
</match>
エラーログに吐かれているファイルを確認しても、原因はわからず。
configを変更するだけでなく、インスタンスを一度作り直すとかまでしても結局同じでがっつりハマっていました。
うまくいったconfig
結論です。以下がエラーを解消したconfigになります。
<source>
@type tail
format apache2
path /var/log/httpd/access_log
pos_file /var/log/td-agent/apache2.access_log.pos
tag s3.apache.access
</source>
<match s3.*.*>
type s3
s3_bucket logmylog
s3_region xxxxx
format out_file
include_time_key false
store_as gzip
use_ssl true
buffer_type memory
</match>
確認事項
リージョンとエンドポイント
解消した経緯ですが、エラーログのタイトルを今一度確認し素直に従ってみることに。
Please check your aws_key_id / aws_sec_key or s3_region configuration.
何度確認してもエンドポイントはあっている・・・。
ちなみにアクセスキーとシークレットキーも間違っていないことを確認しました。
しかし、ひとつ思い込みがありました。
このドキュメントはS3のものであってFluentdではありません。
ということでFluentdの公式を再確認。
<match pattern>
@type s3
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
path logs/
buffer_path /var/log/fluent/s3
time_slice_format %Y%m%d%H
time_slice_wait 10m
utc
buffer_chunk_limit 256m
</match>
エンドポイント指定じゃない!!
リージョン指定??
s3_endpoint
という記述を、このconfigを書く前に記述していたのですが、公式に非推奨とあったので消しました。多分その名残りでリージョン指定場所にエンドポイントを記述していた可能性があります。
なのでまずは基本のキホンですがこういった勘違いがないか確認しましょう(泣)
Keyの記述
Fluentdの公式にもある通りアクセスキーとシークレットキーの例が記載されています。当然私のconfigにも記述していたのですが、エラーログのタイトルにはこいつらもあってるかチェックしろとあります。
なので、いっそ記述をコメントアウトしてやりました。
すると、なぜかエラーが解消される事態・・・。
いや、万々歳なんですけど意味がわからず気持ち悪い。
ちなみにEC2に対してはIAMロールでS3FullAccessを付与しています。
なので理論上はアクセスキー等がなくてもS3への操作は可能です。
このあたりはまた調査します。
何か有力情報をお持ちの方はよろしくお願いします!(T 3 T)
Author And Source
この問題について(FluentdでログをS3に保存させようとしたが失敗する), 我々は、より多くの情報をここで見つけました https://qiita.com/VTRyo/items/a4695aeec4fec8220fbb著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .