MacBook のメトリクスを CloudWatch で監視したいんだ！

## はじめに

当初は `Raspberry Pi` に `CloudWatch Agent` をインストールして、`CloudWatch` で監視することを文章にしようと思っていましたが、 `Raspberry Pi` で実施した手順を整理し直すために、`MacBook` で同じ手順をやってみることにしました。

## この記事のゴール

- MacBook に `CloudWatch Agent` をインストールできるようになります。
- MacBook のメトリクスを `CloudWatch` で監視できるようになります。

## 背景

`Raspberry Pi` を `NAS` として使っているのですが、いつも間にか `NAS` が落ちている状況に遭遇していました。
落ちていても気づかないので、`CloudWatch` で監視したいと考えた次第です。
`Raspberry Pi` では `CloudWatch Alerm` を設定するところまで実施しましたが、今回は省略します。

## 前提条件

- 利用端末 : `MacBook Air` `Apple M3` `macOS Sonoma 14.5`
- `MacOS` に `wget` がインストールされていること
- `MacOS` に `aws-cli` がインストールされていること

## やることサマリ

1. `IAM` ユーザーの作成
2. `IAM` ユーザーの認証情報を MacBook に設定
3. `CloudWatch Agent` のインストール
4. `CloudWatch Agent` の設定
5. `CloudWatch Agent` の起動
6. `CloudWatch` のコンソール画面でメトリクスを確認

:::message
`Raspberry Pi` で実施した手順を `MacBook` で再実施したため、 `MacBook` における最適な手順ではないかもしれません。
:::

## 手順詳細

### 1. `IAM` ユーザーの作成

`CloudWatch Agent` が `CloudWatch` にデータを送信するため、 `IAM` ユーザーを作成する必要があります。
下記公式ドキュメントを参考に `IAM` ユーザーを作成します。

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

::: note info
今回作成するユーザーは `CloudWatchAgentServerPolicy` をアタッチしたものです。
:::

#### 1-1. コンソール画面右上の検索画面に `IAM` と入力

#### 1-2. `IAM` をクリック

![CleanShot2024-07-02at21.52.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332694/496ff069-48c3-8181-8686-d694558f5adf.png)
_step 1, 2_

#### 1-3. 左ペインに表示されている `ユーザー` をクリック

![CleanShot2024-07-02at21.55.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332694/de25f818-bc7b-f9e1-8b77-9acf384979e7.png)
_step 3_

#### 1-4. 画面右 `ユーザーの作成` をクリック

![CleanShot2024-07-02at21.55.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332694/5dfabe07-c89b-fb96-46c3-5015c236348a.png)
_step 4_

#### 1-5. `ユーザーの詳細を指定` 画面の `ユーザー名` 欄に任意の名称を入力

#### 1-6. `ユーザーの詳細を指定` 画面右下の `次へ` ボタンをクリック

![CleanShot2024-07-02at21.56.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332694/ef3aa55e-90f8-e755-a634-d5c9ae1115d9.png)
_step 5, 6_

#### 1-7. `許可の詳細` 画面の `許可のオプション` で `ポリシーを直接アタッチする` を選択

#### 1-8. `許可ポリシー` の検索欄に `CloudWatchAgentServerPolicy` を入力

#### 1-9. `CloudWatchAgentServerPolicy` にチェックを入れる

#### 1-10. `許可の設定` 画面右下の `次へ` ボタンをクリック

![CleanShot2024-07-07at18.30.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332694/817b7796-1100-97b4-9d2e-3be15f0c0bb2.png)
_step 7, 8, 9, 10_

#### 1-11. `確認して作成` 画面右下の `ユーザーの作成` ボタンをクリック

![CleanShot2024-07-02at22.00.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332694/0d7bd8f1-a696-17c1-13aa-5d03017a21ac.png)

_step 11_

::: note info
ユーザーの作成に成功すると、以下画像のように `ユーザーが正常に作成されました` と表示されます。
![CleanShot2024-07-02at22.01.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332694/3772570c-8321-4e99-380e-e3ffb477bc40.png)
:::

### 2. `IAM` ユーザーの認証情報を MacBook に設定

#### 2-1. `IAM ユーザー` 画面にて、作成したユーザーのユーザー名をクリック

![CleanShot2024-07-02at22.01.04v2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332694/bf5c2597-a5fe-ee1a-71e1-04ced4902bb4.png)
_step 1_

#### 2-2. `アクセスキーを作成` をクリック

![CleanShot2024-07-07at18.36.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332694/0b96f189-ba05-a09f-c1ef-4abbda9a74c0.png)
_step 2_

#### 2-3. `主要なベストプラクティスと代替案にアクセスする` 画面にて `AWSの外部で実行されるアプリケーション` を選択

#### 2-4. `主要なベストプラクティスと代替案にアクセスする` 画面右下の `次へ` ボタンをクリック

