AWSでWordPressサイトを構築 第6回〜CloudWatchAgent〜

こんにちは。かっぺいです。
AWSでWordPressサイト構築、今回はClodudWatchAgentを使ったログおよびカスタムメトリクスのCloudWatch送信の設定を行います。
簡単に言えば、いちいちサーバにログインしなくてもアクセスログなどをCloudWatchで見れるようにしようということを行います。

CloudWatchAgentとは

EC2としてCPU利用率はインスタンス情報として取得することができますが、メモリやディスクの利用率はOSの情報のため、そのままではCloudWatchで見ることができません。

Agentをインストールすることにより、OS情報を見ることができるようになります。

また、syslogやhttpdのaccessログなどもCloudWatchに転送することができ、CloudWatch側で長期保存することにより、EC2側のEBSの圧迫を軽減することも可能です。

agentパッケージのインストール

yumでamazon-cloudwatch-agentをインストールします

# sudo yum install amazon-cloudwatch-agent

IAMロール設定

CloudWatchへアップロードする権限が必要です。EC2にアタッチしているロールに、CloudWatchAgentServerPolicyを追加します

agent起動

# sudo amazon-cloudwatch-agent-ctl -a start

初回起動なので、デフォルトのコンフィグ設定とサービス起動設定が作成されます

agent設定

/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.dに設定ファイルを置きます
初回起動で、defaultが出来上がっているので、編集します

{
        "agent": {
                "run_as_user": "root"
        },
        "metrics": {
                "metrics_collected": {
                        "mem": {
                                "measurement": [
                                        "mem_used_percent"
                                ]
                        },
                        "disk": {
                                "measurement": [
                                        "used_percent"
                                ],
                                "resources": [
                                        "*"
                                ]
                        }
                },
                "append_dimensions": {
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}",
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}"
                }
        }
}

/var/log/のファイルを参照したいため、run_as_userをrootに変更します。
このデフォルト設定では、メモリ利用率とディスク利用率をカスタムメトリクスとしてCloudWatchに送信します。

agent設定(syslog送信)

vi /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/syslog.json

{
	"agent": {
		"metrics_collection_interval": 60
	},
	"logs": {
		"logs_collected": {
			"files": {
				"collect_list": [
					{
						"file_path": "/var/log/messages",
						"log_group_name": "messages",
						"log_stream_name": "{local_hostname}"
					},
					{
						"file_path": "/var/log/secure",
						"log_group_name": "secure",
						"log_stream_name": "{local_hostname}"
					}
				]
			}
		}
	}
}

/var/log/messagesと/var/log/secureをロググループ名messages,secureでローカルホスト名をストリームネームとして60秒サイクルでチェックして送信する設定です。

CloudWatchのログ▶︎ロググループに、設定したロググループ名が表示され、その中にストリーム毎に表示されます。

agent設定(httpdログ送信)

vi /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/httpd.json

{
	"logs": {
		"logs_collected": {
			"files": {
				"collect_list": [
					{
						"file_path": "/var/log/httpd/access_log",
						"log_group_name": "http_access_log",
						"log_stream_name": "{local_hostname}"
					},
					{
						"file_path": "/var/log/httpd/error_log",
						"log_group_name": "http_error_log",
						"log_stream_name": "{local_hostname}"
					}
				]
			}
		}
	}
}

一つのJSONファイルにまとめてしまっても構いません。
小分けにしておけば、サーバー構成に応じてファイルの追加で対応できるので便利です。

サービスの再起動

設定が終了したら、agentを再起動しましょう。

# systemctl restart amazon-cloudwatch-agent.service

CloudWatchで確認

CloudWatchを見て、ロググループが追加されていることを確認しましょう

ちなみに、ロググループの保持を「失効しない」にしておくと、ログが保存され続けて、CloudWatchの料金が上がっていくので、適度な期間に変更しましょう。

カスタムメトリクスは、メトリクスのすべてのメトリクスから、CWAgentの項目で参照できます。