【AWS】EC2上のApacheのアクセスログをCloudWatchLogsに転送する

こんにちは、最近の週末はずっと開発をしているものです

 

今回はタイトルの通り EC2上のApacheのアクセスログをCloudWatchLogsに転送してみたいと思います

 

■環境

OS:AlmaLinux9

ミドルウェア:Apache 2.4

 

■流れ

1. Apacheの初期設定

2. CloudWatchLogsグループの作成

3. IAMロールの作成と付与

4. EC2にcloudwatch-agentのインストール

5. cloudwatch-agentでログ出力の設定

6. コンソール上で出力されることを確認

 

■手順

※パブリックからアクセス可能なEC2の作成やApacheのインストールは実施済みの想定です

 

1. Apacheの初期設定

まずは下記のようにApache側でドメイン名でアクセスログが出力されるように設定します

<VirtualHost *:80>
  ServerName test.com
  DocumentRoot /var/www/vhosts/test.com/public_html
  <IfModule dir_module>
    DirectoryIndex index.html
  </IfModule>
CustomLog      /var/log/httpd/test.com.access.log combined
ErrorLog       /var/log/httpd/test.com.error.log
</VirtualHost>

 

何度かアクセスしてみて、下記のようになっていればOKです

[root@ip-10-0-10-67 httpd]# ls -la /var/log/httpd/
total 12
drwx------.  2 root root   94 Jan 31 08:13 .
drwxr-xr-x. 10 root root 4096 Jan 31 08:08 ..
-rw-r--r--.  1 root root    0 Jan 31 08:13 access_log
-rw-r--r--.  1 root root  684 Jan 31 08:13 error_log
-rw-r--r--.  1 root root 2260 Jan 31 08:16 test.com.access.log
-rw-r--r--.  1 root root    0 Jan 31 08:13 test.com.error.log

 

2. CloudWatchLogsグループの作成

Apacheログを集計するロググループを作成します

 

CloudWatch > ログ管理 > ロググループの作成 し、下記内容で作成する

ロググループ名:test.com

保持期間の設定:失効しない

ログクラス:スタンダード

KMS キー ARN – オプション:記載なし

 

3. IAMロールの作成と付与

EC2からCloudWatchLogsへの操作を許可するIAMロールを作成します

 

・作成

IAM > ロール > ロールの作成 を押下し、下記内容で作成する

信頼されたエンティティタイプ:AWSのサービス

ユースケース:EC2

許可ポリシー:CloudWatchLogsFullAccess, CloudWatchAgentServerPolicy

ロール名:ec2-to-cloudwatchlogs-policy

 

※ 許可ポリシーにて CloudWatchAgentServerPolicy を指定しないと、cloudwatch-agentからEC2インスタンスの一覧を取得することができずにエラーになります

 

・付与

EC2 > インスタンス >  アクション > セキュリティ > IAMロールを変更を押下し、 先ほど作成した ec2-to-cloudwatchlogs-policy ロールを選択する

 

4. EC2にcloudwatch-agentのインストール

5. cloudwatch-agentでログ出力の設定

インストール手順とセットアップは下記記事で実施したものを利用

【AWS】AlmaLinux9にCloudWatch エージェントを導入してhttpdプロセスを監視してみる

 

※参考

・実行ユーザーについて

cwagentユーザーではログストリームが作成されないため、root ユーザーを選択しました

 

・Do you want to monitor any log files? の項目にて、今回のアクセスログファイルパスを指定しました

Do you want to monitor any log files?
1. yes
2. no
default choice: [1]:
1
Log file path:
/var/log/httpd/test.com.access.log

 

・最終的には下記のようなconfigになりました

{
        "agent": {
                "metrics_collection_interval": 60,
                "run_as_user": "root"
        },
        "logs": {
                "logs_collected": {
                        "files": {
                                "collect_list": [
                                        {
                                                "file_path": "/var/log/httpd/test.com.access.log",
                                                "log_group_class": "STANDARD",
                                                "log_group_name": "test.com",
                                                "log_stream_name": "{instance_id}",
                                                "retention_in_days": -1
                                        }
                                ]
                        }
                }
        },
        "metrics": {
                "aggregation_dimensions": [
                        [
                                "InstanceId"
                        ]
                ],
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {
                        "collectd": {
                                "metrics_aggregation_interval": 60
                        },
                        "disk": {
                                "measurement": [
                                        "used_percent"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "mem": {
                                "measurement": [
                                        "mem_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        },
                        "statsd": {
                                "metrics_aggregation_interval": 60,
                                "metrics_collection_interval": 10,
                                "service_address": ":8125"
                        }
                }
        }
}

→ log_stream_name が ${aws:InstanceId} のプレースホルダーとなっており、インスタンスIDが自動的に取得され、書き変わるようになっています

 

・起動時のプロセスは下記のようになっており、amazon-cloudwatch-agent.toml をconfigとして読み込んでいます

[root@ip-10-0-10-67 etc]# ps auxwwf | grep [c]loudwatch
cwagent     1445  0.2  3.1 1412152 122092 ?      Ssl  09:02   0:01 /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent -config /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml -envconfig /opt/aws/amazon-cloudwatch-agent/etc/env-config.json -otelconfig /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.yaml -pidfile /opt/aws/amazon-cloudwatch-agent/var/amazon-cloudwatch-agent.pid

 

・設定変更について

cloudwatch-agent ではconfigファイルとして、amazon-cloudwatch-agent.toml を読み込んでいますが、

実際は amazon-cloudwatch-agent.json ファイルが amazon-cloudwatch-agent.toml ファイルに変換されて CloudWathch Agent に読み込まれます

そのため、設定変更する際は、amazon-cloudwatch-agent.json を編集し、agentを再起動して変更を反映する必要があります

また、ログ上にてjsonからtomlへ変更したことが出力されるようになっております

Config has been translated into TOML /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml

 

6. コンソール上で出力されることを確認

それでは、何度かApacheへリクエストを送り、CLoudWatchLogs上にログが出力されるか確認してみます

CloudWatch > ログ管理 > test.com > インスタンスID のログストリーム内にApacheのアクセスログが出力されていればOKです

 

■まとめ

いかがでしたでしょうか?

ApacheのアクセスログファイルをCloudWatchLogsへ転送することで、様々なAWSサービスと連携した分析などに利用できるようなるのでかなりいいと思いました

また、設定反映のためのjsonからtomlへの変換などは実際に手を動かさないと分からないことなので、かなり勉強になりました

今後はさらに複雑なログ出力設定も試してみたいと思います

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA