オンプレのサーバをCloudWatchで監視する

サーバくん達がお亡くなりになる前に対応ができるようにちゃんと監視をしましょう。
ということで、今回はCloudWatchでEC2以外のオンプレサーバをモニタリングしてみます。
社内にあるお遊びインスタンスからCloudWatch Agentを利用してデータをCloudWatchに流す設定をします。

ec2インスタンスであっても古い [aws-scripts-mon](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/mon-scripts.html) はもう使わないでとのことなので、Agentに移行しましょう。

各サーバにCloudWatch Agentをインストールすると、よしなにCloudWatchにメトリクスやログを流してくれます。
Datadog, Meckerel同様、管理される側からデータを流すpush系のモニタリングですね。
munin, MRTG,prometheusなどは逆で監視サーバから各サーバを巡回するのでpull型です。

# IAMで監視用のユーザーを作る

モニタリングする内容の設定ファイルをAWS Systems Manager(SSM)のパラメータストアで管理してくれます。
併せて、CloudWatchのメトリクスデータとCloudWatchLogsのログファイルも流してくれます。
それ用のユーザーを作っておきましょう。

awsさんが↑のポリシーを作ってくれているので、CloudWatchAgentServerPolicyをユーザーに当てます。

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

> お客様にこれらのポリシーを自分で作成するよう求める代わりに、Amazon によって作成された新しい [CloudWatchAgentServerPolicy] および [CloudWatchAgentAdminPolicy] ポリシーを使用して、最近以下の手順を変更しました。Parameter Store へのファイル書き込みおよびファイルのダウンロードについては、Amazon によって作成されたポリシーでは、「AmazonCloudWatch-」で始まる名前を持つファイルのみをサポートします。ファイル名が AmazonCloudWatch- で始まらない CloudWatch エージェント設定ファイルがある場合、これらのポリシーを使用してファイルを Parameter Store に書き込んだり、Parameter Store からダウンロードしたりできません。

とのことです。今回はcloud-watch-agentというユーザーを作ってポリシーを当てました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/9c940e05-846d-f9dc-dbf2-ae0e381059aa.png)

あとで使うのでアクセスキーも発行しておきましょう。

# Agent インストールする

こちらの手順通りにインストールしていきます。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-commandline-fleet.html

今回はCentosにインストールしているので、rpmをDLしてインストールしました。

```
[murata@localhost ~]$ wget https://s3.amazonaws.com/amazoncloudwatch-agent/centos/amd64/latest/amazon-cloudwatch-agent.rpm
--2019-04-12 17:08:49--  https://s3.amazonaws.com/amazoncloudwatch-agent/centos/amd64/latest/amazon-cloudwatch-agent.rpm
Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.216.130.197
Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.216.130.197|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 27752379 (26M) [application/octet-stream]
Saving to: ‘amazon-cloudwatch-agent.rpm’

100%[==================================================================================================================================================================================================================================================>] 27,752,379  10.8MB/s   in 2.4s   

2019-04-12 17:08:52 (10.8 MB/s) - ‘amazon-cloudwatch-agent.rpm’ saved [27752379/27752379]

[murata@localhost ~]$ 
[murata@localhost ~]$ sudo yum install ./amazon-cloudwatch-agent.rpm 
Loaded plugins: fastestmirror
Examining ./amazon-cloudwatch-agent.rpm: amazon-cloudwatch-agent-1.210825.0-1.x86_64
Marking ./amazon-cloudwatch-agent.rpm to be installed
Resolving Dependencies
--> Running transaction check
---> Package amazon-cloudwatch-agent.x86_64 0:1.210825.0-1 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

============================================================================================================================================================================================================================================================================================
 Package                                                                     Arch                                                       Version                                                          Repository                                                                    Size
============================================================================================================================================================================================================================================================================================
Installing:
 amazon-cloudwatch-agent                                                     x86_64                                                     1.210825.0-1                                                     /amazon-cloudwatch-agent                                                      64 M

Transaction Summary
============================================================================================================================================================================================================================================================================================
Install  1 Package

Total size: 64 M
Installed size: 64 M
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : amazon-cloudwatch-agent-1.210825.0-1.x86_64                                                                                                                                                                                                                              1/1 
  Verifying  : amazon-cloudwatch-agent-1.210825.0-1.x86_64                                                                                                                                                                                                                              1/1 

Installed:
  amazon-cloudwatch-agent.x86_64 0:1.210825.0-1                                                                                                                                                                                                                                             

Complete!

```

