Cloud Watch Agent を使用したハンズオン

###アジェンダ
***
1. [ハンズオンの準備](https://qiita.com/SHONANnoHBK/private/70e3879a0ce6fffe6d2c#%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3%E3%81%AE%E6%BA%96%E5%82%99)
2. [ハンズオンのシナリオ](https://qiita.com/SHONANnoHBK/private/70e3879a0ce6fffe6d2c#%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3%E3%81%AE%E3%82%B7%E3%83%8A%E3%83%AA%E3%82%AA)
3. [ハンズオンで構築する構成図](https://qiita.com/SHONANnoHBK/private/70e3879a0ce6fffe6d2c#%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3%E3%81%A7%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B%E6%A7%8B%E6%88%90%E5%9B%B3)
4. [ハンズオン](https://qiita.com/SHONANnoHBK/private/70e3879a0ce6fffe6d2c#%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3)
5. [結果確認](https://qiita.com/SHONANnoHBK/private/70e3879a0ce6fffe6d2c#%E7%B5%90%E6%9E%9C%E7%A2%BA%E8%AA%8D)
6. [オプション](https://qiita.com/SHONANnoHBK/private/70e3879a0ce6fffe6d2c#%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3)
7. [お片づけ](https://qiita.com/SHONANnoHBK/private/70e3879a0ce6fffe6d2c#%E3%81%8A%E7%89%87%E3%81%A5%E3%81%91)

###ハンズオンの準備
***
![image.png](https://qiita-image-store.s3.amazonaws.com/0/236355/7a51f53c-8f59-de54-ed56-5630c71bf4e6.png)

※動かすことを主に置いているため、IAMは「Administrator」を付けています
　権限を最低限に絞りたい場合は以下をご参考に設定して下さい
　IAMユーザーに付与する権限 ： AmazonEC2ReadOnlyAccess + AmazonSSMFullAccess
　EC2に付与する権限　　　 　 ： [AWS公式ドキュメント参照](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-iam-roles-for-cloudwatch-agent.html)


###ハンズオンのシナリオ
***
CloudWatch Agentを使ってデフォルトのCloudWatchでは取得出来ないEC2のメトリクスログを収集する

###ハンズオンで構築する構成図
***
![image.png](https://qiita-image-store.s3.amazonaws.com/0/236355/be52118e-f5a7-6e64-2968-c166051f8e1e.png)


###ハンズオン
***

####SSMエージェントのアップデート
***
CloudWatch AgentはSSMのRun Command or Amazon S3ダウンロードリンクからインストール可能です。
今回はSSMのRun Commandを使ってインストールしていきます。

CloudWatch AgentをインストールするためにはSSMエージェントのバージョンは2.2.93.0以上が必要です。
そのため、最初にSSMのコマンド実行を使ってSSMのアップデートを行います。

1. SSMサービスページの左下にある `Run Commnad` を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/236355/d41c178f-0ccd-36bd-e7ef-2e00081197e8.png)
　　
2. 「コマンドのドキュメント」で `AWS-UpdateSSMAgent` を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/236355/fbd8ab0f-c594-20f9-552e-27d575c3fcdb.png)

3. 「ターゲットの選択」で `インスタンスの手動選択` にチェックを入れ
　アップデートを行うEC2を選択し `実行` ボタンをクリック　　
![image.png](https://qiita-image-store.s3.amazonaws.com/0/236355/8d8f9cee-fd64-5e65-036b-129e2b5b848e.png)

　実行コマンドの出力画面で以下が出力されていれば成功
　`amazon-ssm-agent updated successfully to *.**.*`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/236355/04af59ac-132b-fcb2-9abe-da59ec5dd082.png)

####CloudWatch Agentのインストール
***
CloudWatch AgentをEC2にインストールするのはSSMエージェントのアップデートと同様、
SSMのRun Commandを使って行っていきます。

1.SSMサービスページの左下にある `Run Command` を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/236355/c30b13ac-cab3-6aad-05f6-a86727a6f906.png)

2.「コマンドのドキュメント」で`AWS-ConfigureAWSPackage`を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/236355/a159ad87-2ffd-3d0c-77f6-739961d2a019.png)

3.「ターゲットの選択」で `インスタンスの手動選択` にチェックを入れ  
  　インストールを行うEC2を選択し `実行` ボタンをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/236355/17140dd7-9887-4014-558d-a9ab410bdc16.png)

4.「Action」で `Install` を選択<br>
　「Name」で `AmazonCloudWatchAgent`と入力<br>
　「Version」で `latest`と入力<br>
　 最後に `実行`ボタンをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/236355/3f7f086a-30c7-dcd1-2d0d-d69f3b7b242c.png)

実行コマンドの出力画面で以下が出力されていれば成功
`Successfully installed arn:aws:ssm:::package/AmazonCloudWatchAgent *.**.*`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/236355/7a804981-8bba-5af7-ee09-113e018d305e.png)

####設定ファイルの作成
***
CloudWatch Agentを入れたEC2に入り、ウィザードを使用して設定ファイルを作成します。

1. 監視メトリクスの設定<br>
設定ファイルを作成していきます

```
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
=============================================================
= Welcome to the AWS CloudWatch Agent Configuration Manager =
=============================================================
```

　 OSを選択します
　 今回はAmazon LinuxでEC2を構築しましたので、 `1` 
　 もしくはdefaultがLinuxなので `Enter` を押します

```
On which OS are you planning to use the agent?
1. linux
2. windows
default choice: [1]:
```

　 CloudWatch Agentはオンプレでも使用出来るため
　 CloudWatch Agentが入っているサーバがEC2かオンプレか聞かれます
　 そのため、EC2の `1` or defaultがEC2なので `Enter` を押します

```bash:
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]:
```

　 ホストメトリクスを取得したいか聞かれますので
　 `yes` or デフォルトがyesなので `Enter` を押します

```bash:
Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:
```

　 コア当りのCPUを監視したいか聞かれますので
　 `yes` or デフォルトがyesなので `Enter` を押します

```bash:
Do you want to monitor cpu metrics per core? Additional CloudWatch charges may apply.
1. yes
2. no
default choice: [1]:
```

　 利用可能なディメンションを追加したいか聞かれますので
　 `yes` or デフォルトがyesなので `Enter` を押します

```bash:
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]:
```

 　何秒単位でメトリクスを収集したいか聞かれますので
　 `4` or デフォルトが4なので `Enter` を押します

```bash:
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]:
```

　 CloudWatch Agentに事前定義されたどのメトリクスセットを利用するか聞かれますので
　 今回は`3`を入力します

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

※メトリクスセットの詳細は以下

| 詳細レベル |　　　　　　　　　　　　　含められるメトリクス | 
|:-:|---|
| 基本 |Mem: mem_used_percent<br>Swap: swap_used_percent |
| スタンダート |CPU: cpu_usage_idle、cpu_usage_iowait、cpu_usage_user、cpu_usage_system<br>Disk: disk_used_percent、disk_inodes_free、diskio_io_time<br>Mem: mem_used_percent<br>Swap: swap_used_percent |
| アドバンス| CPU: cpu_usage_idle、cpu_usage_iowait、cpu_usage_user、cpu_usage_system<br>Disk: disk_used_percent、disk_inodes_free<br>Diskio: diskio_io_time、diskio_write_bytes、diskio_read_bytes、diskio_writes、diskio_reads<br>Mem: mem_used_percent<br>Netstat: netstat_tcp_established、netstat_tcp_time_wait<br>Swap: swap_used_percent |


　 設定内容が表示されますので、内容を確認して問題がなければ `Enter` をクリック

```bash:
Current config as follows:
{
        "metrics": {
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {
                        "cpu": {
                                "measurement": [
                                        "cpu_usage_idle",
                                        "cpu_usage_iowait",
                                        "cpu_usage_user",
                                        "cpu_usage_system"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ],
                                "totalcpu": false
                        },
                        "disk": {
                                "measurement": [
                                        "used_percent",
                                        "inodes_free"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "diskio": {
                                "measurement": [
                                        "io_time",
                                        "write_bytes",
                                        "read_bytes",
                                        "writes",
                                        "reads"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "mem": {
                                "measurement": [
                                        "mem_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        },
                        "netstat": {
                                "measurement": [
                                        "tcp_established",
                                        "tcp_time_wait"
                                ],
                                "metrics_collection_interval": 60
                        },
                        "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]:
```
<br>2. ログの設定  
　 今回は新規設定のため、Log Agentはいないので
　 `2` or デフォルト2なので `Enter` を押します

```bash:
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]:
```

　 ログファイルの監視を行うか聞かれますので
　 `1` or デフォルト1なので `Enter` を押します

```bash:
Do you want to monitor any log files?
1. yes
2. no
default choice: [1]:
```

　 監視するログファイルのパスを聞かれますので
　 今回は`/var/log/messages`を入力します

```bash:
Log file path:
```

　 ロググループ名を聞かれますので
　 `messages` or デフォルトmessagesなので `Enter` を押します

```baash:
Log group name:
default choice: [messages]
```

　 他にも管理するログファイルがあるかと聞かれますので
　 今回は`2`を押します

```bash:
Do you want to specify any additional log files to monitor?
1. yes
2. no
default choice: [1]:
```

　 設定内容が表示され、SSMのParameter Storeに保存するか聞かれますので
　 問題なければ、 `yes` orデフォルトがyesなので `Enter` を押して下さい

```bash:
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/messages",
                                                "log_group_name": "messages"
                                        }
                                ]
                        }
                }
        },
        "metrics": {
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {
                        "mem": {
                                "measurement": [
                                        "mem_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        },
                        "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]:
```

　 Parameter storeでの名称設定を求められますので、
　 今回は `agent-config-linux-jaws` と入力して下さい
 　
 　※同じアカウント内のユーザを使って本ハンズオンに参加されている方は
　 　それぞれで別の名称をお付け下さい

```bash:
What is the parameter store name do you want to store your config?
default choice: [agent-config-linux]
```

　 使用するリージョンを求められますので、そのまま `Enter` を押して下さい

```bash:
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-1]
```

　 設定ファイルをParameter Storeに送信するのに、どのクレデンシャル情報を利用するか聞かれますので
　 `1` or デフォルト1なので `Enter` を押して下さい

```bash:
Which AWS credential should be used to send json config to parameter store?
1. ASIAIM7JHWYUMPKF6RPQ(From SDK)
2. Other
default choice: [1]:
```

　 Parameter Storeへの保存が完了したら設定ファイルの作成終了です

```bash:
Successfully put config to parameter store agent-config-linux-jaws.
Program exits now.
```

####CloudWatch Agentの設定
***
決定した設定ファイルをSSMの`Run Command`を使ってCloudWatch Agentに反映させていきます。

1. コンソールのEC2サービスページの左下にある `Run Command` を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/236355/5e2e0bc5-ecc1-d23a-2280-258e99a70f33.png)
<br>
2. 「コマンドのドキュメント」で`AmazonCloudWatch-ManageAgent`を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/236355/e5fe976f-629c-fab1-cfc3-3b03a4870be4.png) 
<br>
3. 「ターゲットの選択」で `インスタンスの手動選択` にチェックを入れ  
  　メトリクスを取得したいEC2を選択し `実行` ボタンをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/236355/d75fbde4-3104-b730-d8bb-393d7cb464eb.png)
