サーバやネットワーク機器類から送信されてくるsyslogを保存するのに、さくらのオブジェクトストレージを利用してみる。状況・要件としてはこんな感じ。
- さくらクラウド上でサーバや仮想アプライアンスその他を動かしている
- 複数台のサーバ/アプライアンスからsyslogを受け付けてログを集約したい
- 一部の機器ではsyslogサーバのポート番号を指定できないので必ず514番で待ち受けて欲しい
- さくらクラウドのオブジェクトストレージに保存したい
- サーバのディスクに入れておくと取り出すのが面倒
- rsyslog/syslog-ngやfluentdでのout_fileなど、ローカルに保存した場合
- オブジェクトストレージならサーバを消し飛ばしても残り、s3cmdコマンドで取り出せる
- サーバのディスクに入れておくと取り出すのが面倒
公式APIガイドの細かいところを読み飛ばしたせいで、シグネチャ不一致で嵌まってたのでメモ。
参考資料
利用したプラグインやサービスの公式資料は以下の通り
- fluent-plugin-s3
-
よくある質問(オブジェクトストレージ)
- このページ最下部の方に「ObjectStorage_API【PDF】」というリンクがあり、API一覧を参照できる
類似の事例として以下が存在する。それぞれ現在(2017/03)より2年程度経過しており、そのままでは手法を適用できない。
想定環境
- 環境: さくらクラウド
- OS: Ubuntu Server 16.04.1 (Xenial)
- 公式アーカイブ一覧から該当するアーカイブを利用してセットアップ
- td-agent: 0.12.31
- fluent-plugin-s3: 0.8.2
fluentdのインストールとセットアップ
簡単化のためここではtd-agentをパッケージ導入してfluentdを動かす。
1.ベースシステムに必要なパッケージの追加等実施して再起動
$ sudo apt update
$ sudo apt -y upgrade
$ sudo apt install -y curl ruby
$ reboot
2.fluentd 公式に従ってtd-agentの導入
$ curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-xenial-td-agent2.sh | sh
3.fluent-plugin-s3のインストール(ここでは0.8.2がインストールされた)
$ sudo td-agent-gem install fluent-plugin-s3
4.td-agentユーザが514番ポートでbindできるようにケーパビリティ設定
$ sudo setcap 'cap_net_bind_service=ep' /opt/td-agent/embedded/bin/ruby
iptablesで514/udpを5140/udpにリダイレクト、td-agentはそちらで待ち受けといったやり方でも可能だが今回はこの手段で対応した。
td-agentの設定
td-agentをrestartするまえに、/etc/td-agent/td-agent.confを以下の様に書き換える。syslog inputプラグインで受けて、s3 output プラグインに流すだけの簡単な設定。
<source>
@type syslog
port 514
bind 0.0.0.0
tag syslog
</source>
<match syslog.**>
type s3
aws_key_id ${ここにアクセスキーID}
aws_sec_key ${ここにシークレットアクセスキー}
s3_bucket ${ここにバケット名}
s3_endpoint https://b.sakurastorage.jp
s3_object_key_format %{path}%{time_slice}_%{index}.%{file_extension}
signature_version s3
path log_
buffer_path /tmp/s3
time_slice_format %Y%m%d%H
time_slice_wait 10m
buffer_chunk_limit 256m
check_apikey_on_start false
</match>
以下の点に気を付けること
- in_syslogは514/udpで待ち受ける
- 先に述べたとおり、一部機器は514番ポート決め打ちのため
- 先ほど実施したsetcapにより、td-agentの実行ユーザ(td-agent)でも0.0.0.0:514をbindできる
- use_ssl はobsoletedなので使わない
-
signature_versionを "s3" (version 2)にしておくこと
- fluent-plugin-s3 0.8.2 では "v4" (version 4) がデフォルトになっている
- 一方、さくらオブジェクトクラウドでは、version 2のみ対応している
- さくらオブジェクトクラウドにversion 4のシグネチャを投げると500が返ってくるためオペレーションできない
うまく動くとバケットに1時間毎のログファイルがgzipで纏められてファイルオブジェクトとしてつっこまれるはず。テスト中は time_slice_format を "%Y%m%d%H%M" などとして1分毎にしておくとミスに気がつきやすいので便利。