今日も屋根裏からこんにちわ。 技術1課の折戸です。
春の訪れとともに屋根裏は気温がどんどん上昇しております。 そろそろエアコンを本格的に検討しなければ。
さて、今回はApachのアクセスログをAmazon CloudWatch Logs (以下、CloudWatch Logs)へ収集する方法をご紹介します。
- Amazon CloudWatch Logs とは
- 前提条件
- EC2 に CloudWatch Logs へのログ出力権限 付与
- CloudWatchエージェント インストール
- CloudWatchエージェント設定ファイル 作成
- CloudWatchエージェント 起動
- CloudWatchエージェント 自動起動 有効化
- 動作確認
- 最後に
Amazon CloudWatch Logs とは
CloudWatch Logs により、使用中のすべてのシステム、アプリケーション、AWS のサービスからのログを、スケーラビリティに優れた 1 つのサービスで一元管理することができます。
ざっくり説明すると、様々なログを集約し管理することができるサービスです。
より詳しい内容については以下のドキュメントを参照ください。 docs.aws.amazon.com
前提条件
Amazon Linux 2 でEC2起動済
SSMセッションマネージャーもしくはSSHなどでサーバーログイン可能
Apacheは設定起動済、以下のファイルパスへログファイル出力設定済
- /var/log/httpd/access_log
- /var/log/httpd/error_log
EC2 に CloudWatch Logs へのログ出力権限 付与
IAM Role 作成
コンソールにて、 CloudWatchAgentServerPolicy ポリシーをアタッチしたIAM Roleを作成します。
名前は任意で問題ありません。
IAM Role を EC2 へアタッチ
コンソールにて、作成したIAM RoleをEC2インスタンスへアタッチします。
CloudWatchエージェント インストール
EC2へCloudWatchエージェント インストール
$ sudo yum install amazon-cloudwatch-agent -y
インストール 確認
$ sudo yum list installed | grep amazon-cloudwatch-agent
戻り値
amazon-cloudwatch-agent.x86_64 1.247350.0-1.amzn2 @amzn2-core
CloudWatchエージェント設定ファイル 作成
設定する方法は2通りあります。
- ウィザードを使用して作成
- 手動で作成
今回はウィザードを使用する方法で設定ファイルを作成し、作成された設定ファイルの中身を確認することにします。
ウィザードを使用して設定ファイル 作成
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
表示されていく質問に答えていきます。
提示された番号もしくは文字列を入力し、Enterキー押下で進めていきます。
default choice
で提示されたもので問題なければ、そのままEnterキー押下で進むことも可能です。
…
On which OS are you planning to use the agent? 1. linux 2. windows 3. darwin default choice: [1]:
Amazon Linux 2 インスタンスのため、1を選択
…
Are you using EC2 or On-Premises hosts? 1. EC2 2. On-Premises default choice: [1]:
EC2のため、1を選択
…
Which user are you planning to run the agent? 1. root 2. cwagent 3. others default choice: [1]:
今回はrootユーザーで実行させるため、1を選択
…
Do you want to turn on StatsD daemon? 1. yes 2. no default choice: [1]:
今回はCloudWatchログ用途のため、StatsDは使用しません。
2を選択
…
Do you want to monitor metrics from CollectD? WARNING: CollectD must be installed or the Agent will fail to start 1. yes 2. no default choice: [1]:
上記同様、CloudWatchログ転送用途のため、CollectDも使用しません。
2を選択
…
Do you want to monitor any host metrics? e.g. CPU, memory, etc. 1. yes 2. no default choice: [1]:
CPU, メモリなどのメトリクスも収集しません。
2を選択
…
Do you have any existing CloudWatch Log Agent (http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html) configuration file to import for migration? 1. yes 2. no default choice: [2]:
今回は移行ではありません。
2を選択
…
Do you want to monitor any log files? 1. yes 2. no default choice: [1]:
ログファイルを監視するので、1を選択
…
Log file path:
収集したいApacheアクセスログのファイルパスを指定します。
今回は /var/log/httpd/access_log
と入力
…
Log group name: default choice: [access_log]
CloudWatchログの group name を指定します。
default choice で提示された access_log
とします
…
Log stream name: default choice: [{instance_id}]
CloudWatchログの stream name を指定します。
default choice で提示された instance_id
とします
…
Log Group Retention in days 1. -1 2. 1 3. 3 4. 5 5. 7 6. 14 7. 30 8. 60 9. 90 10. 120 11. 150 12. 180 13. 365 14. 400 15. 545 16. 731 17. 1827 18. 3653 default choice: [1]:
収集されたログの保持日数を指定します。
今回は-1(無期限保持)の 1を選択
…
Do you want to specify any additional log files to monitor? 1. yes 2. no default choice: [1]:
上記のLog file path 設定以外に他に収集したいログがあるかどうか回答します。
今回は error_log も収集するため、1を選択
…
Log file path: /var/log/httpd/error_log Log group name: default choice: [error_log] Log stream name: default choice: [{instance_id}] Log Group Retention in days 1. -1 2. 1 3. 3 4. 5 5. 7 6. 14 7. 30 8. 60 9. 90 10. 120 11. 150 12. 180 13. 365 14. 400 15. 545 16. 731 17. 1827 18. 3653 default choice: [1]: 1
access_log 同様に回答しました。
…
Do you want to specify any additional log files to monitor? 1. yes 2. no default choice: [1]:
他に収集したいログはないので、2を選択
…
Saved config file to /opt/aws/amazon-cloudwatch-agent/bin/config.json successfully.
設定ファイルが /opt/aws/amazon-cloudwatch-agent/bin/config.json へ保存されたようです。
Current config as follows: { "agent": { "run_as_user": "root" }, "logs": { "logs_collected": { "files": { "collect_list": [ { "file_path": "/var/log/httpd/access_log", "log_group_name": "access_log", "log_stream_name": "{instance_id}", "retention_in_days": -1 }, { "file_path": "/var/log/httpd/error_log", "log_group_name": "error_log", "log_stream_name": "{instance_id}", "retention_in_days": -1 } ] } } } }
設定ファイルの中身が出力されました。
Please check the above content of the config. The config file is also located at /opt/aws/amazon-cloudwatch-agent/bin/config.json. Edit it manually if needed.
カスタマイズしたい場合は設定ファイルを手動で更新するようです。
Do you want to store the config in the SSM parameter store? 1. yes 2. no default choice: [1]:
設定ファイルをSSMパラメータストアへ保存するかどうかを選択します。
今回は保存しないので、2を選択
以上、でウィザード設定が終了しました。
設定ファイル確認
$ cat /opt/aws/amazon-cloudwatch-agent/bin/config.json { "agent": { "run_as_user": "root" }, "logs": { "logs_collected": { "files": { "collect_list": [ { "file_path": "/var/log/httpd/access_log", "log_group_name": "access_log", "log_stream_name": "{instance_id}", "retention_in_days": -1 }, { "file_path": "/var/log/httpd/error_log", "log_group_name": "error_log", "log_stream_name": "{instance_id}", "retention_in_days": -1 } ] } } } }
ウィザード設定中にも出力されていましたが、設定ファイルは上記のとおりです。
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
ポイントは -c file:
で、ウィザードを使用して設定されたファイルパスを指定している部分です。
ちなみに、この起動起動コマンドではなく以下の様に systemctl コマンドをいきなり実行してしまうと、エラーとなってログが収集されませんでした。
※エラーとなってしまう起動方法
$ sudo systemctl start amazon-cloudwatch-agent
※エラーログ /opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log
2022/03/31 02:59:02 I! I! Detected the instance is EC2 2022/03/31 02:59:02 Reading json config file path: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json ... /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json does not exist or cannot read. Skipping it. No json config files found, please provide config, exit now
どうやら systemctl で起動した場合は、別の設定ファイルパス /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json の設定を読み込もうとしてしまうようです。
手動で設定する場合は、このファイルパスへ config.jsonの内容を保存するのが良さそうです。
確認
$ sudo systemctl status amazon-cloudwatch-agent
戻り値
$ sudo systemctl status amazon-cloudwatch-agent ● amazon-cloudwatch-agent.service - Amazon CloudWatch Agent Loaded: loaded (/etc/systemd/system/amazon-cloudwatch-agent.service; enabled; vendor preset: disabled) Active: active (running) since 木 2022-03-31 10:11:21 UTC; 14s ago Main PID: 4049 (amazon-cloudwat) CGroup: /system.slice/amazon-cloudwatch-agent.service └─4049 /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent -config /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml -envconfig /opt/aws/amazon-cloudwa... 3月 31 10:11:21 ip-10-0-2-214.ap-northeast-1.compute.internal systemd[1]: Started Amazon CloudWatch Agent. 3月 31 10:11:21 ip-10-0-2-214.ap-northeast-1.compute.internal start-amazon-cloudwatch-agent[4049]: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json does not exist...ng it. 3月 31 10:11:21 ip-10-0-2-214.ap-northeast-1.compute.internal start-amazon-cloudwatch-agent[4049]: Valid Json input schema. 3月 31 10:11:21 ip-10-0-2-214.ap-northeast-1.compute.internal start-amazon-cloudwatch-agent[4049]: I! Detecting run_as_user... Hint: Some lines were ellipsized, use -l to show in full.
CloudWatchエージェント 自動起動 有効化
OS再起動でも起動するように設定しておきましょう。
自動起動 有効化
$ sudo systemctl enable amazon-cloudwatch-agent.service
確認
$ systemctl is-enabled amazon-cloudwatch-agent.service
戻り値
enabled
enabled となっていることを確認
動作確認
EC2のApacheログ 確認 access_log
$ sudo cat /var/log/httpd/access_log 127.0.0.1 - - [31/Mar/2022:08:44:22 +0000] "GET / HTTP/1.1" 200 5 "-" "curl/7.79.1" "-" 127.0.0.1 - - [31/Mar/2022:09:01:58 +0000] "GET / HTTP/1.1" 200 5 "-" "curl/7.79.1" "-" 127.0.0.1 - - [31/Mar/2022:09:02:03 +0000] "GET / HTTP/1.1" 200 5 "-" "curl/7.79.1" "-" 127.0.0.1 - - [31/Mar/2022:09:02:04 +0000] "GET / HTTP/1.1" 200 5 "-" "curl/7.79.1" "-"
CloudWatch Logs 確認
CloudWatch -> ロググループ -> access_log ログストリーム -> [インスタンスID] ログイベント
EC2で確認したaccess_logが収集できていることを確認できました。
EC2のApacheログ 確認 error_log
$ sudo cat /var/log/httpd/error_log [Thu Mar 31 03:08:02.155596 2022] [lbmethod_heartbeat:notice] [pid 1995] AH02282: No slotmem from mod_heartmonitor [Thu Mar 31 03:08:02.155665 2022] [http2:warn] [pid 1995] AH10034: The mpm module (prefork.c) is not supported by mod_http2. The mpm determines how things are processed in your server. HTTP/2 has more demands in this regard and the currently selected mpm will just not do. This is an advisory warning. Your server will continue to work, but the HTTP/2 protocol will be inactive. [Thu Mar 31 03:08:02.160958 2022] [mpm_prefork:notice] [pid 1995] AH00163: Apache/2.4.52 () configured -- resuming normal operations [Thu Mar 31 03:08:02.160980 2022] [core:notice] [pid 1995] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND' [Thu Mar 31 09:03:54.780350 2022] [mpm_prefork:notice] [pid 1995] AH00170: caught SIGWINCH, shutting down gracefully [Thu Mar 31 09:05:00.505130 2022] [suexec:notice] [pid 1994] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec) [Thu Mar 31 09:05:00.530444 2022] [lbmethod_heartbeat:notice] [pid 1994] AH02282: No slotmem from mod_heartmonitor [Thu Mar 31 09:05:00.530501 2022] [http2:warn] [pid 1994] AH10034: The mpm module (prefork.c) is not supported by mod_http2. The mpm determines how things are processed in your server. HTTP/2 has more demands in this regard and the currently selected mpm will just not do. This is an advisory warning. Your server will continue to work, but the HTTP/2 protocol will be inactive. [Thu Mar 31 09:05:00.533952 2022] [mpm_prefork:notice] [pid 1994] AH00163: Apache/2.4.52 () configured -- resuming normal operations [Thu Mar 31 09:05:00.533983 2022] [core:notice] [pid 1994] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND'
CloudWatch Logs 確認
ログイベント
error_logも問題ないようです。
最後に
今回はウィザードを使用して設定する方法をご紹介しました。
CloudWatchエージェントを触ったことのない方はこちらの方法で設定するのが良さそうですが、
複数台のサーバーへまとめて設定する場合は、手動で設定するほうが良さそうです。
では。