【AWS_38】CloudWatch LogsでApacheのログを収集する

CloudWatch Logsの勉強のため、下記記事を参考にCloudWatchエージェントを使用してApache Webサーバーのアクセスログを収集してみます。
【Amazon CloudWatch Logs】ApacheのアクセスログをCloudWatch Logsへ収集する
https://blog.serverworks.co.jp/cloud-watch-logs-apache-access-log-setting
余談ですが、CloudWatchとCloudWatch Logsの違いについて調べてみたところ、どちらもAWSのモニタリングサービスの一環ですが、それぞれ異なる役割を持ちます。CloudWatchは、AWSリソースやアプリケーションのパフォーマンスメトリクスを収集・監視するサービスです。 一方、CloudWatch Logsは、AWSサービスやEC2インスタンスのログを収集・分析するサービスです。
CloudWatchでApache httpdサービスを監視し、停止時にメール通知アラートを送信する検証も記事にしてますのでよかったら参照いただければと思います。
目次
構成図

事前準備
VPC関連、EC2、Apacheはインストール、設定済みで「http://パブリックIPアドレス」へアクセスしてWEBページが表示されることを確認しておきます。今回は、簡易なindex.htmlを作成してアップしました。
EC2インスタンスには、SSHではなくセッションマネージャーで接続しています。

EC2インスタンスに必要なIAMロールの追加
IAMロールの作成
CloudWatchエージェントを正しく機能させるためには、EC2インスタンスに以下のIAMロールを追加する必要があります。
IAMロールには、AWS管理ポリシーの「CloudWatchAgentServerPolicy」を割り当てます。
AWSマネジメントコンソールで「IAM」を検索します。
左ペインのロールをクリックし、画面右上の「ロールを作成」をクリックします。
信頼されたエンティティを選択画面で「AWSのサービス」を選択、ユースケースで「EC2」を選択し、「次へ」をクリックします。


「許可ポリシー」で「CloudWatchAgentServerPolicy」を検索、チェックを入れて「次へ」をクリックします。

名前、確認、および作成画面でロール名を入力、その他はデフォルトのままとし、「ロールを作成」をクリックします。
ロール名:任意の名前


ロールが作成されました。

IAMロールをEC2インスタンスにアタッチ
作成したIAMロールをEC2インスタンスにアタッチします。
AWSマネジメントコンソールで「EC2」を検索します。
左ペインのインスタンスをクリック、IAMロールを割り当てたいEC2インスタンスにチェックを入れて、アクション > セキュリティ > IAMロールを変更 をクリックします。

IAMロールを変更画面のプルダウンより、先ほど作成したIAMロールを選択し、「IAMロールの更新」をクリックします。

画面下の「セキュリティ」タブをクリック、「IAMロール」へIAMロールが割り当てられていることを確認します。

CloudWatchエージェントのインストール
EC2インスタンスにログインして以下コマンドを実行し、CloudWatchエージェントをインストールします。Complete!が表示されれば成功です。
sudo dnf -y install amazon-cloudwatch-agent

CloudWatchエージェントを起動する前に状態を確認しておきます。Statusがstoppedで停止していることがわかります。
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status
-m :収集するメトリクスとログのモードを指定します。
-a :特定のアクションを実行します。

次に、CloudWatchエージェントを起動します。
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a start

あらためてCloudWatchエージェントの状態を確認します。Statusがrunningに変わり、起動していることが確認できました。
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status

CloudWatchエージェントの設定ファイルを作成
CloudWatchエージェントの設定ファイルを作成する方法は以下2通りあります。
・ウィザードを使用して作成
・手動で作成
CloudWatchでApache httpdサービスを監視の設定をした時は手動で作成したので、今回はウィザードを使用して作成したいと思います。
ウィザードを使用して設定ファイル 作成
EC2インスタンスで以下コマンドを実行、ウィザードを起動します。
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
表示されている質問に回答していきます。
default choice で提示されたものでよければ、そのままEnterキー押下します。
Amazon Linux のため、そのままEnterを押下します。

EC2のため、そのままEnterを押下します。

rootユーザーで実行させるため、「2」を入力し、Enterを押下します。

