【AWS】EC2にCloudWatch Agentをインストールし、ログやメトリクスを監視します（Linux編）

#はじめに
本編はLinux EC2シリーズにおけるCloudwatch Agentインストール仕方の続編です。
なお、windows編は下記の記事にご参考いただければと思います。

https://qiita.com/hyj624117615/items/2f2719fd34656e0df79e

今回の諸情報を下記に載せます。
・OS： Amazon Linux 2
・サブネット：パブリックサブネット
・CloudWatch Agentで採取するログ：
``/var/log/messages``ログ、``/var/log/secure``ログ
・構成図：
![CloudWatch Agent.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/c76e751a-97bd-96de-7ed1-668945eda9ad.png)

#１．IAMロール設定
EC2用のIAMロールに、以下のロールを付与します。
・CloudWatchAgentAdminPolicy
・AmazonSSMManagedInstanceCore
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/1cf32e7c-e317-2e64-dfd4-1c88b0110edf.png)

※CloudWatch Agent用のIAMロールについては、AWS公式参考サイトを貼ります。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-iam-roles-for-cloudwatch-agent.html

#２．CloudWatch Agentをインストールする
※SSM Agentがインストールされているのが前提となります。
「AWS Systems Manager」→「Run Command」を押下します。
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/85eea726-2975-d2bb-e09e-cc2ff15a7148.png)

コマンドドキュメント欄に「AWS-ConfigureAWSPackage」を検索し、選択します。
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/50d210ec-91e5-6374-90ca-a24bb116b154.png)

コマンドのパラメータに、
・「Name」欄に「AmazonCloudWatchAgent」を入力します
・「Version」欄に「latest」を入力します
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/249fe12f-037f-94c9-9e2c-1a1737cfbdef.png)

ターゲットに、対象のEC2を選択します。
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/2022db14-bf28-14e5-51d6-d95c480ecc56.png)

「実行」を押下し、下記のように成功マークが表示されればOKです。
これでEC2に、CloudWatch Agentをインストール完了しました。
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/0165122c-b0ab-a8c6-0eb7-1f355f0e428f.png)

#３．EC2上にリポジトリをインストール
まずはEPELリポジトリをインストールしておきましょう。
OSに応じて、下記のURLからインストールコマンドが表示されております。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-enable-epel/

今回のサーバーは Amazon Linux 2 であるため、下記のコマンドを実行いたします。

```
sh-4.2$ sudo amazon-linux-extras install epel -y
```

次にcollectdをインストールしておきます。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-custom-metrics-collectd.html

```
sh-4.2$ sudo yum install -y collectd
```

#４．CloudWatch Agent を定義
下記のコマンドでCloudWatch Agentの定義を始めることができます。

```
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
```

それでは定義しておきます。

