AWS EC2モニタリング入門(メモリ・ディスクの監視)

AWS
この記事は約19分で読めます。
記事内に広告が含まれています。

EC2の代表的な「モニタリング項目」(標準メトリクス)は何もしなくても、AWSマネジメントコンソールから確認できます。

しかし、メモリやディスクなどは監視出来ません。

標準メトリクスの画面です。

今回は「メモリ」や「ディスク」を監視するために以下内容をご紹介します。

  • CloudWatchエージェントのインストール、設定
  • メトリクス(メモリ等)の確認

※ターゲットは「Windows Server」です!

以下、目次です。ポイントを抑えてささっとメトリクスを収集します!

権限(IAMロール)設定

EC2に対して次の権限が必要です。

  • CloudWatchAgentServerPolicy
  • CloudWatchAgentAdminPolicy

後者の「CloudWatchAgentAdminPolicy」はコンフィグ内容をSystems Managerのパラメータストアに格納するために必要な権限であり、使わないなら付与しなくてもOKです。

設定の詳細は割愛しますが、EC2付与用のIAMロールを作成し、2つのポリシーを加えておきます。

このポリシーが必要。

エージェントインストール(SSM利用)

エージェントのインストールはパッケージ利用もあるようですが、SSMのRun Commandでインストールします。

*SSMが利用可能であると仮定して進めます(Systems Managerのフリートマネージャ―に該当EC2が表示されていればSSMの管理下に入っている)

Run Commandでインストールしますが、ポイントは次の通りです。

  • コマンドドキュメント:AWS-ConfigureAWSPackage
  • Action:Install
  • Name:AmazonCloudWatchAgent
ドキュメント選択の画面です。
コマンドのパラメータです。

画面にはありませんがS3出力オプションはチェックOFFにしました(インストールの実行ログはコンソールでその時に確認出来れば十分とこの時は判断)。

インストールは数分で完了します。

完了後、Windows Serverのサービスを確認すると「AmazonCloudWatchAgent」が「停止」状態で存在することが確認できました。

サービスにありました。

設定ウィザード&エージェント起動

続いて、設定ウィザードを使って設定コンフィグファイルの生成を行います。

# コマンドプロンプトを起動して以下を実行。
cd "C:\Program Files\Amazon\AmazonCloudWatchAgent"
amazon-cloudwatch-agent-config-wizard.exe

ウィザードが表示されるため、基本デフォルトのまま進めます。変更点は次の通りでした。

  • パラメータストアにアップしない。
  • カスタムログは含めない。
  • イベントログは含めない。

※ウィザードの標準出力は参考までに別のところに載せます。

続いて、設定ファイルconfig.jsonは「C:\Program Files\Amazon\AmazonCloudWatchAgent」配下に出力されますが、「C:\ProgramData\Amazon\AmazonCloudWatchAgent\Configs」配下にamazon-cloudwatch-agent.jsonとして保存しないとサービスは起動してくれません。

# エラーログ抜粋
Reading json config file path: C:\ProgramData\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent.json …
C:\ProgramData\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent.json does not exist or cannot read. Skipping it.
No json config files found, please provide config, exit now

コンフィグファイルの移動後、サービスを起動することが出来ました。

なお、プロキシ環境下の場合は、さらにプロキシ設定が必要です。

# エラーログ抜粋(プロキシ)
[processors.ec2tagger] ec2tagger: Unable to describe ec2 tags for initial retrieval: RequestError: send request failed
caused by: Post "https://ec2.ap-northeast-1.amazonaws.com/": proxyconnect tcp: tls: first record does not look like a TLS handshake

以下のファイルにプロキシ設定を加えます。

C:\ProgramData\Amazon\AmazonCloudWatchAgent\common-config.toml

# 設定例(元々コメントアウトされている)
[proxy]
http_proxy = "http://url:port"
https_proxy = "http://url:port"
no_proxy = "169.254.169.254"

※[proxy]も含めないとダメです。

※本設定ファイルに記載がなくても、環境変数から読み取ってくれる場合もあるようです(ログファイルから適宜判断しましょう)。

メトリクスの確認

CloudWatchサービスのメトリクスより確認することが出来ます。

カスタム名前空間のカテゴリです。
このようにメモリ利用量を確認することが出来ました。

利用コスト

詳細メトリクスと同様に月額0.3$です。

料金 - Amazon CloudWatch | AWS
Amazon CloudWatch は無料で始めることができ、また 、無料利用枠内でご利用いただけるアプリケーションも多数ご用意しています。このページでは Amazon CloudWatch に関する各種お見積もりや API 使用時のコスト...

なお、アラームに活用したり、LambdaからAPI経由でデータ取得する場合には、別途コストがかかります。メトリクスだらけでコストがかさむ場合はZabbix等、OSSの監視ツールも併用すると良いかもしれません。

(参考) amazon-cloudwatch-agent-config-wizardの標準出力

ご参考までに

C:\Program Files\Amazon\AmazonCloudWatchAgent>amazon-cloudwatch-agent-config-wizard.exe
================================================================
= 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.                                           =
================================================================
On which OS are you planning to use the agent?
1. linux
2. windows
3. darwin
default choice: [2]:

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

Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [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]:

