EC2 インスタンスの /var/log/messages をDatadog で監視する。

記事タイトルとURLをコピーする

初めに

こんにちは。

東京でセミがあまり鳴いていないことを憂いている山﨑です。

インフラ管理における重要なポイントであるサーバーのログ監視について、一筆しました。 Squid がインストールされた Proxy サーバーと Datadog Agent を利用して、サーバーの /var/log/messages を監視してみようと思います。

/var/log/messages とは、Linuxシステムで最も重要なログファイルの一つでして、カーネルからのメッセージやシステムの起動・停止、各種サービスの開始終了・エラーなどの情報が含まれております。 最近のLinuxディストリビューションでは、journalctlコマンドを使用してシステムログを管理する傾向が強くなっていますが、まだまだ人気のログファイルです。

長文ですので、必要な情報だけを覗いて頂ければと思います。

概要

以下の構成にて、EC2 インスタンスのログ (今回の場合、/var/log/messages) を Datadog に転送しようと思います。

今回の構成図

今回は NAT ゲートウェイ使わず、Proxy サーバーを用いた構成にしてみました。

前提条件

  • Datadog アカウントと AWS アカウントはインテグレーション設定済みの状態

  • 今回踏み台サーバー・ Proxy サーバー・被監視サーバーに利用するインスタンスの OS は、 Amazon Linux 2023

  • AWS アカウントと Datadog Organization のインテグレーションは設定済み

いざ実践

0. セキュリティグループ設定

  • Proxy サーバー

    タイプ プロトコル ポート範囲 ソース
    SSH TCP 22 ログイン元のIPアドレス
    カスタムTCP TCP 3128 対象インスタンスのIPアドレス or 対象インスタンスにアタッチされているセキュリティグループ

3128 は Squidなどの Proxy サーバーがクライアントリクエストを待ち受けるために使用されるデフォルトのポート番号になります。

  • 被監視サーバー

    タイプ プロトコル ポート範囲 ソース
    SSH TCP 22 Proxy サーバーのIPアドレス or Proxy サーバーにアタッチされているセキュリティグループ

1. 踏み台サーバーにアクセスし、被監視サーバーにポート転送してログインする

今回のケースですと、一つのサーバーが、Proxy サーバーと踏み台サーバーの役割を兼ねておりますが、別々に分けてもよいかと思います。

ポートフォワードして、被監視サーバーにログイン

2. Proxy サーバーにプロキシ設定を行う

Proxy 設定につきましては、弊社山口が書いた、以下のブログを参考にしてください。

下記のブログを端的に述べると、Proxy サーバに Squid をインストールし、/etc/squid/squid.conf で、localnet ACLで定義されたIPアドレス範囲からのHTTPアクセスを許可してあげます。

プロキシ (Squid) 経由で EC2 のログを CloudWatch Logs へログを出力させる - サーバーワークスエンジニアブログ

Squid の設定が完了した後は、忘れずに起動時に Squid が起動するにように enable にしておきましょう。

  
$ sudo systemctl enable squid
  

3. 被監視サーバーにプロキシ設定を行う

3-1. シェルセッション変数にプロキシ設定を行う
  
$ export HTTPS_PROXY=http://プライベート IP DNS 名:ポート番号(今回は3128)
  

シェルセッション変数を設定することで、被監視サーバーへのHTTPS通信は、Proxy を経由した通信とする設定ができます。

3-2. dnf 用に Proxy 設定を行う

/etc/dnf/dnf.conf に Proxy 設定を行う。 こうすることで、dnf がプロキシを利用してインターネットにアクセスできるようになります。

/etc/dnf/dnf.conf を編集します。

  
$ sudo vi /etc/dnf/dnf.conf
  

下記を[main]セクションの最後に追記する

  
proxy=http://Proxy サーバーのプライベート IP DNS 名:3128
  

NAT ゲートウェイを利用する場合は、上記の2と3は、スキップしていいのでコストやセキュリティを気にする必要がない場合は積極的に使った方がいいですね。

4. 被監視サーバーにDatadog Agent をインストールする

ここまでして、ようやくプライベートサブネットにある被監視サーバーにDatadog Agent をインストールすることができます。

Datadog にログインし、Integrations > Install Agents から、対象のOS (今回の場合、Linux) を選択し、APIキーをコピー、保存する。

Integration > Install Agents

APIキーをコピーする

コピーしたコマンドを被監視サーバーに入力し、Datadog Agent をインストールしましょう!

