LogrotateとS3cmdを使用してログをUbuntu 16.04のオブジェクトストレージにアーカイブする方法

前書き

サーバーとアプリケーションによって生成されるログファイルには、ソフトウェアのデバッグ、セキュリティインシデントの調査、および洞察に富んだメトリックと統計の生成に役立つ可能性のある情報が満載されています。

最近の典型的なロギング戦略は、https://www.digitalocean.com/community/tutorial_series/centralized-logging-with-elk-stack-elasticsearch-logstash-and-kibana- on-ubuntu-14-04 [Elastic Stack]またはhttps://www.digitalocean.com/community/tutorials/how-to-manage-logs-with-graylog-2-on-ubuntu-16-04[Graylog ]。 これは、リアルタイム分析や短期から中期の履歴調査には適していますが、ストレージの制約やその他のサーバーリソースの問題により、これらのシステムに長期データを保持することはできません。

これらの長期的なストレージニーズに対する一般的なソリューションは、オブジェクトストレージサービスでログをアーカイブすることです。 ログは、後の分析、法的保存要件、またはバックアップの目的で無期限に利用可能です。

このチュートリアルでは、Ubuntu 16.04サーバーでLogrotateを使用して、 `+ syslog +`ログをオブジェクトストレージサービスに送信します。 この手法は、Logrotateによって処理されるすべてのログに適用できます。

前提条件

このチュートリアルを完了するには、次のものが必要です。

  • https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04 [初期サーバー設定Ubuntu 16.04]。 このチュートリアルの構成は、さまざまなLinuxディストリビューションでより広く機能するはずですが、多少の調整が必要になる場合があります。

  • Logrotateと、Ubuntu 16.04でのデフォルト構成の設定方法に精通している必要があります。 詳細については、https://www.digitalocean.com/community/tutorials/how-to-manage-logfiles-with-logrotate-on-ubuntu-16-04 [Ubuntu 16.04でLogrotateを使用してログファイルを管理する方法]をお読みください。

  • オブジェクトストレージサービスに関する次の詳細を知る必要があります。

  • アクセスキー

  • 秘密鍵

  • サーバー(または「エンドポイント」)URL

  • バケット名 + DigitalOcean Spacesを使用している場合は、https://www.digitalocean.com/community/tutorials/how-to-create-a-digitalocean-space-and-api-key [DigitalOcean Spacesの作成方法]を読むことができます。 APIキー]を使用して、新しいバケットを作成し、上記の情報を取得します。

前提条件を完了したら、サーバーにSSHで接続して開始します。

ステップ1-S3cmdのインストール

  • S3cmd *というツールを使用して、S3互換オブジェクトストレージサービスにログを送信します。 S3cmdをインストールする前に、Pythonプログラムのインストールを支援するいくつかのツールをインストールする必要があります(S3cmdはPythonで記述されています)。

sudo apt-get update
sudo apt-get install python-setuptools

次に、書き込み可能なディレクトリに変更し、S3cmdの `+ .tar.gz +`ファイルをダウンロードします。

cd /tmp
curl -LO https://github.com/s3tools/s3cmd/releases/download/v2.0.1/s3cmd-2.0.1.tar.gz

ダウンロードが完了したら、 `+ tar +`ユーティリティを使用してファイルを解凍して解凍します。

tar xf s3cmd-*.tar.gz

次に、結果のディレクトリに移動し、 `+ sudo +`を使用してソフトウェアをインストールします。

cd s3cmd-*
sudo python setup.py install

バージョン情報を `+ s3cmd +`に尋ねてインストールをテストします。

s3cmd --version
Outputs3cmd version

同様の出力が表示される場合、S3cmdは正常にインストールされています。 次に、オブジェクトストレージサービスに接続するようにS3cmdを構成します。

ステップ2-S3cmdの構成

S3cmdには、オブジェクトストレージサーバーに接続するために必要な構成ファイルを作成できるインタラクティブな構成プロセスがあります。 * root ユーザーはこの設定ファイルにアクセスする必要があるため、 `+ sudo +`を使用して設定プロセスを開始し、 root *ユーザーのホームディレクトリに設定ファイルを配置します。

sudo s3cmd --configure --config=/root/logrotate-s3cmd.config