StatsDは利用しないため、「2」を入力し、Enterを押下します。

CollectdD からのメトリックを監視しないので、「2」を入力し、Enterを押下します。

CPU, メモリなどホストのメトリクスを監視しないため、「2」を入力し、Enterを押下します。

移行ではないため、「2」を入力し、Enterを押下します。

ログファイルを監視するので、そのままEnterを押下します。

収集したいApacheアクセスログのファイルパスを指定します。
今回は /var/log/httpd/access_log と入力し、Enterを押下します。

CloudWatchログの group name を指定します。
default choice で提示された access_log でよいのでそのままEnterを押下します。

group class は、デフォルトのままEnterを押下します。
AWS公式サイトより、
・STANDARD:は、リアルタイムモニタリングが必要なログや頻繁にアクセスするログに対するフル機能のオプションです。
・INFREQUENT_ACCESS:は、ログをコスト効率良く統合するために使用できる新しいログクラスです。

CloudWatchログの stream name を指定します。
default choice で提示された instance_id でよいのでEnterを押下します。

収集されたログの保持日数を指定します。
今回は検証のため、1(1日)の「2」を選択し、Enterを押下します。

上記のaccess_log 以外に収集したいログがあるかどうか回答します。
今回は error_log も収集するため、そのままEnterを押下します。

パス以外は、access_logと同じように回答します。

他に収集したいログはないので、「2」を選択し、Enterを押下します。

X-rayに関して何も取得しないため、「2」を選択し、Enterを押下します。

設定ファイルが /opt/aws/amazon-cloudwatch-agent/bin/config.json へ保存され、内容が出力されました。

設定ファイルはSSMパラメータストアに保存しないので、2を選択し、Enterを押下します。
ウィザードが自動で終了し、プロンプトが戻ります。

/opt/aws/amazon-cloudwatch-agent/bin/ に config.json が作成されました。

ウィザードの中でも出力されていましたが、設定ファイルの内容は以下のとおりです。

CloudWatchエージェント 起動
ウィザードを使用して設定されたファイルパスを指定し、起動します。
今回、すでに起動済みですが以下コマンドを実行しました。特にエラーは発生することなく完了しました。
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file://opt/aws/amazon-cloudwatch-agent/bin/config.json

参考サイトに記載されていましたが、この起動コマンドではなく systemctl コマンドをいきなり実行してしまうと、エラーとなってログが収集されないそうです。
systemctl で起動した場合は、別の設定ファイルパス /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json の設定を読み込もうとするようです。
手動で設定する場合は、このファイルパスへ config.jsonの内容をコピーすればよいと思います。
CloudWatchエージェントの状態より、起動していることを確認しておきます。
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status

動作確認
access_log、error_logの確認
Webサーバへアクセスし、access_log、error_log、ともに更新されていることを確認します。
access_log

error_log

CloudWatchで確認
AWSマネジメントコンソールで「cloudwatch」を検索します。
左ペインでロググループをクリックすると設定したロググループが表示されます。

表示されたロググループ(access_log)をクリック、ログストリームタブに設定したログストリーム名が表示されます。

さらにログストリーム名をクリックするとログイベント画面へ遷移し、access_log の取得が確認できます。
Webサーバのページを更新することでそのログがCloudWatch Logsへ追加で出力されることも確認できます。

ロググループのerror_log > ログストリーム からerror_logも同様に取得できていることが確認できます。
私の場合、/var/www/html/index.htmlファイルを削除して、ブラウザから「http://IPアドレス」でアクセスするとerror_logが更新されました。

以上でCloudWatch LogsでApacheのログを収集する検証は完了となります。
リソースの削除
簡単にですが、作成したリソースの削除について記載します。
CloudWatch:
・ロググループから作成したロググループを削除
IAMロール
・ EC2インスタンスからデタッチ
・IAMロールの削除
EC2インスタンスの削除
VPCの削除
まとめ
今回の検証において、CloudWatch LogsでApacheログを収集することができました。CloudWatch Logsの使い方が少し理解できました。
以下、他の記事をまとめた一覧です。AWSもまとめています。