fluentd 3分クッキング swiftオブジェクトストレージにログを転送する方法
こんにちは、最近fluentdと戯れる機会の多い佐藤です
とある案件でGMOアプリクラウドさんを使わせていただいているのですが、稼働しているサーバのログをfluentdで1時間単位に区切ってオブジェクトストレージに保存してほしいというご要望をいただきました。
「オブジェクトストレージですね!多分S3互換だから楽勝です!」
と大見得を切ったのですが。。。。。
オブジェクトストレージは、お客様管理のサーバーからOpenStackのSwiftベースのAPIで操作いただきます。
何?Swiftとな??
スタートからいきなりつまづきました、、、GMOアプリクラウドさんのオブジェクトストレージに関するリファレンスではcurlやPython-swiftclient、Cyberduckを使った操作例はあるものの、どれもfluentdと連携させるには不向きですし自前でログ転送のプログラムを組むのもなぁ、と思っていたら。。。
便利なものがありました!
fluent-plugin-swift
こういう痒いところに手が届くプラグインを作ってくれた作者の方に感謝です
というわけで
fluentd3分クッキング (GMOアプリクラウド)swiftオブジェクトストレージ編
材料です
1.fluentdと必要なプラグイン
- fluentd(td-agent) 新鮮(最新版)なもの
- fluent-plugin-swift
- fluent-plugin-forest
*お好みですが本レシピはforestを使う前提です
2.swiftオブジェクトストレージにアクセスするために必要な情報
GMOアプリクラウドのコントロールパネル>サービス>API情報 から以下を確認してください
サービス情報:テナント名 appで始まる20桁の番号
*テナントIDという情報もありますが今回は使いません
エンドポイント:identity v2.0(認証)
*いろいろなエンドポイント情報がありますが今回はこちらを使います
GMOアプリクラウドのコントロールパネルのログインiD/パスワードも必要です
材料がそろったら調理に入りましょう
3.fluentdのインストール
インストール前の推奨設定は終わっている前提で公式ページに書かれているとおりにインストールしましょう
# curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
4.プラグインのインストール
fluent-plugin-swiftとfluent-plugin-forestをインストールしましょう。
# /opt/td-agent/embedded/bin/gem install fluent-plugin-swift fluent-plugin-forest
5.設定ファイルの準備
/etc/td-agent/td-agentd.confを編集します
source(転送元のログ)タグの定義
今回は/var/log/messagesをsyslog.messagesというタグで定義します
<source> type tail format none tag syslog.messages path /var/log/messages pos_file /var/tmp/messages.pos </source>
match(転送先のswiftオブジェクトストレージ)タグの定義
今回はオブジェクトストレージのコンテナ(S3でいうバケット)の中に
/ホスト名/YYYYMM/ホスト名_ログファイル名_YYYYMMDD-HH_NN.gz
という形式でログを保存します
<match syslog.*> type forest subtype swift <template> auth_url https://ident-r2nd1001.app-sys.jp/v2.0/tokens auth_user "GMOアプリクラウドのコントロールパネルのログインiD" auth_api_key "GMOアプリクラウドのコントロールパネルのログインパスワード" auth_tenant "テナント名" swift_container "swiftのコンテナ名" swift_object_key_format %{path}${hostname}_${tag_parts[0]}.${tag_parts[1]}_%{time_slice}_%{index}.%{file_extension} path %{hostname}/%Y%m/ ssl_verify false buffer_path /var/log/fluent/swift/${tag_parts[0]}.${tag_parts[1]} time_slice_format %Y%m%d-%H time_slice_wait 10m </template> </match>
swift_containterで指定するコンテナ名はあらかじめ作成しておいてもOKですが、なければ自動的に作られます
6.動作テスト
# td-agent -vv &
いきなり動かしても良いですが、まずはデバッグモードで1時間ほど様子を見て以下を確認しましょう。
- 設定ファイルの書式にエラーが出てないこと
- ログがオブジェクトストレージに転送されていること
*すでにtd-agentが動いていて今回追加する予定の設定だけを試したい場合は、設定ファイルを別名で用意(例:td-agent.conf.test)して
# td-agent -vv -c /etc/td-agent/td-agent.conf.test &
とすれば既存のtd-agentの動作に影響を与えることなくテストができます。
ログがオブジェクトストレージに転送されればこんなログが出ます
YYYY-mm-dd HH:MM:SS +0900 [info]: Put Log to Swift. container="コンテナ名" object=ホスト名/YYYYMM/ホスト名_ログファイル名_YYYYMMDD-HH_NN.gz
7.td-agentの起動と自動起動設定
# chkconfig td-agent on && service td-agent start
swiftベースのオブジェクトストレージは最近ではなかなか見かけませんが、プラグインの設定はS3プラグインとよく似ているのでそれほど設定は難しくないかと思います。
それでは良きfluentdライフを。