対話式セットアップが開始されます。 必要に応じて、 `+ ENTER`を押してデフォルトの回答(括弧内)を受け入れることができます。 以下のオプションと、DigitalOceanのNYC3リージョンのスペースに対する推奨される回答を順に説明します。 他のDigitalOceanデータセンターまたは他のオブジェクトストレージプロバイダーの必要に応じて、S3エンドポイントとバケットテンプレートを置き換えます。

  • アクセスキー: ++

  • 秘密鍵: ++

  • デフォルト地域[US]: + ENTER +

  • S3エンドポイント[s3.amazonaws.com]: ++

  • バケットにアクセスするためのDNSスタイルバケット+ホスト名:ポートテンプレート[%(bucket)s.s3.amazonaws.com]: ++

  • 暗号化パスワード: + ENTER +、または暗号化するパスワードを指定します

  • GPGプログラムへのパス[/ usr / bin / gpg]: + ENTER +

  • HTTPSプロトコルを使用[はい]: + ENTER +

  • HTTPプロキシサーバー名: + ENTER +、またはプロキシ情報を入力します

この時点で、 `+ s3cmd `は応答を要約し、接続のテストを依頼します。 ` y `を押し、次に ` ENTER +`を押してテストを開始します。

OutputTest access with supplied credentials? [Y/n]
Please wait, attempting to list all buckets...

テスト後、設定を保存するよう求められます。 繰り返しになりますが、「+ y 」と入力してから「 ENTER 」と入力します。 設定ファイルは、 `-config +`コマンドラインオプションを使用して以前に指定した場所に書き込まれます。

次のステップでは、S3cmdを使用してログをアップロードするようにLogrotateを設定します。

手順3-回転ログをオブジェクトストレージに送信するためのLogrotateのセットアップ

Logrotateは、ログファイルのローテーションと圧縮を管理するための強力で柔軟なシステムです。 Ubuntuはデフォルトでこれを使用して、 `+ / var / log +`にあるすべてのシステムログを維持します。

このチュートリアルでは、設定を更新して、ローテーションされるたびにオブジェクトストレージに `+ syslog +`ログを送信します。

まず、システムログプロセッサである `+ rsyslog +`のLogrotate設定ファイルを開きます。

sudo nano /etc/logrotate.d/rsyslog

2つの構成ブロックがあります。 `+ / var / log / syslog +`を扱う最初のものに興味があります:

/etc/logrotate.d/rsyslog

/var/log/syslog
{
   rotate 7
   daily
   missingok
   notifempty

   compress
   postrotate
       invoke-rc.d rsyslog rotate > /dev/null
   endscript
}
. . .

この設定は、7つの古いログが保持される( + rotate 7 +)とともに、 + / var / log / syslog +`が毎日ローテーションされること( `+ daily +)を指定します。 ログファイルが欠落している場合( + missingok +)でもエラーは発生せず、空の場合はログがローテーションされません( + notifempty +)。 ローテーションされたログは圧縮されます( + compress +)が、最新のログ( + delaycompress +)ではありません。 最後に、 `+ postrotate `スクリプトは、古いログファイルがローテーションされた後に新しいログファイルに切り替えるように ` rsyslog +`に指示します。

新しい設定ディレクティブを追加する前に、上で強調表示されている `+ delaycompress +`行を削除します。 古いログはすべて、オブジェクトストレージに送信する直前に圧縮する必要があります。

次に、設定ブロックの最後に次の行を追加します( `+ postrotate `の外側… ` endscript `ブロックで、閉じている `} +`ブラケットの内側):

/etc/logrotate.d/rsyslog

. . .
       dateext
       dateformat -%Y-%m-%d-%s
       lastaction
               HOSTNAME=`hostname`
               /usr/local/bin/s3cmd sync --config=/root/logrotate-s3cmd.config /var/log/syslog*.gz "s3:///$HOSTNAME/"
       endscript
. . .

上記の強調表示された部分を正しいバケット名に置き換えてください。 これらのオプションは、日付ベースのファイル名拡張子( + dateext +)を有効にするため、ログファイルにタイムスタンプを付けることができます。 次に、これらの拡張機能の形式を `+ dateformat `で設定します。 ファイルは、 ` syslog-2017-11-07-1510091490.gz +`のようなファイル名になります:年、月、日付、そしてタイムスタンプ。 タイムスタンプにより、ファイル名が競合することなく、同じ日に2つのログファイルを出荷できます。 これは、何らかの理由でログのローテーションを強制する必要がある場合に必要です(これについては次のステップで詳しく説明します)。