![CleanShot2024-07-02at22.13.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332694/a52b9dba-91a1-f724-5e81-02f294bce58d.png)
_step 3, 4_

#### 2-5. `説明タグを設定　- オプション` 画面の `説明タグ値` に任意の説明を入力

#### 2-6. `説明タグを設定　- オプション` 画面右下の `アクセスキーの作成` ボタンをクリック

![CleanShot2024-07-02at22.14.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332694/507f463c-5d33-7e7d-cc75-c63899e446a2.png)
_step 5, 6_

#### 2-7, 8. `アクセスキーを取得` 画面にて、`アクセスキー ID` と `シークレットアクセスキー` をメモ

![CleanShot2024-07-02at22.14.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332694/12251e18-f1f9-625a-dcf8-c180f7720bcd.png)
_step 7, 8_

#### 2-9. 認証情報ファイルを作成

下記コマンドを実行して、認証情報ファイルを作成します。
`your_access_key` と `your_secret_key` は、 `7, 8` で控えた値に置き換えてください。

```bash
sudo aws configure --profile AmazonCloudWatchAgent
```

```bash
# 実行結果
AWS Access Key ID [None]: your_access_key
AWS Secret Access Key [None]: your_secret_key
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

### 3. `CloudWatch Agent` のインストール

下記公式ドキュメントを参考にインストールします。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/download-cloudwatch-agent-commandline.html#download-CloudWatch-Agent-on-EC2-Instance-commandline-first

#### 3-1. パッケージのダウンロード

手元の MacBook は `ARM64` アーキテクチャであるため、`ARM64` 用のパッケージをダウンロードします。
今回は東京リージョンを指定してダウンロードします。

```bash
wget https://amazoncloudwatch-agent-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/darwin/arm64/latest/amazon-cloudwatch-agent.pkg
```

```bash
# 実行結果
--2024-06-30 14:27:41--  https://amazoncloudwatch-agent-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/darwin/arm64/latest/amazon-cloudwatch-agent.pkg
amazoncloudwatch-agent-ap-northeast-1.s3.ap-northeast-1.amazonaws.com (amazoncloudwatch-agent-ap-northeast-1.s3.ap-northeast-1.amazonaws.com) をDNSに問いあわせています... 52.219.199.42, 52.219.9.50, 52.219.163.42, ...
amazoncloudwatch-agent-ap-northeast-1.s3.ap-northeast-1.amazonaws.com (amazoncloudwatch-agent-ap-northeast-1.s3.ap-northeast-1.amazonaws.com)|52.219.199.42|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 125143997 (119M) [application/octet-stream]
`amazon-cloudwatch-agent.pkg' に保存中

amazon-cloudwatch-agent.pkg                         100%[===================================================================================================================>] 119.35M  8.72MB/s 時間 14s

2024-06-30 14:27:54 (8.84 MB/s) - `amazon-cloudwatch-agent.pkg' へ保存完了 [125143997/125143997]
```

#### 3-2. パッケージのインストール

`wget` でダウンロードしたパッケージをインストールします。
`wget` コマンドを実行したディレクトリに `amazon-cloudwatch-agent.pkg` が存在することを確認してください。
その後、下記コマンドを実行します。
実行後、`Password:` が表示されるので、`MacBook` のパスワードを入力してください。

```bash
sudo installer -pkg ./amazon-cloudwatch-agent.pkg -target /
```

```bash
# 実行結果
Password:
installer: Package name is amazon-cloudwatch-agent
installer: Installing at base path /
installer: The install was successful.
```

### 4. `CloudWatch Agent` の設定

`amazon-cloudwatch-agent-config-wizard` コマンドを実行して、`CloudWatch Agent` の設定を行います。
下記公式ドキュメントも参考にしてください。

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

#### 4-1. ウィザードの実行

下記コマンドを実行して、ウィザードを起動します。
実行後、`Password:` が表示されるので、`MacBook` のパスワードを入力してください。

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

```bash
# 実行結果
Password:
================================================================
= Welcome to the Amazon CloudWatch Agent Configuration Manager =
=                                                              =
= CloudWatch Agent allows you to collect metrics and logs from =
= your host and send them to CloudWatch. Additional CloudWatch =
= charges may apply.                                           =
================================================================
```

#### 4-2. ウィザードの質問に回答

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

```bash
Trying to fetch the default region based on ec2 metadata...
I! imds retry client will retry 1 timesD! should retry true for imds error : RequestError: send request failed
caused by: Put "http://xxx.xxx.xxx.xxx/latest/api/token": context deadline exceeded (Client.Timeout exceeded while awaiting headers)D! should retry true for imds error : RequestError: send request failed
caused by: Put "http://xxx.xxx.xxx.xxx/latest/api/token": context deadline exceeded (Client.Timeout exceeded while awaiting headers)2024/07/07 15:32:01 D! could not get region from imds v2 thus enable fallback
W! could not get region from ec2 metadata... EC2MetadataRequestError: failed to get EC2 instance identity document
caused by: RequestError: send request failed
caused by: Get "http://xxx.xxx.xxx.xxx/latest/dynamic/instance-identity/document": dial tcp xxx.xxx.xxx.xxx:80: connect: host is downAre you using EC2 or On-Premises hosts?
1. EC2
2. On-Premises
default choice: [2]:
2
```

```bash
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
Which user are you planning to run the agent?
1. cwagent
2. root
3. others
default choice: [1]:
2
```

```bash
Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:
2
```

```bash
Do you want to monitor metrics from CollectD? WARNING: CollectD must be installed or the Agent will fail to start
1. yes
2. no
default choice: [1]:
2
```

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

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

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

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

```bash
Current config as follows:
{
	"agent": {
		"metrics_collection_interval": 60,
		"run_as_user": "root"
	},
	"metrics": {
		"metrics_collected": {
			"cpu": {
				"measurement": [
					"cpu_usage_idle"
				],
				"metrics_collection_interval": 60,
				"resources": [
					"*"
				],
				"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
```

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

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

```bash
Do you want the CloudWatch agent to also retrieve X-ray traces?
1. yes
2. no
default choice: [1]:
2
```

```bash
Existing config JSON identified and copied to:  /opt/aws/amazon-cloudwatch-agent/etc/backup-configs
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"
	},
	"metrics": {
		"metrics_collected": {
			"cpu": {
				"measurement": [
					"cpu_usage_idle"
				],
				"metrics_collection_interval": 60,
				"resources": [
					"*"
				],
				"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]:
2

Program exits now.
```

#### 4-3. `common-config.toml` の編集

vim を立ち上げ、 `common-config.toml` を編集します。

```bash
sudo vim /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml
```

デフォルトの toml ファイルを下記のように編集します。

```diff:common-config.toml
## Configuration for shared credential.
## Default credential strategy will be used if it is absent here:
##      Instance role is used for EC2 case by default.
##      AmazonCloudWatchAgent profile is used for onPremise case by default.
-# [credentials]
-#    shared_credential_profile = "{profile_name}"
-#    shared_credential_file = "{file_name}"
+ [credentials]
+    shared_credential_profile = "AmazonCloudWatchAgent"
+    shared_credential_file = "/Users/<your_name>/.aws/credentials"
```

:::message
`Raspberry Pi` で実施した際はデフォルトのままで問題ありませんでしたが、`MacBook` で実施した際には、`shared_credential_profile` と `shared_credential_file` を設定しないとエラーが発生しました。
:::

### 5. `CloudWatch Agent` の起動

#### 5-1. `CloudWatch Agent` の起動

下記コマンドを実行して、`CloudWatch Agent` を起動します。

```bash
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m onPremise -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json
```

```bash
# 実行結果
Password:
Got Home directory: /var/root
I! Set home dir Linux: /var/root
I! SDKRegionWithCredsMap region:  ap-northeast-1
Successfully fetched the config and saved in /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_config.json.tmp
2024/07/07 17:24:26 Reading json config file path: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_config.json.tmp ...
2024/07/07 17:24:26 I! Valid Json input schema.
2024/07/07 17:24:26 D! delta processor required because metrics with diskio or net are set
2024/07/07 17:24:26 Configuration validation first phase succeeded
Got Home directory: /var/root
I! Set home dir Linux: /var/root
I! SDKRegionWithCredsMap region:  ap-northeast-1
/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
```

### 6. `CloudWatch` のコンソール画面でメトリクスを確認

#### 6-1. コンソール画面右上の検索画面に `CloudWatch` と入力

#### 6-2. `CloudWatch` をクリック

![CleanShot2024-07-07at17.40.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332694/7bb95e10-6c9c-c9f4-792f-34b20c887d3f.png)
_step 1, 2_

#### 6-3. 左ペインに表示されている `すべてのメトリクス` をクリック

![CleanShot2024-07-07at17.40.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332694/6a08a784-831e-d176-110e-42c25e4b5641.png)
_step 3_

#### 6-4. `カスタム名前空間` 内の `CWAgent` をクリック

![CleanShot2024-07-07at17.40.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332694/a8dc7223-c37d-7110-78c2-c6ec45e87545.png)
_step 4_

#### 6-5. `cpu,host` をクリック

ここで選択する項目は任意です

![CleanShot2024-07-07at17.41.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332694/fbdde58b-b1a8-80d4-67f1-e81206227b6e.png)
_step 5_

#### 6-6. `host` に `MacBook` と記載されているメトリクスのチェックボックスにチェックを入れる

`CloudWatch Agent` が `CloudWatch` にデータを送信できていれば、メトリクスが表示されます。

![CleanShot2024-07-07at17.41.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332694/edf18c12-e761-16d9-8159-d93c3554a41a.png)
_step 6_

## 参照情報

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

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/download-cloudwatch-agent-commandline.html#download-CloudWatch-Agent-on-EC2-Instance-commandline-first

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