LogrotateとS3cmdを使用してUbuntu16.04のオブジェクトストレージにログをアーカイブする方法
序章
サーバーとアプリケーションによって生成されるログファイルには、ソフトウェアのデバッグ、セキュリティインシデントの調査、洞察に満ちたメトリックと統計の生成に役立つ可能性のある情報が満載です。
現在の一般的なログ戦略は、 ElasticStackやGraylogなどのログ集約サービスを介してこのすべての情報を一元化することです。 これは、リアルタイムの分析や短期から中期の履歴調査には最適ですが、ストレージの制約やその他のサーバーリソースの問題により、これらのシステムに長期のデータを保持できないことがよくあります。
これらの長期ストレージのニーズに対する一般的なソリューションは、オブジェクトストレージサービスを使用してログをアーカイブすることです。 ログは、後の分析、法的保持要件、またはバックアップの目的で無期限に利用できます。
このチュートリアルでは、Ubuntu16.04サーバーでLogrotateを使用して送信します syslog
オブジェクトストレージサービスにログを記録します。 この手法は、Logrotateによって処理されるすべてのログに適用できます。
前提条件
このチュートリアルを完了するには、次のものが必要です。
- Ubuntu 16.04を使用したサーバーの初期設定で説明されている、root以外のsudoが有効なユーザーを使用するUbuntu16.04サーバー。 このチュートリアルの構成は、多くの異なるLinuxディストリビューションでより広く機能するはずですが、ある程度の調整が必要になる場合があります。
- Logrotateと、Ubuntu16.04でのデフォルト構成の設定方法に精通している必要があります。 詳細については、 Ubuntu16.04でLogrotateを使用してログファイルを管理する方法をお読みください。
- オブジェクトストレージサービスについて、次の詳細を知っておく必要があります。
-
アクセスキー
-
シークレットキー
-
サーバー(または「エンドポイント」)のURL
-
バケット名
DigitalOcean Spacesを使用している場合は、 DigitalOceanSpaceと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
注: Github のリリースページにアクセスすると、新しいバージョンのS3cmdが利用可能かどうかを確認できます。 新しいバージョンを見つけた場合は、 .tar.gz
URLとそれをで置き換えます curl
上記のコマンド。
ダウンロードが完了したら、ファイルを解凍して解凍します。 tar
効用:
- tar xf s3cmd-*.tar.gz
次に、結果のディレクトリに移動し、を使用してソフトウェアをインストールします sudo
:
- cd s3cmd-*
- sudo python setup.py install
質問してインストールをテストします s3cmd
バージョン情報については:
- s3cmd --version
Outputs3cmd version 2.0.1
同様の出力が表示される場合は、S3cmdが正常にインストールされています。 次に、オブジェクトストレージサービスに接続するようにS3cmdを構成します。
ステップ2—S3cmdの構成
S3cmdには、オブジェクトストレージサーバーに接続するために必要な構成ファイルを作成できるインタラクティブな構成プロセスがあります。 root ユーザーはこの構成ファイルにアクセスする必要があるため、次を使用して構成プロセスを開始します。 sudo
構成ファイルをrootユーザーのホームディレクトリに配置します。
- 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
回答を要約してから、接続をテストするように求められます。 プレス y
それから ENTER
テストを開始するには:
OutputTest 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
ローテーションするたびにオブジェクトストレージにログを記録します。
まず、Logrotate構成ファイルを開きます rsyslog
、システムログプロセッサ:
- sudo nano /etc/logrotate.d/rsyslog
2つの構成ブロックがあります。 私たちは最初のものに興味があります。 /var/log/syslog
:
/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
ブロックしますが、クロージングの内側 }
ブラケット):
. . .
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つのログファイルを送信できます。 これは、何らかの理由でログローテーションを強制する必要がある場合に必要です(これについては次のステップで詳しく説明します)。
The lastaction
スクリプトは、すべてのログファイルが圧縮された後に実行されます。 サーバーのホスト名で変数を設定してから、 s3cmd sync
すべてのsyslogファイルをオブジェクトストレージバケットに同期し、ホスト名で指定されたフォルダーに配置します。 の最後のスラッシュに注意してください "s3://your-bucket-name/$HOSTNAME/"
重要です。 それがなければ、 s3cmd
扱います /$HOSTNAME
ログファイルでいっぱいのディレクトリではなく、単一のファイルとして。
構成ファイルを保存して閉じます。 次回Logrotateが毎日実行するときは、 /var/log/syslog
日付ベースのファイル名に移動され、圧縮されてアップロードされます。
これをすぐに実行して、正しく機能していることをテストできます。
- sudo logrotate /etc/logrotate.conf --verbose --force
Outputrotating 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を最後にもう一度実行する必要があります。 これを行うには、を実行するsystemdサービスを作成します logrotate
停止時のコマンド。
まず、テキストエディタで新しいサービスファイルを開きます。
- sudo nano /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
ライン。
ファイルを保存してテキストエディタを終了し、次に start
と enable
使用するサービス systemctl
:
- 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)
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
指図。
新しいサービスが機能していることを手動で停止することでテストできます。
- sudo systemctl stop logrotate-shutdown.service
またはシステムを再起動します。
- sudo reboot
どちらの方法でも、Logrotateコマンドがトリガーされ、新しいログファイルがアップロードされます。 これで、不正なシャットダウンを除けば、サーバーを破棄してもログが失われることはありません。
注:多くのクラウドプラットフォームは、サーバーが破壊または終了されているときに正常なシャットダウンを実行しません。 特定のセットアップでこの機能をテストし、正常なシャットダウン用に構成するか、最終的なログローテーションをトリガーするための別のソリューションを見つける必要があります。
結論
このチュートリアルでは、S3cmdをインストールし、オブジェクトストレージサービスに接続するように構成し、ローテーション時にログファイルをアップロードするようにLogrotateを構成しました。 /var/log/syslog
. 次に、実行するsystemdサービスを設定します logrotate --force
シャットダウン時に、エフェメラルサーバーを破棄するときにログが失われないようにします。
Logrotateで使用可能な構成の詳細については、次のように入力してマニュアルページを参照してください。 man logrotate
コマンドラインで。 S3cmdの詳細については、のWebサイトを参照してください。