序章

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

現在の一般的なログ戦略は、 ElasticStackGraylogなどのログ集約サービスを介してこのすべての情報を一元化することです。 これは、リアルタイムの分析や短期から中期の履歴調査には最適ですが、ストレージの制約やその他のサーバーリソースの問題により、これらのシステムに長期のデータを保持できないことがよくあります。

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

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

前提条件

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

  • Ubuntu 16.04を使用したサーバーの初期設定で説明されている、root以外のsudoが有効なユーザーを使用するUbuntu16.04サーバー。 このチュートリアルの構成は、多くの異なるLinuxディストリビューションでより広く機能するはずですが、ある程度の調整が必要になる場合があります。
  • Logrotateと、Ubuntu16.04でのデフォルト構成の設定方法に精通している必要があります。 詳細については、 Ubuntu16.04でLogrotateを使用してログファイルを管理する方法をお読みください。
  • オブジェクトストレージサービスについて、次の詳細を知っておく必要があります。 アクセスキーシークレットキーサーバー(または「エンドポイント」)URLバケット名DigitalOceanスペースを使用している場合は、「DigitalOceanスペースとAPIキーを作成する方法」を読んで、新しいバケットを作成し、上記の情報を取得できます。

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

ステップ1—S3cmdをインストールする

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

  1. sudo apt-get update
  2. sudo apt-get install python-setuptools

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

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

注: Github リリースページにアクセスすると、新しいバージョンのS3cmdが利用可能かどうかを確認できます。 新しいバージョンを見つけた場合は、.tar.gz URLをコピーして、上記のcurlコマンドに置き換えてください。

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

  1. tar xf s3cmd-*.tar.gz

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

  1. cd s3cmd-*
  2. sudo python setup.py install

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

  1. s3cmd --version
Output
s3cmd version 2.0.1

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

ステップ2—S3cmdの構成

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

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

インタラクティブなセットアップが始まります。 必要に応じて、ENTERを押すことにより、デフォルトの回答(括弧内)を受け入れることができます。 DigitalOceanのNYC3リージョンにあるスペースの提案された回答とともに、以下のオプションについて説明します。 他のDigitalOceanデータセンターまたは他のオブジェクトストレージプロバイダーの必要に応じて、S3エンドポイントとバケットテンプレートを置き換えます。

  • アクセスキー:your-access-key
  • 秘密鍵:your-secret-key
  • デフォルトの地域[米国]:ENTER
  • S3エンドポイント[s3.amazonaws.com]:nyc3.digitaloceanspaces.com
  • DNSスタイルのバケット+ホスト名:バケットにアクセスするためのポートテンプレート[%(bucket) s.s3.amazonaws.com ]:%(bucket)s.nyc3.digitaloceanspaces.com
  • 暗号化パスワード:ENTER、または暗号化するパスワードを指定します
  • GPGプログラムへのパス[/usr/ bin / gpg]:ENTER
  • HTTPSプロトコルを使用する[はい]:ENTER
  • HTTPプロキシサーバー名:ENTER、またはプロキシ情報を入力します

この時点で、s3cmdは応答を要約し、接続をテストするように求めます。 yENTERの順に押して、テストを開始します。

Output
Test access with supplied credentials? [Y/n] y Please wait, attempting to list all buckets... Success. Your access key and secret key worked fine :-)

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

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

ステップ3—ローテーションされたログをオブジェクトストレージに送信するようにLogrotateを設定する

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

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

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

  1. sudo nano /etc/logrotate.d/rsyslog

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

/etc/logrotate.d/rsyslog
/var/log/syslog
{
	rotate 7
	daily
	missingok
	notifempty
	delaycompress
	compress
	postrotate
		invoke-rc.d rsyslog rotate > /dev/null
	endscript
}
. . .

この構成では、/var/log/syslogが毎日ローテーションされ(daily)、7つの古いログが保持される(rotate 7)ように指定されています。 ログファイルが欠落している場合(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://your-bucket-name/$HOSTNAME/"
        endscript
. . .

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

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

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

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

  1. sudo logrotate /etc/logrotate.conf --verbose --force
Output
rotating pattern: /var/log/syslog . . . considering log /var/log/syslog log needs rotating . . . running last action script 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 Done. Uploaded 36236 bytes in 1.0 seconds, 35.39 kB/s.

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

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

ステップ4—シャットダウン時にログを送信する

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

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

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

  1. 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サービスを終了します。

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

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

  1. 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) Active: active (exited) 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コマンドがないためです。

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

  1. sudo systemctl stop logrotate-shutdown.service

またはシステムを再起動します。

  1. sudo reboot

どちらの方法でも、Logrotateコマンドがトリガーされ、新しいログファイルがアップロードされます。 これで、不正なシャットダウンを除けば、サーバーを破棄してもログが失われることはありません。

注:多くのクラウドプラットフォームは、サーバーが破壊または終了されているときに正常なシャットダウンを実行しません。 特定のセットアップでこの機能をテストし、正常なシャットダウン用に構成するか、最終的なログローテーションをトリガーするための別のソリューションを見つける必要があります。

結論

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

Logrotateで使用可能な構成の詳細については、コマンドラインでman logrotateと入力してマニュアルページを参照してください。 S3cmdの詳細については、のWebサイトを参照してください。