<br>
4. 「Action」で `configure` を選択  
「Mode」で `EC2`を選択<br>
「Optional Configuration Source」で `ssm`を選択<br>
「Optional Configuration Location」で「agent-config-linux-jaws」と入力<br>  
「Optional Restart」では`yes`を選択 <br>
　最後に `実行` ボタンをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/236355/9d0d756e-e715-3e5e-eb5f-5cd523d0cc38.png)
<br>
実行コマンドの出力画面で以下が出力されていれば成功<br>
`Configuration validation succeeded`<br>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/236355/8fa683cc-fe3b-6a8b-3e58-48ccdcd2c906.png)

###結果確認
***
CloudWatch Agentで設定したメトリクスが監視されているか、CloudWatchのコンール画面から確認します。

① メトリクス
1. CloudWatchのメトリクス画面から `CWAgent` を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/236355/c8cff8c0-b632-cba8-b238-5ab5075a8a8e.png)
　　
2. ディメンションは以下の4種類になっています。<br>
  ・ ImageId, InstanceId, InstanceType
  ・ ImageId, InstanceId, InstanceType, name
  ・ ImageId, InstanceId, InstanceType, cpu
  ・ ImageId, InstanceId, InstanceType, device, fstype, path

![image.png](https://qiita-image-store.s3.amazonaws.com/0/236355/70791203-8940-4ea2-6998-0f0dd43ae468.png)

　　
3. 例 ： `ImagedId, InstanceId, Intance Type`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/236355/0e7296dc-778d-18f8-f83b-971b2d117450.png)

