🦔

CloudWatch Agent - メトリクスとログを監視してみた

2023/02/06に公開約9,500字

はじめに

AWS初心者のArishoです!
Auto Scaling で日々 EC2 インスタンスが入れ替わってしまうため、ログをどこかに保管したいなと感じた場面がありました。
そんな中、アプリケーションのエラーログや Apache のエラーログを CloudWatch に取り込み管理ができる記事を見つけたので、 CloudWatch Agent について勉強してみました。

CloudWatch Agent とは

EC2 インスタンスやオンプレミスサーバーにインストールすることで、メトリクスやログを収集して CloudWatch へ送信することができます。また、ログのアーカイブや分析時に役立ちます。

つまり、使用中のすべてのシステム、アプリケーション、AWS サービスのログファイルを監視できるようにする便利屋さんです。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html

CloudWatch Agent 設定ファイルとは

CloudWatch Agent 設定ファイルは、agent、metrics、logs の 3 つのセクションを持ち、どんなメトリクスを監視するか、どのログファイルを取り込むかなどを設定する JSON ファイルです。
CloudWatch Agent 設定ファイルは、サーバー上またはパラメータストアに保存でき、複数使用することができます。

パラメータストアとは、設定データ管理と機密管理のための安全な階層型ストレージを提供するサービスです。パスワード、データベース文字列、Amazon Machine Image (AMI) ID、ライセンスコードなどのデータをパラメータ値として保存することができます。
また、パラメータストアに保存することで、簡単に設定を変更することができるためおすすめです。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html

- agent セクション

監視する EC2 インスタンスがあるリージョンの情報やメトリクスを収集する頻度など、エージェントの全体的な設定に関するフィールドが含まれています。

- metrics セクション

CloudWatch で監視するメトリクスを指定します。例えば CPU がアクティブになっている時間などです。メトリクスは複数設定することが可能です。
ログを収集するだけの場合は、ファイルから metrics セクションを省略して問題ないようです。
監視できるメトリクスは AWS ドキュメントを参照してください。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/metrics-collected-by-CloudWatch-agent.html#linux-metrics-enabled-by-CloudWatch-agent

- logs セクション

CloudWatch Logs に取り込みたいログのパス、CloudWatch Logs のロググループ名、ログストリーム(同じソースを共有する一連のログイベント)の設定などを指定します。ログファイルの取り込み設定は複数設定することができます。

やってみる - メトリクスおよびログを監視する

1. 事前準備

前提条件として、メトリクスおよびログを監視する対象の EC2 インスタンスがあること。
下記の IAM ロールがアタッチされていること。

2. CloudWatch Agent をインストールする

対象の EC2 インスタンス内に CloudWatch Agent をインストールします。
以下のコマンドで CloudWatch Agent をインストールします。

$ sudo yum install amazon-cloudwatch-agent

インスト―ル場所は、/opt/aws/amazon-cloudwatch-agent になります。
インストール場所

3. CloudWatch Agent 設定ファイルを作成する

以下のコマンドで CloudWatch Agent 設定ファイルウィザードを起動します。

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

CloudWatch Agent 設定ファイルを作成する際、以下の内容を質問形式で聞かれるので設定したい内容で回答をします。
質問画面

上記の設定が完了すると、作成した CloudWatch Agent 設定ファイルが SSM パラメータストアに表示されます。(例. AmazonCloudWatch-linux パラメータを作成して保存した場合)
パラメータ

以下、パラメータストアに保存した CloudWatch Agent 設定ファイルの中身となります。
(例. AmazonCloudWatch-linux パラメータに保存したCloudWatch Agent 設定ファイルの内容)
設定ファイル

追加で監視したいメトリクスやログファイルがある場合は、パラメータストアに保存した CloudWatch Agent 設定ファイルを編集する事で追加ができます。

4. collectdをインストール

以下のコマンドで対象の EC2 インスタンス内に collectd をインストールします。
collectd は、サーバの統計情報を収集するためのオープンソースソフトウェアです。

$ sudo amazon-linux-extras install collectd

5. Systems Manager から CloudWatch Agent を起動

Systems Manager(以下「SSM」と称する)は、AWS アプリケーションおよびリソースのオペレーションハブでエンドツーエンドの管理を行ってくれます。
SSM の Run Command でターゲットに指定した EC2 インスタンスに対して CloudWatch Agent を起動します。