```
sh-4.2$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
=============================================================
= Welcome to the AWS CloudWatch Agent Configuration Manager =
=============================================================
On which OS are you planning to use the agent?
1. linux
2. windows
3. darwin
default choice: [1]:
1
Trying to fetch the default region based on ec2 metadata...
Are you using EC2 or On-Premises hosts?
1. EC2
2. On-Premises
default choice: [1]:
1
Which user are you planning to run the agent?
1. root
2. cwagent
3. others
default choice: [1]:
1
Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:
1
Which port do you want StatsD daemon to listen to?
default choice: [8125]
8125
What is the collect interval for StatsD daemon?
1. 10s
2. 30s
3. 60s
default choice: [1]:
1
What is the aggregation interval for metrics collected by StatsD daemon?
1. Do not aggregate
2. 10s
3. 30s
4. 60s
default choice: [4]:
4
Do you want to monitor metrics from CollectD?
1. yes
2. no
default choice: [1]:
1
Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:
1
Do you want to monitor cpu metrics per core? Additional CloudWatch charges may apply.
1. yes
2. no
default choice: [1]:
1
Do you want to add ec2 dimensions (ImageId, InstanceId, InstanceType, AutoScalingGroupName) into all of your metrics if the info is available?
1. yes
2. no
default choice: [1]:
1
Would you like to collect your metrics at high resolution (sub-minute resolution)? This enables sub-minute resolution for all metrics, but you can customizefor specific metrics in the output json file.
1. 1s
2. 10s
3. 30s
4. 60s
default choice: [4]:
4
Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:
1
Current config as follows:
{
        "agent": {
                "metrics_collection_interval": 60,
                "run_as_user": "root"
        },
        "metrics": {
                "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"
                        }
                }
        }
}
Are you satisfied with the above config? Note: it can be manually customized after the wizard completes to add additional items.
1. yes
2. no
default choice: [1]:
1
Do you have any existing CloudWatch Log Agent (http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html) configuration file to import formigration?
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:
/var/log/messages
Log group name:
default choice: [messages]
EC2-messages
Log stream name:
default choice: [{instance_id}]
messages-{instance_id}
Do you want to specify any additional log files to monitor?
1. yes
2. no
default choice: [1]:
1
Log file path:
/var/log/secure
Log group name:
default choice: [secure]
EC2-secure
Log stream name:
default choice: [{instance_id}]
secure-{instance_id}
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.
Current config as follows:
{
        "agent": {
                "metrics_collection_interval": 60,
                "run_as_user": "root"
        },
        "logs": {
                "logs_collected": {
                        "files": {
                                "collect_list": [
                                        {
                                                "file_path": "/var/log/messages",
                                                "log_group_name": "EC2-messages",
                                                "log_stream_name": "messages-{instance_id}"
                                        },
                                        {
                                                "file_path": "/var/log/secure",
                                                "log_group_name": "EC2-secure",
                                                "log_stream_name": "secure-{instance_id}"
                                        }
                                ]
                        }
                }
        },
        "metrics": {
                "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"
                        }
                }
        }
}
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]:
1
What parameter store name do you want to use to store your config? (Use 'AmazonCloudWatch-' prefix if you use our managed AWS policy)
default choice: [AmazonCloudWatch-linux]
AmazonCloudWatch-Linux-EC2
Trying to fetch the default region based on ec2 metadata...
Which region do you want to store the config in the parameter store?
default choice: [us-east-1]
us-east-1
Which AWS credential should be used to send json config to parameter store?
1. XXXXXXXXXXXXXXXXXXXX(From SDK)
2. Other
default choice: [1]:
1
Successfully put config to parameter store AmazonCloudWatch-Linux-EC2.
Program exits now.
sh-4.2$
```

上記の Config ファイルを Systems Manager のパラメータストアで、「AmazonCloudWatch-Linux-EC2」として定義しましたので、パラメータストアで、「AmazonCloudWatch-Linux-EC2」が当パラメータが反映できたかどうかを確認します。
無事に反映できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/31b84df2-ba3f-eef0-4679-7ff9257be2b6.png)


#５．Systems Manager から CloudWatch Agentを起動
「AWS Systems Manager」→「Run Command」で、「AmazonCloudWatch-ManageAgent」検索し、選択します。
ドキュメントのバージョンは「５」を選択します。
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/3c2561cd-d375-8e30-eb94-29ba3ccd0df9.png)

「Optional Configuration Location」に、上記手順３で定義したパラメータ名を入れます。
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/f01dc9ed-cb3a-67ec-ce7b-844888b02d7f.png)

ターゲットに、対象のEC2を選択します。
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/2022db14-bf28-14e5-51d6-d95c480ecc56.png)

「実行」を押下し、下記のように成功マークが表示されればOKです。
それでCloudWatch Agentを有効化しました。
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/65e27067-a396-8c8a-2a1c-d9d5b1eb17b9.png)

#６．確認
CloudWatch Logsに、上記で定義したログファイルが転送されているかどうかを確認したところ、うまく反映できていることを観測できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/0244f98b-7db1-2126-10bf-b6f38f03c6b7.png)

ログの中身を確認しますと、定義されたカスタムログの内容はうまく反映できていることがわかりました。
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/d63556fe-c58b-998c-4e71-a191caf40d1d.png)

続いてメトリクスを確認したところ、メトリクスも反映できていることがわかりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/a6036480-7ebf-dfc9-8b81-cab7ed0aa53f.png)

これでCloudWatch Agentの導入＆確認が終了しました。