# モニタリング設定する

ウィザードを使って設定ファイルを作成します。(楽

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-cloudwatch-agent-configuration-file-wizard.html

```
[murata@localhost ~]$ 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]:

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: [2]:

Please make sure the credentials and region set correctly on your hosts.
Refer to http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html
Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:
2
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]:

Do you want to monitor cpu metrics per core? Additional CloudWatch charges may apply.
1. yes
2. no
default choice: [1]:
2
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]:

Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:

Current config as follows:
{
        "metrics": {
                "metrics_collected": {
                        "cpu": {
                                "measurement": [
                                        "cpu_usage_idle"
                                ],
                                "metrics_collection_interval": 60,
                                "totalcpu": true
                        },
                        "disk": {
                                "measurement": [
                                        "used_percent"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "diskio": {
                                "measurement": [
                                        "write_bytes",
                                        "read_bytes",
                                        "writes",
                                        "reads"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "mem": {
                                "measurement": [
                                        "mem_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        },
                        "net": {
                                "measurement": [
                                        "bytes_sent",
                                        "bytes_recv",
                                        "packets_sent",
                                        "packets_recv"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "swap": {
                                "measurement": [
                                        "swap_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        }
                }
        }
}
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]:
 
Log file path:
/var/log/message
Log group name:
default choice: [message]

Log stream name:
default choice: [{hostname}]
deroris-vm
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:
{
        "logs": {
                "logs_collected": {
                        "files": {
                                "collect_list": [
                                        {
                                                "file_path": "/var/log/message",
                                                "log_group_name": "message",
                                                "log_stream_name": "deroris-vm"
                                        }
                                ]
                        }
                }
        },
        "metrics": {
                "metrics_collected": {
                        "cpu": {
                                "measurement": [
                                        "cpu_usage_idle"
                                ],
                                "metrics_collection_interval": 60,
                                "totalcpu": true
                        },
                        "disk": {
                                "measurement": [
                                        "used_percent"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "diskio": {
                                "measurement": [
                                        "write_bytes",
                                        "read_bytes",
                                        "writes",
                                        "reads"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "mem": {
                                "measurement": [
                                        "mem_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        },
                        "net": {
                                "measurement": [
                                        "bytes_sent",
                                        "bytes_recv",
                                        "packets_sent",
                                        "packets_recv"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "swap": {
                                "measurement": [
                                        "swap_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        }
                }
        }
}
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]:

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-deroris-vm
Which region do you want to store the config in the parameter store?
default choice: [us-east-1]
us-west-2
Please provide credentials to upload the json config file to parameter store.
AWS Access Key:
上で作ったアクセスキーID
AWS Secret Key:
上で作ったシークレットアクセスキー
Successfully put config to parameter store AmazonCloudWatch-deroris-vm.
Program exits now.
```

ここで注意なのがこいつです。必ずAmazonCloudWatch-で始まる文字列にしてください。SSM Parameter Store のファイル名です。
IAMのポリシーで縛られているので違う名前をつけたい場合にはコピって使う感じですかね。

```
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-deroris-vm
```

今回は、最小限にしてあります。デフォルトで取れるマトリクスはawsのドキュメントを参考にしてください。普通はStandardでいいかな。
StatsDやCollectDはカスタムメトリクスを作るのに使います。snmpでスイッチ等から値を取得してCloudWatchに流すときに使おうかなと思ってます。

上で作ったモニタリングの設定ファイルがSystem Manager のパラメータストアに上がっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/164eccd0-e849-3561-787d-819bd3de1256.png)


# /root/.aws/credentials ファイルなどを作成

`$aws configure`コマンドで作ってもよいです。aws-cliを入れていない場合は下記のようにファイルを作ります。

```:/root/.aws/credentials
[AmazonCloudWatchAgent]
aws_access_key_id = 上で作ったアクセスキーID
aws_secret_access_key = 上で作ったシークレットアクセスキー
```

```:/root/.aws/config 
[AmazonCloudWatchAgent]
region = us-west-2
```

