ニフクラ ブログ

ニフクラ/FJ Cloud-Vやクラウドの技術について、エンジニアが語るブログです。

OSSのfluentdでニフクラの各種ログを収集して解析してみる

こんにちは、ニフクラ技術支援チームです。

以前、当ブログにてニフクラの各種ログを自動収集して解析してみるとしてSplunkを使ったログの収集方法をご紹介しました。
こちらに関連して、今回はもっと手軽にログを収集できるよう、OSSであるfluentdを使用して、ニフクラのオブジェクトストレージに直接ログを収集する方法をご紹介します。

ログの長期保管や二次保管を行う際は、容量を気にせず使用できるオブジェクトストレージが便利です。ニフクラのオブジェクトストレージは、Amazon S3互換のREST APIに対応しており、fluentdのプラグインout_s3を使用することで簡単にfluentdの出力先として設定することができます。

今回は収集対象としてCentOS 8.0のシスログ・Apache HTTPサーバーのアクセスログ・ニフクラコントロールパネルのアクティビティログを選択し、それぞれオブジェクトストレージへの格納に必要な準備・設定の手順をご紹介します。

構成イメージ

f:id:TechnicalAccountEngineer:20200413162839p:plain
構成図

サーバー名 収集ログ
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

オブジェクトストレージの確認

f:id:TechnicalAccountEngineer:20200408153847p:plain
オブジェクトストレージ

① シスログ

f:id:TechnicalAccountEngineer:20200408153904p:plain
シスログ

② アクセスログ

f:id:TechnicalAccountEngineer:20200408153914p:plain
アクセスログ

③ アクティビティログ

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

f:id:TechnicalAccountEngineer:20200408153928p:plain
アクティビティログ

まとめ

今回はfluentdを使用したオブジェクトストレージへのログ格納方法をご紹介しました。
Linux OSのログだけでなく、ニフクラCLIで取得されるアクティビティログについてもオブジェクトストレージに格納することができました。
また、通常アクティビティログは月単位で取得されますが、スクリプトとfluentdを組み合わせることで1日分ずつ転送することができました。

本検証で使用したfluentdのバージョンではS3用プラグインがデフォルトで使用できるので、手軽にオブジェクトストレージが使えます。
ログファイルという形式ではありませんがディスクを準備する必要がないため、肥大するログの保管場所として増設ディスクやNASに加えてオブジェクトストレージも検討してみてはいかがでしょうか。

ここまで読んでいただきありがとうございました!
今後、この検証の第二弾としてOSSを使用したログの可視化する方法もご紹介する予定です。

注意事項

  • 本記事については検証結果の1つとなります。実際に検討される場合は、事前にそれぞれの要件を鑑みて実装するか確認してください。
  • 本記事ではOS上の操作についても記載していますが、ニフクラではOS以上はご利用者様の責任範囲となりますのでご留意ください。
  • 本記事で記載した各サービス/ニフクラの機能等は、2020年3月時点の情報です。利用時には各サービス/ニフクラの機能の最新情報をご確認いただきご利用ください。