5. 被監視サーバーに rsyslog をインストールし、/var/log/messages を使えるようにする

実はAmazon Linux 2023 のデフォルトの状態では、/var/log/messages は使えません。 バイナリ形式で /var/log/journal ディレクトリに保存されます Amazon Linux 2023 journalctlコマンドを使用する必要があります。

repost.aws

一方で冒頭でも述べた通り、まだまだ /var/log/messages は人気です。

利用するためには、/var/log/messages を生成する機能を持つ rsyslog をインストールしてあげる必要があります。

rsyslog をインストールし、 enable に設定する

  
sudo dnf install rsyslog -y
  
  
sudo systemctl enable rsyslog
  

インストール後、/var/log/messages が使えるようになったかを確認します。

  
ls -l /var/log/messages
  

以下のような出力が確認できれば、rsyslogサービスが機能していることになります。

  
-rw-r----- 1 root adm 12345 Aug  4 11:45 /var/log/messages
  

6. Datadog の設定ファイルを編集し、/var/log/messages を送信するよう設定する

6-1. datadog.yaml と conf.d/logfile.d/conf.yaml を編集し、ログがDatadogに出力されるように設定します。

datadog.yamlが、ログを送るための設定、conf.d/logfile.d/conf.yaml がどのログを送るのかを設定するファイルになります。

  • /etc/datadog-agent/conf.d/logfile.d/conf.yaml を作成

conf.yaml で、送信するログを設定する

  • path で監視したいログファイルを選びます。今回はタイトルの通り、/var/log/messages を入力します。

  • service は、このログに紐づけるサービス名です。DatadogのUI上で表示されます。 例えば、service: my-web-app のように設定することも可能です。

  • log_processing_rules で、Datadogに送信される前に適用される処理ルールを定義することが可能です。

  • 今回は、- type: include_at_match で ERROR と CRITICAL が含まれているログのみがDatadog に送信されるようにします。

  • name: swx_include は、このルールの名前になります。

  • 所有者と権限を変更する ファイルができたら、/etc/datadog-agent/conf.d/logfile.d/conf.yaml の所有者と、/var/log/messages の権限を変更して、Datadog がこれらのファイルを参照できるようにしてあげましょう。

/etc/datadog-agent/conf.d/logfile.d/conf.yaml の所有者を変更する

  
sudo chown -R root:root /etc/datadog-agent/conf.d/logfile.d
  

/var/log/messages の権限を変更する

  
sudo chmod o+x /var/log
sudo chmod o+r /var/log/messages
  
6-2. datadog.yaml という設定ファイルで、ログを送信するよう編集しましょう。

編集する際、バックアップを取って置いたり、ローカルにダウンロードしてVSコード上で編集すると便利です。

今回は、ログのみ監視できたらいいので、log_ の部分だけを設定します。 また、proxy 設定もしてあげましょう。

  
api_key: xxxxxxxxxxxx

proxy:
  https: http://Proxy サーバーのプライベート IP DNS 名:3128
  http: http://Proxy サーバーのプライベート IP DNS 名:3128
  no_proxy:
    - 169.254.169.254
    - localhost

logs_enabled: true

logs_config:  
 

プロセスやディスク領域を監視対象として設定することもできます。

7. Datadog 上でログを確認する。

test でERRORメッセージを出力してみましょう

  
logger -p user.error "This is a test ERROR message."
  

Datadog にログイン後、Logs に移動 service 名(/etc/datadog-agent/conf.d/logfile.d/conf.yaml に入力したもの)host にインスタンスIDを入力して検索します。

ログの確認

確認できましたね。

log の確認

logfile.d/conf.yaml の設定の内、- type: include_at_match を変更することですべてのログを吐き出すこともできます。 色々試してみるといいですね。

最後に(躓きポイント)

ここまで、読んでくださりありがとうございました。

ログを Datadog のような監視ツールに送信することで、ログ監視の効率がとてもよくなります。 今回のようなエラーメッセージが発生した時にアラートを設定することで、対応のスピードも速くなります。

最後に個人的に躓きポイントをまとめたので、躓いた方は確認してみましょう。

  • 権限 /var/log/messages とlogfile.d の所有者と権限を変更してあげましょう。
  • プロキシ が enable になっているか確認しましょう
  • SG設定 proxy サーバのポート3128を開けてあげましょう
  • プロキシ設定 被監視サーバーの conf.yaml でproxy 設定をしてあげましょう。
  • datadog.yaml の半角スペースやインデントが崩れていないか確認しましょう。

それではまたどこかで!