SSM ダッシュボードのサイドメニューから「Run Command」を選択し、「Run Command」のボタンをクリックします。
Run Command
以下の設定を行います。

  • コマンドドキュメント :「AmazonCloudWatch-ManageAgent
    コマンド1
  • Action :「append-config(追加)」or「configure(上書き)
  • Mode :「ec2
  • Optional Configuration Source :「パラメータストアに保存したパラメータ名
  • Optional Restart :「yes
  • ターゲット :「インスタンスを手動で選択する:対象の EC2 インスタンス ID をクリック」
    (タグの指定を選択した場合、同じタグが付いている EC2 インスタンスに対して実行することもできます。)
    コマンド2
    コマンド3

6. SSM 以外からの起動 (5.を実行した場合は不要)

対象の EC2 インスタンスに SSH 接続もしくは SSM で接続して、CloudWatch Agent を開始します。以下のコマンドで CloudWatch Agent を開始します。

$ sudo systemctl start amazon-cloudwatch-agent.service

7. 確認

AmazonCloudWatch のロググループに、ログファイルが取り込まれているかを確認します。
上記で設定したメトリクスおよびログファイルが取り込まれていれば、完了となります。
(例. ロググループ「/var/log/httpd/error_log」にログファイルを取り込む場合)
ロググループ
ログファイル
CloudWatch Agent 設定ファイルで設定したロググループが作成され、その中にログファイルが取り込まれていることが確認できました。ログストリーム(同じソースを共有する一連のログイベント)はインスタンス ID を設定しているので、各インスタンスでログファイルが取り込まれています。

ロググループにログが取り込まれない場合

Cloudwatch Logs でログが取り込まれない場合は、以下の原因が考えられます。

原因 1 - State ファイルの重複

Stateファイルは CloudWatch Agent がどこまでログを読み込んだかを記録しているファイルです。Stateファイルが重複してしまうと、うまく取り込めないようです。
Stateファイルを削除することで、再度 CloudWatch Logs にログを送ることができます。

まず、対象の EC2 インスタンス内で、エージェントを停止します。
以下のコマンドでエージェント停止します。

$ sudo systemctl stop amazon-cloudwatch-agent.service

次に、State ファイル内にある対象パラーメータ名のファイルを削除します。
Stateファイルは、下記のパスにあります。

$ cd /opt/aws/amazon-cloudwatch-agent/logs/state/

以下のコマンドでファイルを削除します。

$ rm /opt/aws/amazon-cloudwatch-agent/logs/state/削除するファイル名(パラメータ名)

最後に、SSM からエージェントを起動する or 対象の EC2 インスタンス内でエージェントを起動します。
State ファイルを削除し、もう一度エージェントを起動することでログを CloudWatch Logs に送ることができるようになります。

原因 2 - エージェントのバージョン問題

State ファイルが原因ではない場合は、エージェントのバージョンアップに問題がある可能性があります。
以下のコマンドでエージェントをアップデートします。

$ sudo rpm -U ./amazon-cloudwatch-agent.rpm

エージェントをアップデートした後、デーモンを再起動します。
以下のコマンドで systemd に変更内容を反映とデーモンを再起動します。

$ sudo systemctl daemon-reload
$ sudo systemctl restart amazon-cloudwatch-agent.service


まとめ

今回は、EC2インスタンス内のログファイルとメトリクスを CloudWatch のロググループで監視することを行いました。

  • CloudWatch Agent 設定ファイルには、CloudWach で監視したいメトリクス、ロググループの設定、取り込むログファイルを複数設定ができる。
  • CloudWatch Agent 設定ファイルを SSM パラメータストアに保存することで、メトリクスやログファイルを楽に追加する事ができる。
  • CloudWatch Agent 設定ファイルは、 AMI で引き継げる。
  • State ファイルにパラメータの実行結果がある AMI から EC2 インスタンスを起動すると、重複してしまいログファイルが取り込めない。
  • CloudWatch Agent を停止し、State ファイルのパラメータ実行結果を削除した上でAMI を作成することで AMI から起動した EC2 インスタンスは自動でログファイルを取り込むことができる。

その他

  • CloudWatch Agent をインストールする。
$ sudo yum install amazon-cloudwatch-agent
  • CloudWatch Agent を開始する。
$ sudo systemctl start amazon-cloudwatch-agent.service
  • CloudWatch Agent を停止する。
$ sudo systemctl stop amazon-cloudwatch-agent.service
  • CloudWatch Agent の起動ステータスを確認。
$ sudo systemctl status  amazon-cloudwatch-agent.service
  • CloudWatch Agent の自動起動を確認。
$ systemctl list-unit-files | grep amazon-cloudwatch-agent.service
  • ファイルを削除する。
$ rm 削除するファイルのパス

Discussion

ログインするとコメントできます