【Amazon CloudWatch Logs】ApacheのアクセスログをCloudWatch Logsへ収集する

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

今日も屋根裏からこんにちわ。 技術1課の折戸です。

春の訪れとともに屋根裏は気温がどんどん上昇しております。 そろそろエアコンを本格的に検討しなければ。

さて、今回はApachのアクセスログをAmazon CloudWatch Logs (以下、CloudWatch Logs)へ収集する方法をご紹介します。

Amazon CloudWatch Logs とは

docs.aws.amazon.com

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 f:id:swx-orito:20220331182044p:plain ログストリーム -> [インスタンスID] f:id:swx-orito:20220331182141p:plain ログイベント f:id:swx-orito:20220331182209p:plain

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 確認

ログイベント f:id:swx-orito:20220331182601p:plain

error_logも問題ないようです。

最後に

今回はウィザードを使用して設定する方法をご紹介しました。
CloudWatchエージェントを触ったことのない方はこちらの方法で設定するのが良さそうですが、 複数台のサーバーへまとめて設定する場合は、手動で設定するほうが良さそうです。

では。

折戸 亮太(執筆記事の一覧)

2021年10月1日入社
クラウドインテグレーション部技術1課

屋根裏エンジニア