すべてのログファイルが圧縮された後、 `+ lastaction `スクリプトが実行されます。 サーバーのホスト名を使用して変数を設定し、 ` s3cmd sync `を使用してすべてのsyslogファイルをオブジェクトストレージバケットまで同期し、ホスト名で指定されたフォルダーに配置します。 `" s3:/// $ HOSTNAME / "`の最後のスラッシュは重要であることに注意してください。 これがないと、 ` s3cmd `は ` / $ HOSTNAME +`をログファイルでいっぱいのディレクトリではなく単一のファイルとして扱います。

構成ファイルを保存して閉じます。 次回Logrotateが毎日実行されるとき、 `+ / var / log / syslog +`は日付ベースのファイル名に移動され、圧縮されてアップロードされます。

これをすぐに強制的に実行して、正常に機能していることをテストできます。

sudo logrotate /etc/logrotate.conf --verbose --force
Outputrotating pattern: /var/log/syslog
. . .


. . .

switching euid to 0 and egid to 0
upload: '/var/log/syslog-2017-11-08-1510175806.gz' -> 's3://example-bucket/example-hostname/syslog-2017-11-08-1510175806.gz'  [1 of 1]
36236 of 36236   100% in    0s   361.16 kB/s  done

これにより、多くのログファイルに関する多くの情報が出力されます。 `+ syslog`ログとアップロードに関連する部分は上記の抜粋です。 出力は、アップロードが成功したことを示すいくつかの証拠とともに、同じように見えるはずです。 サーバーが新品でない場合、アップロードされるファイルが増える可能性があります。

次に、システムをシャットダウンする前にログをアップロードできるように、オプションでサービスを設定します。

手順4-シャットダウン時にログを送信する

この手順はオプションであり、頻繁にシャットダウンおよび破棄される一時サーバーを構成する場合にのみ必要です。 この場合、サーバーを破棄するたびに最大1日分のログが失われる可能性があります。

これを修正するには、システムがシャットダウンする前に、Logrotateを最後に1回実行する必要があります。 これを行うには、停止時に `+ logrotate +`コマンドを実行するsystemdサービスを作成します。

まず、テキストエディターで新しいサービスファイルを開きます。

sudo nano /etc/systemd/system/logrotate-shutdown.service

次のサービス定義を貼り付けます。

/etc/systemd/system/logrotate-shutdown.service

[Unit]
Description=Archive logs before shutdown
After=network.target

[Service]
RemainAfterExit=yes
ExecStop=/usr/sbin/logrotate /etc/logrotate.conf --force

[Install]
WantedBy=multi-user.target

このファイルは、起動時に何もしないサービス( + ExecStart +`ステートメントがない)を定義し、停止時に `+ logrotate +( `-force +`オプションで)を実行します。 ` After = network.target +`行のためにネットワーク接続がシャットダウンされる前に実行されます。

ファイルを保存してテキストエディターを終了し、 `+ systemctl `を使用してサービスを ` start `および ` enable +`します。

sudo systemctl start logrotate-shutdown.service
sudo systemctl enable logrotate-shutdown.service

新しいサービスのステータスを確認します。

sudo systemctl status logrotate-shutdown.service
Output● logrotate-shutdown.service - Archive logs before shutdown
  Loaded: loaded (/etc/systemd/system/logrotate-shutdown.service; enabled; vendor preset: enabled)
   since Wed 2017-11-08 20:00:05 UTC; 8s ago

Nov 08 20:00:05 example-host systemd[1]: Started Archive logs before shutdown.

それが `+ active `であることを確認したいと思います。 「 exited 」があるという事実は問題ありません。これは「 ExecStart +」コマンドがないためです。

手動で停止することにより、新しいサービスが機能していることをテストできます。

sudo systemctl stop logrotate-shutdown.service

または、システムを再起動してください。

sudo reboot

いずれの方法でもLogrotateコマンドがトリガーされ、新しいログファイルがアップロードされます。 これで、異常なシャットダウンがなければ、サーバーを破壊してもログは失われません。

結論

このチュートリアルでは、S3cmdをインストールし、オブジェクトストレージサービスに接続するように設定し、 `+ / var / log / syslog `をローテーションするときにログファイルをアップロードするようにLogrotateを設定しました。 次に、シャットダウン時に ` logrotate --force +`を実行するようにsystemdサービスを設定し、一時サーバーを破棄するときにログが失われないようにします。

Logrotateで利用可能な設定の詳細については、コマンドラインに「+ man logrotate +」と入力して、マニュアルページを参照してください。 S3cmdの詳細については、http://s3tools.org/ [their website]をご覧ください。

Related