Cloudwatch Agentによるカスタムメトリックの取得方法


##目的

 プライベートサブネットに存在するEC2インスタンスから、Cloudwatch Agent(以下、CW Agentとします。)経由でカスタムメトリックを取得する方法を解説します。


## 何が取れるのか？

[こちら](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-cloudwatch-agent-configuration-file-wizard.html#cloudwatch-agent-preset-metrics)を参照するとわかる通り、Cloudwatchで取得できるメトリックは３種類（Basic、Standard、Advanced）存在します。もっとも、多くのメトリックが取得できるのは***Advanced***です。Advancedで取得可能なメトリックの種類について、以下に載せます。

```shell-session:確認可能な闘鶏項目（Advancedの場合）
CPU: cpu_usage_guest、cpu_usage_idle、cpu_usage_iowait、 cpu_usage_steal、cpu_usage_user、cpu_usage_system
Disk: disk_used_percent、disk_inodes_free
Diskio: diskio_io_time、diskio_write_bytes、diskio_read_bytes、diskio_writes、diskio_reads
Mem: mem_used_percent
Net: net_bytes_sent、net_bytes_recv、net_packets_sent、net_packets_recv
Netstat: netstat_tcp_established、netstat_tcp_time_wait
Swap: swap_used_percent
```

## 手順

以下の手順でCW Agentを設定します。

1. IAMロールの作成（for EC2 Instance）
2. SSM Agentインストール
3. VPCエンドポイントの作成（for Private Subnet）
4. CW Agentのインストール（via SSM）
5. CW Agentの設定ファイル作成（using インストールウィザード）
6. CW Agebntの実行（via SSM）
7. CloudWatchからカスタムメトリックを取得


## 1. IAMロールの作成（for EC2 Instance）

- Cloudwatch Agentをインストールする前にIAMロールをEC2インスタンスに設定する必要あり。
- CW Agentが使用できるように、CloudWatchAgentServerPolicyか、loudWatchAgentAdminPolicy。
  - CloudWatchAgentAdminPolicyは、パラメータストアの書き込み許可を有しているもので通常は使用しない
  - 一般的な監視をする限りは***CloudWatchAgentServerPolicy***を利用するだけで十分。
- SSMで触れるように、***AmazonSSMManagedInstanceCore***
- IAMロールの設定方法は以下を参照する。
- https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-iam-roles-for-cloudwatch-agent.html




## 2. SSM Agentインストール

SSM Agentをインストールする事で、SSM経由で設定CWAgentをインストール&設定する事ができる（SSM使った方が運用効率がいい）。


```bash:SSMAgentのインストール
sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
```

```bash:SSMAgentのステータス確認
sudo status amazon-ssm-agent
```


## 3. VPCエンドポイントの作成（for Private Subnet）

- [こちら](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/cloudwatch-and-interface-VPC.html)を参照して、プライベートサブネット内のEC2インスタンス（CW Agent）からアクセスできるようにVPCエンドポイントを作成
- EC2インスタンスと同一のセキュリティグループ&サブネットに所属させるように設定させる

## 4. CW Agentのインストール（via SSM）

SSMのRun Command を使用して CloudWatch をダウンロードするには、[こちら](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-on-EC2-Instance-fleet.html)を参照して、設定します。

```bash:CloudWatchAgentのインストール方法
1. Open the Systems Manager console at https://console.aws.amazon.com/systems-manager/.
2. [Run command] を選択します。
3. [Command document] リストで、[AWS-ConfigureAWSPackage] を選択します。
4. [ターゲット] 領域で、CloudWatch エージェントをインストールするインスタンスを選択します。特定のインスタンスが表示されない場合、Run Command 用に設定されていない可能性があります。詳細については、AWS Systems Manager ユーザーガイドの「ハイブリッド環境での AWS Systems Manager セットアップ」を参照してください。
5. [アクション] リストで、[インストール] を選択します。
6. [名前] ボックスに、「AmazonCloudWatchAgent」と入力します。
7. エージェントの最新バージョンをインストールには、[Version (バージョン)] を [latest (最新)] に設定したままにします。
8. [Run] を選択します。
9. 必要に応じて、[ターゲットと出力] 領域で、インスタンス名の横のボタンを選択して [View output (出力の表示)] を選択します。Systems Manager に、エージェントが正常にインストールされたことが表示されます。
```

```bash:cloudwatch実行状態の確認
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status
```



## 5. CW Agentの設定ファイル作成（using インストールウィザード）

- インストールウィザード経由でCW Agentの設定ファイル（json）を作成
- Jsonファイルはパラメータストアとして配置する事で、のちにSSMから設定ファイルとして選択する事が可能。
- この設定ファイル内でBasic,Standard,Advancedを選択する（ログの粒度を決める）
- ***パラメータストアに書き込むためには、EC2インスタンスにAWS認証情報を設定する必要あり***


```bash:cloudwatchAgent設定ウィザードの実行
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
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]

What is the collect interval for StatsD daemon?
1. 10s
2. 30s
3. 60s
default choice: [1]:
3
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]:
2
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 customize for 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": {
                        "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": 60,
                                "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 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:
/var/log/messages
Log group name:
default choice: [messages]

Log stream name:
default choice: [{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": "messages",
                                                "log_stream_name": "{instance_id}"
                                        }
                                ]
                        }
                }
        },
        "metrics": {
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {
                        "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": 60,
                                "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]
TestAgent2
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: [ap-northeast-2]

Which AWS credential should be used to send json config to parameter store?
1. *****************(From SDK)
2. Other
default choice: [1]:
1
Successfully put config to parameter store TestAgent2.
Program exits now.
```

## 6. CW Agebntの実行（via SSM）

SSMのRun Command を使用して CloudWatch を開始するには、[こちら](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-on-EC2-Instance-fleet.html)を参照して、設定します。


```bash:CloudwatchをSSM経由で実行する方法
1. Open the Systems Manager console at https://console.aws.amazon.com/systems-manager/.
2. [Run command] を選択します。
3. [Command document] リストで、[AmazonCloudWatch-ManageAgent] を選択します。
4. [ターゲット] 領域で、CloudWatch エージェントをインストールしたインスタンスを選択します。
5. [Action] リストで、[configure] を選択します。
6. [Optional Configuration Source] リストで、[ssm] を選択します。「CloudWatch エージェント設定ファイルを作成する」で説明されているとおり、[Optional Configuration Location (オプションの設定場所)] ボックスに、作成して Systems Manager Parameter Store に保存したエージェント設定ファイルの名前を入力します。
7. これらのステップを完了した後、[Optional Restart] リストで、[yes] を選択してエージェントを開始します。
8. [Run] を選択します。
9. 必要に応じて、[ターゲットと出力] 領域で、インスタンス名の横のボタンを選択して [View output (出力の表示)] を選択します。Systems Manager に、エージェントが正常に開始されたことが表示されます。
```


```bash:cloudwatchAgentの起動確認
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status
{
  "status": "running",
  "starttime": "2020-05-03T06:35:02+0000",
  "version": "1.237768.0"
}
```


## 7. CloudWatchからカスタムメトリックを取得


Cloudwatch AgentからCloudWatchへのメトリック送信にはEC2インスタンスにIAMロール付与をお願いする必要がある。

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



## 8. CloudWatchからカスタムメトリックを取得

取得成功すると、設定ファイルのカスタムメトリクス上に表示されたら、無事取得できた事が確認できます。

<img width="1396" alt="スクリーンショット 2020-05-03 18.08.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/9b00e291-4342-be1b-c8cc-1c9aa0b54535.png">





以上