【EC2】メモリ使用率・スワップ使用率を CloudWatch で表示する

Blog-Thumbnail_KUDs-01
  1. はじめに
  2. CloudWatch エージェントとは
  3. IAM ロールの設定
    1. IAM ロールの作成
  4. CloudWatch エージェントのインストールと設定
    1. インストール
    2. ウィザードを用いた設定作成
      1. 使用予定の OS
      2. EC2 かオンプレミスのホストを使用するか
      3. エージェントをどのユーザーで実行するか
      4. StatsD デーモンを有効にするか
      5. StatsD デーモンのリッスンポート
      6. StatsD デーモンの収集間隔
      7. StatsD デーモンが収集したメトリクスの集約間隔
      8. CollectD からのメトリクスをモニタリングするか
      9. ホストメトリクスをモニタリングするか
      10. コアごとの CPU メトリクスをモニタリングするか
      11. EC2 の情報を全てのメトリクスに追加するか
      12. EC2 の情報を集約するか
      13. 高解像度でメトリクスを収集するか
      14. デフォルトのメトリクスセット
      15. 設定内容の確認
      16. CloudWatch Logs Agent の既存設定ファイルをマージするか
      17. インポートする設定ファイルのパス
      18. ログファイルをモニタリングするか
      19. 設定内容の再確認
      20. 設定を SSM パラメータストアに保存するかどうか
      21. SSM パラメータストアに設定を保存する際のパラメータ名
      22. SSM パラメータストアに設定を保存する際のリージョン
      23. SSM パラメータストアに設定を保存する際の AWS クレデンシャル
    3. 手動での設定作成
  5. collectd の導入
  6. CloudWatch Agent の起動
  7. CloudWatch メトリクスの料金
    1. 有料利用枠
    2. 無料利用枠
  8. 無料利用枠
  9. さいごに

はじめに

おはようございます。KUDs です。

突然ですが、リソースのモニタリングはしておりますでしょうか。
システムのパフォーマンスを保つため、インフラストラクチャの監視は重要です。

AWS には、CloudWatch という強力なモニタリングツールがあります。

CloudWatch ではデフォルトで以下のインスタンスメトリクスを利用可能です。

  • CPUUtilization
  • DiskReadOps
  • DiskWriteOps
  • DiskReadBytes
  • DiskWriteBytes
  • MetadataNoToken
  • NetworkIn
  • NetworkOut
  • NetworkPacketsIn
  • NetworkPacketsOut

詳細は AWS 公式ドキュメントをご参照ください。

インスタンスの利用可能な CloudWatch メトリクスのリスト表示 - Amazon Elastic Compute Cloud
アクティビティの開始から 5 分間で、Amazon EC2 から CloudWatch に送信されるメトリクスを表示します。

御覧の通り、重要な指標はあらかた網羅されています。

しかし、メモリ使用率・スワップ使用率等のメトリクスはデフォルトでは利用できません。
そこで、本記事では CloudWatch Agent を利用してメモリ使用率とスワップ使用率のカスタムメトリクスを取得し、CloudWatch で表示する方法を説明します。

CloudWatch エージェントとは

CloudWatch エージェントは、CloudWatch と連携して、あなたのアプリケーションを実行しているEC2インスタンスやオンプレミスサーバーの詳細なシステムメトリクスを収集するツールです。

このエージェントは、Linux と Windows の両方の OS で動作します。
また、システムログ / アプリケーションログの収集もサポートしています。

CloudWatch エージェントの主な特徴は次のとおりです:

  • 詳細なシステムメトリクスの収集
    • デフォルトの CloudWatch メトリクスでは取得できない詳細なメトリクスを収集可能
      • CPU使用率
      • メモリ使用率
      • ディスクI/O
      • ネットワークI/O等
  • アプリケーションログの収集
    • アプリケーションログの収集及び、CloudWatch Logs への送信が可能
  • オンプレミスサーバーとの互換性
    • AWS 環境だけでなく、オンプレミスサーバーでも利用可能

これによって、より詳細な監視とアラート設定が可能になります。

IAM ロールの設定

CloudWatch エージェントがメトリクスを CloudWatch に送信するためには、適切な権限を持つ IAM ロールを作成し、EC2 インスタンスにアタッチしておく必要があります。
ここでは、そのロールの作成方法を解説します。

IAM ロールの作成

以下の手順で新しい IAM ロールを作成します。
もちろん、既存の IAM ロールにポリシーをアタッチしても問題ありません。

  1. AWS マネジメントコンソールにログインし、IAM ダッシュボードを開く
  2. 左側のメニューで「Role」を選択し、「Create role」をクリック
  3. 「AWS Service」を選択し、「EC2」を選び、「Next」をクリック
  4. 「CloudWatchAgentAdminPolicy」を選択し、「Next」をクリック
  5. 「Role name」等記入し、「Create role」をクリック

IAM ロールが作成出来たら、インスタンスにアタッチしておきましょう。

CloudWatch エージェントのインストールと設定

CloudWatchエージェントをインストールし、設定する手順を確認します。
なお、今回は EC2 Linux インスタンス (Amazon Linux 2) を使用します。

インストール

まず、以下のコマンドで CloudWatch エージェントをインストールします。

$ sudo yum install amazon-cloudwatch-agent
Loaded plugins: extras_suggestions, kernel-livepatch, langpacks, priorities, update-motd
...
Installed:
  amazon-cloudwatch-agent.x86_64 0:1.247354.0b251981-1.amzn2

Complete!

このコマンドを実行すると、CloudWatchエージェントのバイナリが /opt/aws/amazon-cloudwatch-agent/bin/ にインストールされます。

ウィザードを用いた設定作成

次に、CloudWatchエージェントの設定を行います。

CloudWatch エージェントには設定ウィザードが付属してます。
ウィザードを用いることで設定ファイルの作成を簡単に行うことができます。
手順は、以下のコマンドを実行し、対話式で各質問に回答するだけです。
基本はデフォルトで問題ないかと思いますが、一部デフォルトでない部分は補足します。

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
================================================================
= 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.                                           =
================================================================

使用予定の OS

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

ここでは、CloudWatch エージェントを使用する予定の OS を指定します。
Linux, Windows, darwin の中から選べます。
デフォルトでは、Linux を選択します。

EC2 かオンプレミスのホストを使用するか

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

ここでは、AWS の EC2 を使用するか、自分自身のオンプレミスのホストを使用するかを選びます。
デフォルトでは、EC2 を使用します

エージェントをどのユーザーで実行するか

Which user are you planning to run the agent?
1. root
2. cwagent
3. others
default choice: [1]:

ここでは、エージェントをどのユーザーで実行数化を選択します。
root, cwagent, 他のユーザーの中から選べます。
デフォルトでは、root を選択します。

StatsD デーモンを有効にするか

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

ここでは、StatsD デーモンを有効にしてメトリクスを収集するかどうかを選びます。
デフォルトでは、メトリクスを収集します。

StatsD デーモンのリッスンポート

Which port do you want StatsD daemon to listen to?
default choice: [8125]

ここでは、StatsD デーモンがメトリクスを収集するために使用するポート番号を指定します。
デフォルトでは、ポート番号は 8125 です。

StatsD デーモンの収集間隔

What is the collect interval for StatsD daemon?
1. 10s
2. 30s
3. 60s
default choice: [1]:

ここでは、StatsD デーモンがメトリクスを収集する間隔を指定します。
デフォルトでは、10s です。

StatsD デーモンが収集したメトリクスの集約間隔

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

ここでは、StatsD デーモンが収集したメトリクスを集約する間隔を指定します。
デフォルトでは、60s です。

CollectD からのメトリクスをモニタリングするか

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

ここでは、CollectD のメトリクスをモニタリングするかどうかを選びます。
デフォルトでは、モニタリングします。
CollectD インストール方法については後述します。

ホストメトリクスをモニタリングするか

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

ここでは、ホストのメトリクス(CPU 使用率、メモリ使用率など)をモニタリングするかどうかを選びます。
デフォルトでは、モニタリングします。

コアごとの CPU メトリクスをモニタリングするか

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

ここでは、各 CPU コアのメトリクスをモニタリングするかどうかを選びます。
デフォルトでは、モニタリングします。

EC2 の情報を全てのメトリクスに追加するか

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

ここでは、EC2 の情報(ImageId, InstanceId, InstanceType, AutoScalingGroupName)を全てのメトリクスに追加するかどうかを選びます。
デフォルトでは、追加します。

EC2 の情報を集約するか

Do you want to aggregate ec2 dimensions (InstanceId)?
1. yes
2. no
default choice: [1]:

ここでは、EC2 のインスタンス ID を集約するかどうかを選びます。
デフォルトでは、集約します。

高解像度でメトリクスを収集するか

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

ここでは、メトリクスセットを選びます。
Basic、Standard、Advanced、None の中から選びます。
デフォルトでは、Basic を選択します。

今回は Standard を選択するので、2 を入力します。

Standard では、以下のメトリクスを含みます。

  • CPU: 
    • cpu_usage_idle
    • cpu_usage_iowait
    • cpu_usage_user
    • cpu_usage_system
  • Disk: 
    • disk_used_percent
    • disk_inodes_free
  • Diskio: 
    • diskio_io_time
  • Mem: 
    • mem_used_percent
  • Swap: 
    • swap_used_percent

なお、各メトリクスセットの内容は AWS 公式ドキュメントをご参照ください。

ウィザードを使用して CloudWatch エージェント設定ファイルを作成する - Amazon CloudWatch
ウィザードを使用して CloudWatch エージェント設定ファイルを作成する方法について説明します。

設定内容の確認

Current config as follows:
{
        "agent": {
                "metrics_collection_interval": 60,
                "run_as_user": "root"
        },
        "metrics": {
                "aggregation_dimensions": [
                        [
                                "InstanceId"
                        ]
                ],
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {
                        "collectd": {
                                "metrics_aggregation_interval": 60
                        },
                        "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"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "mem": {
                                "measurement": [
                                        "mem_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        },
                        "statsd": {
                                "metrics_aggregation_interval": 60,
                                "metrics_collection_interval": 10,
                                "service_address": ":8125"
                        },
                        "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]:

ここでは、JSON 形式で設定内容の確認を行います。

CloudWatch Logs Agent の既存設定ファイルをマージするか

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

ここでは、CloudWatch Logs Agent の既存設定ファイルをマージするかを選択します。
デフォルトでは、マージしません。
なお、私の場合は CloudWatch Logs Agent の設定が存在しているため、1 を選択します。

古い CloudWatch Logs Agent (awslogsd) について

ここで、現時点で CloudWatch Logs Agent を使用している方は、積極的に設定ファイルをマージし、移行することを検討しましょう
CloudWatch Logs Agent は現時点で非推奨であり、サポートされておりません。なんなら廃止予定です。

重要

  • CloudWatch には、EC2 インスタンスとオンプレミスサーバーからログとメトリクスの両方を収集できる統合 CloudWatch エージェントが含まれています。ログのみの古いエージェントは非推奨となり、サポートされなくなりました。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/UsePreviousCloudWatchLogsAgent.html

古い CloudWatch Logs Agent (awslogsd) を使用しているかわからない方や、設定ファイルの所在がわからない方は以下のコマンドで確認しておきましょう。

$ systemctl status awslogsd
● awslogsd.service - awslogs daemon
   Loaded: loaded (/usr/lib/systemd/system/awslogsd.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2023-12-17 00:09:56 UTC; 2min 52s ago
 Main PID: 2317 (aws)
   CGroup: /system.slice/awslogsd.service
           └─2317 /usr/bin/python2 -s /usr/bin/aws logs push --config-file /etc/awslogs/awslogs.conf --additional-configs-dir /etc/awslogs/config

さて、手順に戻ります。

インポートする設定ファイルのパス

What is the file path for the existing cloudwatch log agent configuration file?
default choice: [/var/awslogs/etc/awslogs.conf]
/etc/awslogs/awslogs.conf

デフォルトでは、/var/awslogs/etc/awslogs.conf が指定されます。
そのパスには存在しないため、正しいパスを入力します。

ログファイルをモニタリングするか

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

ここでは、ログファイルをモニタリングするかどうかを設定します。
デフォルトでは、モニタリングします。
なお、私の場合前段でログファイル監視設定を統合済みのため 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": {
                "force_flush_interval": 5,
                "logs_collected": {
                        "files": {
                                "collect_list": [
                                        {
                                                "file_path": "/var/log/httpd/error_log",
                                                "log_group_name": "/var/log/httpd/error_log",
                                                "log_stream_name": "{instance_id}",
                                                "retention_in_days": -1,
                                                "timestamp_format": "%b %d %H:%M:%S"
                                        },
                                        {
                                                "file_path": "/var/log/messages",
                                                "log_group_name": "/var/log/messages",
                                                "log_stream_name": "{instance_id}",
                                                "retention_in_days": -1,
                                                "timestamp_format": "%b %d %H:%M:%S"
                                        }
                                ]
                        }
                }
        },
        "metrics": {
...
(先程と同じため省略)
...
}
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.

ここでは、CloudWatch Logs の設定ファイルをマージしたことによって、logs の項目が追加されていることを確認できます。

設定を SSM パラメータストアに保存するかどうか

Do you want to store the config in the SSM parameter store?
1. yes
2. no
default choice: [1]:

ここでは、確認した設定内容を SSM パラメータストアに保存するかを設定します。
デフォルトでは、保存します。

SSM パラメータストアに設定を保存する際のパラメータ名

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-linux」です。

SSM パラメータストアに設定を保存する際のリージョン

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]

ここでは、利用するリージョンを指定します。
デフォルトでは、リージョンはメタデータからフェッチされます

SSM パラメータストアに設定を保存する際の AWS クレデンシャル

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

ここでは、クレデンシャルを指定します。

その後、設定がパラメータストアに保存され、プログラムは終了します。

Successfully put config to parameter store AmazonCloudWatch-linux.
Program exits now.

手動での設定作成

先ほどはウィザードで作成しましたが、もちろん手動でも作成可能です。
要は、先ほどの JSON ファイルを作成すればよいのです。

# vi /opt/aws/amazon-cloudwatch-agent/bin/config.json

AWS 公式ドキュメントも参考になるかと思います。
ここでは割愛します。

CloudWatch エージェント設定ファイルを手動で作成または編集する - Amazon CloudWatch
CloudWatch エージェント設定ファイル (CloudWatch エージェント設定ファイル内のセクションと設定を含む) を手動で作成する方法について説明します。

collectd の導入

もし、CollectD をインストールしていない状態で CloudWatch Agent を起動しようとすると、以下のようなエラーが発生します。

E! [telegraf] Error running agent: Error loading config file /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml: error parsing socket_listener, open /usr/share/collectd/types.db: no such file or directory

CollectD は以下のコマンドでインストールできます。

$ sudo amazon-linux-extras install collectd

その他、詳細な設定は AWS 公式ドキュメントが参考になるかと思います。
一旦ここでは割愛します。

collectd を使用してカスタムメトリクスを取得する - Amazon CloudWatch
CloudWatch エージェントおよび collectd を使用して、アプリケーションまたはサービスからカスタムメトリクスを収集する方法。

CloudWatch Agent の起動

CloudWatch Agent は以下のコマンドで起動できます。

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c ssm:AmazonCloudWatch-linux

ファイル名の指定は、サーバ内のファイルパスでも問題ありません。
SSM パラメータストアを使用していない場合等、適宜修正してください。

他 OS で実行する場合は、AWS 公式ドキュメントにコマンドの案内があります。

サーバーでの CloudWatch エージェントのインストールおよび実行 - Amazon CloudWatch
サーバーに CloudWatch エージェントをインストールして実行する方法について説明します。

以上で、問題なくメトリクスが表示されるかと思います。

CloudWatch メトリクスの料金

CloudWatch メトリクスの料金についてもおさらいしておきましょう。

有料利用枠

東京リージョンの料金体系は以下の通りです。

メトリクス

すべてのカスタムメトリックの料金は時間単位で請求され、メトリクスを CloudWatch に送信したときにのみ計算されます。

Amazon EC2 詳細モニタリングの料金は、カスタムメトリックの数に基づいており、メトリックの送信には API 料金がかかりません。EC2 詳細モニタリングの一部として EC2 インスタンスによって送信されるメトリックの数は、インスタンスタイプによって異なります。詳細については、インスタンスメトリックのドキュメントを参照してください。通常、EC2 詳細モニタリングのインスタンスあたりの料金は月額ですと 2.10 USD (インスタンスあたり 7 メトリックと想定) で、最も安価なティアでは 0.14 USD がかかります。すべてのカスタムメトリックと同様に、EC2 詳細モニタリングは時間単位で比例配分され、インスタンスがメトリックを CloudWatch に送信するときのみ測定されます。

範囲コスト (メトリクス/月)
最初の 10,000 メトリクス0.30USD
次の 240,000 メトリクス0.10USD
次の 750,000 メトリクス0.05USD
1,000,000 を超えるメトリクス0.02USD
CloudWatch メトリクス 有料利用枠 料金
https://aws.amazon.com/jp/cloudwatch/pricing/

無料利用枠

無料利用枠

Amazon CloudWatch は無料でお試しいただけます。ほとんどの AWS のサービス (EC2、S3、Kinesis など) は、無料で自動的にメトリクスを CloudWatch に送信します。無料利用枠内で利用できるアプリケーションを多数ご用意しています。AWS 無料利用枠の詳細については、こちらを参照してください。

メトリクス基本モニタリングのメトリクス (5 分間隔)詳細モニタリングのメトリクス 10 個 (1 分間隔) 100 万の API リクエスト (GetMetricData および GetMetricWidgetImage には適用されません)
CloudWatch メトリクス 無料利用枠
https://aws.amazon.com/jp/cloudwatch/pricing/

無料利用枠で納めたい方は、Billing で利用状況を確認しつつ、適宜以下のファイルを編集してください。

# vi /opt/aws/amazon-cloudwatch-agent/bin/config.json

また、編集後は設定ファイルを fetch することを忘れないでください

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c ssm:AmazonCloudWatch-linux

また、ファイルを読み取る際は SSM パラメータストアではなく、ファイルを指定する必要がある点についてもご注意ください。

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

もし、「設定内容を修正&フェッチしたけど、カスタムメトリクス数が想定よりも多いままだ!」という方は、ディメンションによるものかもしれません。
以下の記事にて、注意点と設定変更方法について解説しているので、参考にしてみてください。

https://blog.kuds.win/aws/optimize-cloudwatch-metrics-cost/

さいごに

本記事では、AWS CloudWatch エージェントを用いて、EC2 インスタンスのメモリ使用率・スワップ使用率 +α を表示するための設定手順を確認しました。

メモリ使用率が高い場合、OOM キラー等が発生する可能性があります。

そのような場合、垂直/水平スケーリングや、スワップの作成が対策として挙げられます。
前回の記事では、実際に OOM キラーのログ確認と、Swap 領域の作成を行いました。
興味があればぜひご参照ください。

https://blog.kuds.win/aws/ec2-elb-health-check-oom-swap/
【EC2 – ELB】ヘルスチェック失敗の原因と対策: OOM と Swap

以上です。

コメント