今回はオレゴンにしていますが、使うリージョンを設定してね。
AmazonCloudWatchAgent以外のプロファイルを使いたければ`/opt/aws/amazon-cloudwatch-agent/etc/common-config.toml`を編集してください。


# CloudWatch エージェントを開始


デーモンを起動します。systemdに登録されているので再起動などは `# systemctl restart amazon-cloudwatch-agent` などしてください。

```
[murata@localhost amazon-cloudwatch-agent]$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m onPremise -c ssm:AmazonCloudWatch-deroris-vm -s 
/opt/aws/amazon-cloudwatch-agent/bin/config-downloader --output-dir /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d --download-source ssm:AmazonCloudWatch-deroris-vm --mode onPrem --config /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml --multi-config default
Got Home directory: /root
I! Set home dir Linux: /root
I! SDKRegionWithCredsMap region: us-west-2Region: us-west-2
credsConfig: map[]
Successfully fetched the config and saved in /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/ssm_AmazonCloudWatch-deroris-vm.tmp
Start configuration validation...
/opt/aws/amazon-cloudwatch-agent/bin/config-translator --input /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json --input-dir /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d --output /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml --mode onPrem --config /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml --multi-config default
Valid Json input schema.
Got Home directory: /root
Got Home directory: /root
I! Set home dir Linux: /root
I! SDKRegionWithCredsMap region: us-west-22019/04/12 18:36:59 E! ec2metadata is not available
2019/04/12 18:37:02 E! ec2metadata is not available
No csm configuration found.
Under path : /logs/ | Info : Got hostname localhost.localdomain as log_stream_name
Configuration validation first phase succeeded
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent -schematest -config /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml
Configuration validation second phase succeeded
Configuration validation succeeded
Created symlink from /etc/systemd/system/multi-user.target.wants/amazon-cloudwatch-agent.service to /etc/systemd/system/amazon-cloudwatch-agent.service.
Redirecting to /bin/systemctl restart amazon-cloudwatch-agent.service
```

# みてみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/6a8294a2-61eb-b489-3f21-5f4a78038d62.png)


ちゃんとでていますね。ホスト名を変更したければ`/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json`を変更してagentを再起動してください。

詳しくは https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html


# まとめ

モニタリング方法の移行や新規でシステムを作る際には候補の1つとして考えてよいと思う。

## snmpマン(ネットワーク機器)

StatsDやcollectdを利用できるようなので、スイッチやルーターはsnmp->collectd->CloudWatchAgentという経路でモニタリングすることができそう。(試してない)

## メトリクスの保存期間はこんな感じ。

数年前までは2週間ぐらいしか保存できなかったのでイマイチでしたが、今は1年以上保存されるのでよいのではないかな。

- 期間が 60 秒 (1 分) のデータポイントは、15 日間使用できます。
- 期間が 300 秒 (5 分) のデータポイントは、63 日間使用できます。 
- 期間が 3600 秒 (1 時間) のデータポイントは、455 日 (15 か月) 間使用できます。

## view

CloudWatchのダッシュボードがちょっとイケてなかったりするので必要な人は[Grafana](https://grafana.com/)のご利用をオススメします。
Grafanaはあくまでも見た目の問題なのでとりあえずCloudWatchを利用してみる感じで良いと思います。

## データに操られるな

グラフがいっぱいできていろんなものが監視できるようになりますが、普段みるダッシュボードは最低限必要なものだけを表示しましょう。
最初はいろんなグラフを出して「わーい」ってなりますが結局見なくなったり事案を見逃したりします。常時見るダッシュボードはパッとみてわかるぐらいのものにしておきましょう。
もちろんソレとは別にサービス毎とかdbやネットワーク関連を集めたダッシュボードは作っておいて損はないです。

また、有事の際にはサーバに入ることになります。グラフのデータだけで判断しないようにしましょう。

## 過去データは重要

すでに何らかしらの方法で監視をしていて、移行を考えている場合にはしばらくは過去データを移行するか並行運用が必要です。
過去データがない場合、比べる対象がないので上がっているのか下がっているのか、先月はどうだったのか、去年のどうだったのかが必要になります。

データの移行を行ってもどうしてもズレが発生するので1年は並行運用を行ってから完全移行をすることをオススメします。