②ログ
1. CloudWatchのログ画面で `messages` でフィルタリング
![image.png](https://qiita-image-store.s3.amazonaws.com/0/236355/fce54eeb-20d8-8666-19d8-0c0e627e5fac.png) <br>
2. 今回使用しているEC2を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/236355/92ae185f-96f0-4a4c-6705-dc1a3c27d29e.png)<br>
3. `/var/log/messages` の内容が記載されています<br>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/236355/a2d105c3-3ade-2ada-c53b-4cf0547e1ab1.png)

###オプション
***

CloudWatch Agentのメトリクスやログの設定を変更したい場合も
SSMを使って容易に変更出来ます。

1. SSMのパラメータストア画面で、先ほど作成した `agent-config-linux-jaws` を選択し
アクションの中の `パラメータの編集` をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/236355/d07fe71f-d00e-f64f-9959-50b6bc801c4f.png)

2. `値` の部分に設定内容が記載されているので、用途に合わせて変更を行い
　 [CloudWatch Agentの設定](https://qiita.com/SHONANnoHBK/private/70e3879a0ce6fffe6d2c#cloudwatch-agent%E3%81%AE%E8%A8%AD%E5%AE%9A)を再度行う
![image.png](https://qiita-image-store.s3.amazonaws.com/0/236355/c892297a-9dd8-a4b3-06a7-de7e41ef1395.png)
設定可能なメトリクスやログについては以下の公式ドキュメントを参照
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html

※値の内容

```bash:
{
	"logs": {
		"logs_collected": {
			"files": {
				"collect_list": [
					{
						"file_path": "/var/log/messages",
						"log_group_name": "messages"
					}
				]
			}
		}
	},
	"metrics": {
		"append_dimensions": {
			"AutoScalingGroupName": "${aws:AutoScalingGroupName}",
			"ImageId": "${aws:ImageId}",
			"InstanceId": "${aws:InstanceId}",
			"InstanceType": "${aws:InstanceType}"
		},
		"metrics_collected": {
			"cpu": {
				"measurement": [
					"cpu_usage_idle",
					"cpu_usage_iowait",
					"cpu_usage_user",
					"cpu_usage_system"
				],
				"metrics_collection_interval": 60,
				"resources": [
					"*"
				],
				"totalcpu": false
			},
			"disk": {
				"measurement": [
					"used_percent",
					"inodes_free"
				],
				"metrics_collection_interval": 60,
				"resources": [
					"*"
				]
			},
			"diskio": {
				"measurement": [
					"io_time",
					"write_bytes",
					"read_bytes",
					"writes",
					"reads"
				],
				"metrics_collection_interval": 60,
				"resources": [
					"*"
				]
			},
			"mem": {
				"measurement": [
					"mem_used_percent"
				],
				"metrics_collection_interval": 60
			},
			"netstat": {
				"measurement": [
					"tcp_established",
					"tcp_time_wait"
				],
				"metrics_collection_interval": 60
			},
			"swap": {
				"measurement": [
					"swap_used_percent"
				],
				"metrics_collection_interval": 60
			}
		}
	}
}
```

###お片づけ
***
今回のハンズオンで使用した以下のリソースは月額10$程度の課金が発生いたします。
ハンズオン実施後に削除をお願い致します。
■課金対象リソース
　・EC2　
　・CloudWatch 取得したメトリクス(メトリクスを削除出来る訳ではありません)
　・CloudWatch 取得したログ

<br><br>