こんにちは、ニフクラ技術支援チームです。
以前、当ブログにてニフクラの各種ログを自動収集して解析してみるとしてSplunkを使ったログの収集方法をご紹介しました。
こちらに関連して、今回はもっと手軽にログを収集できるよう、OSSであるfluentdを使用して、ニフクラのオブジェクトストレージに直接ログを収集する方法をご紹介します。
ログの長期保管や二次保管を行う際は、容量を気にせず使用できるオブジェクトストレージが便利です。ニフクラのオブジェクトストレージは、Amazon S3互換のREST APIに対応しており、fluentdのプラグインout_s3を使用することで簡単にfluentdの出力先として設定することができます。
今回は収集対象としてCentOS 8.0のシスログ・Apache HTTPサーバーのアクセスログ・ニフクラコントロールパネルのアクティビティログを選択し、それぞれオブジェクトストレージへの格納に必要な準備・設定の手順をご紹介します。
構成イメージ

| サーバー名 | 収集ログ |
|---|---|
| logclient01 | シスログ・httpdアクセスログ |
| logclient02 | アクティビティログ |
前提条件
本ブログは、以下の前提知識がある方を想定しています。
- ニフクラの基本的なコントロールパネルの操作、サービスを利用に関する知識
- Linuxの基本的な操作、設定に関する知識
利用リソース
| リソース | 数量 |
|---|---|
| サーバー(サーバーOS:CentOS 8.0) | 2 |
| オブジェクトストレージ(バケット) | 1 |
ソフトウェア
| ソフトウェア | バージョン |
|---|---|
| td-agent | 2.4.6-90.el7 |
| httpd | 2.4.37-16.module_el8.1.0+256+ae790463 |
| rsyslog | 8.37.0-9.el8 |
※ニフクラCLIは2020年3月時点の最新バージョンを使用しています。
環境構築
① ファイアウォールグループの作成
設定項目や設定値は省略させて頂きます。
本検証で使用するためのミドルウェア用の設定追加はしていません。
※作成方法は、以下を参照してください。
クラウドヘルプ(ファイアウォールグループの新規作成)
クラウドヘルプ(ファイアウォール:ルールの追加)
② サーバーの作成
今回はCentOSを使用しているため、SSHキーの作成が必須となります。ここでは設定項目や設定値は省略させて頂きます。
※作成方法は、以下を参照してください。
クラウドヘルプ(SSHキー)
クラウドヘルプ(サーバーの作成)
③ バケットの作成
今回の検証では「osskensho-bucket1」というバケットを作成しています。
※作成方法は、以下を参照してください。
クラウドヘルプ(ストレージ:バケット作成)
④ fluentdのインストール
今回の検証では、Treasure Data, Incから公開されている安定版パッケージ「td-agent」を使用します。
logclient01、logclient02両サーバに以下のコマンドでダウンロード・インストールします。
# curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent3.sh | sh
参考:Install by RPM Package (Redhat Linux)
事前設定
fluentdでログを転送できるよう、シスログとアクティビティログについては事前設定を行います。
① シスログ転送設定 (logclient01)
fluentdで待ち受けているポートに転送します。
今回はUDP:5140に設定しています。
/etc/rsyslog.conf
~略~ # Send log messages to Fluentd *.* @127.0.0.1:5140 ~略~
② アクティビティログ取得 (logclient02)
ニフクラCLIで取得したログをファイルに出力するスクリプトを作成し、定期実行するよう設定します。
- ディレクトリ作成
# mkdir [任意のディレクトリ]/Actlog_collect ←ログ取得スクリプト格納 # mkdir [任意のディレクトリ]/Actlog_collect/conf ←スクリプト用コンフィグ格納
- パスワードファイル作成
オブジェクトストレージ接続用のニフクラシークレットキーを判読できない状態にして保管します。 ニフクラシークレットキーはニフクラのコントロールパネルで確認できます。
# echo [ニフクラシークレットキー] | base64 > [任意のディレクトリ]/Actlog_collect/conf/SecretAccessKey
- ログ取得スクリプト作成
[任意のディレクトリ]/Actlog_collect/Actlog_collect.sh
#!/bin/bash
# Common function Reading
. [任意のディレクトリ]/Actlog_collect/conf/common.conf
# Directory creation
if ! [ -e ${LOG_DIR} ];then
mkdir -p ${LOG_DIR}
chmod 755 ${LOG_DIR}
chown root:root ${LOG_DIR}
fi
# Execute CLI command by specifying yesterday's date
# Get yesterday's activity log, remove extra blanks and mold
# Redirect execution results to log file
nifty-describe-user-activities -y `date +"%Y%m" --date "1 day ago"` \
| grep `date +"%Y-%m-%d" --date "1 day ago"` | sed -E 's/ +/ /g' \
>> ${LOG_DIR}/Act.log
実行権を付与
# chmod 740 [任意のディレクトリ]/Actlog_collect/Actlog_collect.sh
- conf作成
設定する環境変数は以下の通り。
| 変数 | 記載内容 |
|---|---|
| SHELL_CNF_DIR | confファイル格納ディレクトリ |
| NIFTY_ACCESS_KEY_ID | ニフクラアクセスキー ※ |
| NIFTY_SECRET_KEY | ニフクラシークレットキー記載ファイル |
| NIFTY_CLOUD_HOME | ニフクラCLIホームディレクトリ |
| JAVA_HOME | JAVAホームディレクトリ |
| PATH | 実行パス |
| NIFTY_CLOUD_URL | エンドポイントURL |
| LOG_DIR | ログファイル格納ディレクトリ |
※ニフクラのコントロールパネルで確認できます。
[任意のディレクトリ]/Actlog_collect/conf/common.conf
#########################################################
# Common definition
#########################################################
export SHELL_CNF_DIR=[任意のディレクトリ]/Actlog_collect/conf
export NIFTY_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXX
export NIFTY_SECRET_KEY=`base64 -d ${SHELL_CNF_DIR}/SecretAccessKey`
export NIFTY_CLOUD_HOME=/usr/local/NIFCLOUD_api-tools_8.0.1
export JAVA_HOME=/usr/lib/jvm/jre
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:${JAVA_HOME}/bin:${NIFTY_CLOUD_HOME}/bin
export NIFTY_CLOUD_URL=https://jp-east-1.computing.api.nifcloud.com/api/
export LOG_DIR=[任意のディレクトリ]/Actlog/
- cron設定
1日1回、日付が変わった深夜に実行するよう設定
/etc/cron.d/Actlog
#Periodically execute CLI log acquisition 0 1 * * * root [任意のディレクトリ]/Actlog_collect/Actlog_collect.sh
fluentd設定
logclient01(シスログ・httpdアクセスログ転送サーバー)
① systemd設定
アクセスログを読み取れるよう、td-agentデーモンをrootで実行するよう設定します。
/usr/lib/systemd/system/td-agent.service
[Service] User=root Group=root ~略~
② シスログ収集設定
| 項目 | 設定値 |
|---|---|
| @type | プラグイン指定 |
| port | rsyslogで指定したポートを指定 |
| bind | 送信元IPの指定 |
| tag | 任意のタグを設定 |
/etc/td-agent/td-agent.conf
<source> @type syslog port 5140 bind 0.0.0.0 tag system </source>
③ アクセスログ収集設定
| 項目 | 設定値 |
|---|---|
| @type | プラグイン指定 |
| path | tail対象ファイル |
| tag | 任意のタグを設定 |
| pos_file | tail位置を記録するファイルのパスを設定 |
| parse | パース設定 |
| @type | パースタイプを指定 |
/etc/td-agent/td-agent.conf
<source>
@type tail
path /var/log/httpd/access_log
tag httpd.access
pos_file /var/log/td-agent/httpd-access-log.pos
<parse>
@type apache2
</parse>
</source>
④ オブジェクトストレージ出力設定
| 項目 | 設定値 |
|---|---|
| match | 設定したタグ |
| @type | プラグイン指定 |
| aws_key_id | ニフクラアクセスキー |
| aws_sec_key | ニフクラシークレットキー ※ |
| s3_bucket | バケット名 |
| s3_endpoint | ニフクラエンドポイント |
| store_as | ファイル形式("gzip","lzo","json","text"から選択) |
| path | オブジェクトストレージ格納パス |
| buffer | バッファ設定 |
| @type | バッファタイプ設定 |
| file | バッファファイルのパス |
| timekey | 転送頻度 |
| timekey_wait | フラッシュの遅延時間 |
| chunk_limit_size | バッファファイル最大サイズ |
※ シークレットキーを平文で記載している為、ファイルのパーミッションなどでセキュリティの対処が必要です。
- シスログ
/etc/td-agent/td-agent.conf
<match system.**>
@type s3
aws_key_id XXXXXXXXXXXXXXXXXXXX
aws_sec_key XXXXXXXXXXXXXXXXXXXX
s3_bucket osskensho-bucket1
s3_endpoint https://jp-east-2.storage.api.nifcloud.com
store_as text
path logs/${tag}/%Y-%m-%d/
<buffer tag,time>
@type file
path /var/log/td-agent/s3_syslog
timekey 10m
timekey_wait 1m
chunk_limit_size 256m
</buffer>
</match>
- アクセスログ
/etc/td-agent/td-agent.conf
<match httpd.access>
@type s3
aws_key_id XXXXXXXXXXXXXXXXXXXX
aws_sec_key XXXXXXXXXXXXXXXXXXXX
s3_bucket osskensho-bucket1
s3_endpoint https://jp-east-2.storage.api.nifcloud.com
store_as text
path logs/${tag}/%Y-%m-%d/
<buffer tag,time>
@type file
path /var/log/td-agent/s3_httpd
timekey 10m
timekey_wait 1m
chunk_limit_size 256m
</buffer>
</match>
⑤ デーモン再起動
td-agentを再起動して設定を反映します。
# systemctl restart td-agent.service
logclient02(アクティビティログ転送サーバー)
① アクティビティログ収集設定
| 項目 | 設定値 |
|---|---|
| @type | プラグイン指定 |
| path | tail対象ファイル |
| tag | 任意のタグを設定 |
| pos_file | tail位置を記録するファイルのパスを設定 |
| parse | パース設定 |
| @type | パースタイプを指定 |
<source>
@type tail
path [任意のディレクトリ]/Actlog/Act.log
tag Actlog
pos_file /var/log/td-agent/Act.log.pos
<parse>
@type none
</parse>
</source>
② オブジェクトストレージ出力設定
<match Actlog>
@type s3
aws_key_id XXXXXXXXXXXXXXXXXXXX
aws_sec_key XXXXXXXXXXXXXXXXXXXX
s3_bucket osskensho-bucket1
s3_endpoint https://jp-east-2.storage.api.nifcloud.com
store_as text
path logs/actlog/%Y-%m-%d/
<buffer>
@type file
path /var/log/td-agent/s3
timekey 5m
timekey_wait 1m
chunk_limit_size 256m
</buffer>
</match>
③ デーモン再起動
td-agentを再起動して設定を反映します。
# systemctl restart td-agent.service
オブジェクトストレージの確認

① シスログ

② アクセスログ

③ アクティビティログ
アクティビティログのタイムスタンプはログ転送日時が反映されます。

まとめ
今回はfluentdを使用したオブジェクトストレージへのログ格納方法をご紹介しました。
Linux OSのログだけでなく、ニフクラCLIで取得されるアクティビティログについてもオブジェクトストレージに格納することができました。
また、通常アクティビティログは月単位で取得されますが、スクリプトとfluentdを組み合わせることで1日分ずつ転送することができました。
本検証で使用したfluentdのバージョンではS3用プラグインがデフォルトで使用できるので、手軽にオブジェクトストレージが使えます。
ログファイルという形式ではありませんがディスクを準備する必要がないため、肥大するログの保管場所として増設ディスクやNASに加えてオブジェクトストレージも検討してみてはいかがでしょうか。
ここまで読んでいただきありがとうございました!
今後、この検証の第二弾としてOSSを使用したログの可視化する方法もご紹介する予定です。
注意事項
- 本記事については検証結果の1つとなります。実際に検討される場合は、事前にそれぞれの要件を鑑みて実装するか確認してください。
- 本記事ではOS上の操作についても記載していますが、ニフクラではOS以上はご利用者様の責任範囲となりますのでご留意ください。
- 本記事で記載した各サービス/ニフクラの機能等は、2020年3月時点の情報です。利用時には各サービス/ニフクラの機能の最新情報をご確認いただきご利用ください。
