LogrotateとS3cmdを使用してUbuntu16.04のオブジェクトストレージにログをアーカイブする方法
序章
サーバーとアプリケーションによって生成されるログファイルには、ソフトウェアのデバッグ、セキュリティインシデントの調査、洞察に満ちたメトリックと統計の生成に役立つ可能性のある情報が満載です。
現在の一般的なログ戦略は、 ElasticStackやGraylogなどのログ集約サービスを介してこのすべての情報を一元化することです。 これは、リアルタイムの分析や短期から中期の履歴調査には最適ですが、ストレージの制約やその他のサーバーリソースの問題により、これらのシステムに長期のデータを保持できないことがよくあります。
これらの長期ストレージのニーズに対する一般的なソリューションは、オブジェクトストレージサービスを使用してログをアーカイブすることです。 ログは、後の分析、法的保持要件、またはバックアップの目的で無期限に利用できます。
このチュートリアルでは、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で書かれています)。
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
ログをオブジェクトストレージに送信するように構成を更新します。
まず、システムログプロセッサであるrsyslog
のLogrotate構成ファイルを開きます。
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
は日付ベースのファイル名に移動され、圧縮されてアップロードされます。
これをすぐに実行して、正しく機能していることをテストできます。
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を最後にもう一度実行する必要があります。 これを行うには、停止時に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) 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
回転したときにログファイルをアップロードするように構成しました。 次に、シャットダウン時にlogrotate --force
を実行するようにsystemdサービスを設定し、一時的なサーバーを破棄するときにログが失われないようにします。
Logrotateで使用可能な構成の詳細については、コマンドラインでman logrotate
と入力してマニュアルページを参照してください。 S3cmdの詳細については、のWebサイトを参照してください。