What is the aggregation interval for metrics collected by StatsD daemon?
1. Do not aggregate
2. 10s
3. 30s
4. 60s
default choice: [4]:

Do you have any existing CloudWatch Log Agent configuration file to import for migration?
1. yes
2. no
default choice: [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?
1. yes
2. no
default choice: [1]:

Do you want to add ec2 dimensions (ImageId, InstanceId, InstanceType, AutoScalingGroupName) into all of your metrics if the i
nfo is available?
1. yes
2. no
default choice: [1]:

Do you want to aggregate ec2 dimensions (InstanceId)?
1. yes
2. no
default choice: [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]:

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

Current config as follows:
{
        "metrics": {
                "aggregation_dimensions": [
                        [
                                "InstanceId"
                        ]
                ],
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {
                        "LogicalDisk": {
                                "measurement": [
                                        "% Free Space"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "Memory": {
                                "measurement": [
                                        "% Committed Bytes In Use"
                                ],
                                "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 ite
ms.
1. yes
2. no
default choice: [1]:

Do you want to monitor any customized log files?
1. yes
2. no
default choice: [1]:
2
Do you want to monitor any Windows event log?
1. yes
2. no
default choice: [1]:
2
Saved config file to config.json successfully.
Current config as follows:
{
        "metrics": {
                "aggregation_dimensions": [
                        [
                                "InstanceId"
                        ]
                ],
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {
                        "LogicalDisk": {
                                "measurement": [
                                        "% Free Space"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "Memory": {
                                "measurement": [
                                        "% Committed Bytes In Use"
                                ],
                                "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 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
Please press Enter to exit...

Program exits now.

(参考) CLIで確認

次のCLIコマンドでメトリクスを確認できます。

  • get-metric-data
  • get-metric-statistics
get-metric-statistics — AWS CLI 1.34.28 Command Reference
# 指定区間における5分毎の平均メモリ使用率を確認
aws cloudwatch get-metric-data \
--metric-data-queries '{"Id":"m1","MetricStat":{"Metric":{"Namespace":"CWAgent","MetricName":"Memory % Committed Bytes In Use","Dimensions":[{"Name":"InstanceId","Value":"i-1234567890"}]},"Period":300,"Stat":"Average"}}' \
--start-time 2023-07-26T01:20:00+00:00 \
--end-time 2023-07-26T01:30:00+00:00

# 出力例
{
    "MetricDataResults": [
        {
            "Id": "m1",
            "Label": "Memory % Committed Bytes In Use",
            "Timestamps": [
                "2023-07-26T01:20:00+00:00",
                "2023-09-26T01:25:00+00:00"
            ],
            "Values": [
                32.17807540893555,
                32.18833465576172
            ],
            "StatusCode": "Complete"
        }
    ],
    "Messages": []
}

事前に「aws cloudwatch list-metrics –namespace CWAgent」で該当ネームスペースで何が取得できるって点も調べるとスムーズに進められます。

メトリクスによっては、コマンド指定のパラメータ数も多くなるので、list-metricsで必要なパラメータ調査は必須です・・・。以下に例を載せます。

# ディスク「C」の空き容量を取得
aws cloudwatch get-metric-data \
--metric-data-queries '{"Id":"m1","MetricStat":{"Metric":{ \"Namespace":"CWAgent","MetricName":"LogicalDisk % Free Space","Dimensions":[ \
{"Name": "instance","Value": "C:"}, \
{"Name": "InstanceId","Value": "i-1234567890"}, \
{"Name": "objectname","Value": "LogicalDisk"}, \
{"Name": "ImageId","Value": "ami-0987654321"}, \
{"Name": "InstanceType","Value": "m6a.medium"} \
]},"Period":300,"Stat":"Average"}}' \
--start-time 2023-07-20T08:20:00+09:00 \
--end-time 2023-07-20T08:30:00+09:00

→ なんで任意ドライブの容量取得でImageIdやInstanceType等の指定が必要なのだろう・・・。

(参考)ナレッジ

◇Windows Serverの場合、起動処理が重い関係でCloudwatch Agentが起動しないことがあります。
→ 正確にはサービス開始要求が30秒のタイムアウトにひっかかってしまうのです。

回避策はサービスタイムアウトの時間を変更することです。

変更するためにはレジストリ操作が必要となります。

・エントリ箇所:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
・設定内容:ServicesPipeTimeout(DWORD)
→ 設定値は60秒であれば10進数で60000と設定する。

※ServicesPipeTimeoutは無ければ「新規作成」で作成します。

まとめ

Windows Serverにおいてメモリやディスク利用量を収集し、CloudWatchで確認する方法について書いてみました。最初はインストールや設定に戸惑う点がありましたが、慣れてしまえば、簡単です。

  • IAMロール設定
  • エージェントインストール
  • エージェント設定(プロキシ設定含む)

※本記事には記載していませんが、一括インストールやパラメータストアによる同一設定を複数EC2に適用することも可能です。

最後までご覧いただきありがとうございます。

コメント

Top
タイトルとURLをコピーしました