こんにちは、インフラエンジニアの綿引です。

「CloudWatch で監視したいけどメモリ・ディスク使用率の監視項目がないじゃない、、」
と悩まれた方もいらっしゃるのではないでしょうか?

そこで今回は CloudWatch で EC2 のメモリ・ディスク使用率を監視する、ということをやってみたいと思います。

対象の方は以下のような方でしょうか。

 

  • 監視運用を導入するまでアラートをウォッチしてしておきたい
  • コストを抑えるためスモールスタートで監視を実施したい

 

また以下をご参考にいただければ、アラームも Slack に飛ばせるので、一緒に見て頂けると嬉しいです。

参考 : Amazon CloudWatch + Amazon SNS + AWS Chatbot を使ってアラームを Slack に通知してみる

目次

1. CloudWatch エージェント について
 1.1. CloudWatch エージェント のできること
 1.2. CloudWatch Logs について
2. CloudWatch エージェントのインストール
 2.1. IAM ロールを作成する
  2.1.1. CloudWatchAgentServerRole の作成
  2.1.2. CloudWatchAgentAdminRole の作成
 2.2. インストールおよび設定
  2.2.1. SSM エージェントのインストール
  2.2.2. CloudWatch エージェントのインストール
  2.2.3. CloudWatch エージェントの設定ファイル作成
 2.3. エージェントの起動
3. CloudWatch メトリクスの確認
4. エージェント起動時のエラーについて
5. 最後に

 

1. 統合 CloudWatch エージェント について

まず 統合 CloudWatch エージェント についてです。

統合 CloudWatch エージェントとは、サーバにインストールする CloudWatch のエージェント (パッケージ) のことです。

これをインストールすることでカスタムメトリクスが取得できるようになったり、CloudWatch Logs にログを送信できるようになります。

 

1.1. CloudWatch エージェント のできること

CloudWatch エージェント のできることとしては以下になります。

 

  • EC2 インスタンスから標準メトリクスより多くのメトリクスを収集できるようになる
  • サーバのログを収集できる
  • オンプレミスなどのAWS によって管理されていないサーバからもメトリクスを収集できる

 

また収集できるメトリクスの詳細は以下に記載してあります。

参考 : CloudWatch エージェントにより収集されるメトリクス

 

1.2. CloudWatch Logs について

統合 CloudWatch エージェント をインストールすると、対象サーバから CloudWatch Logs に対してログを送信できるようになります。

CloudWatch Logs についてはまた別の機会に紹介できればと思いますが、システムログや Webサーバ (Apache・Nginx) のログも監視できる強力な監視ツールです。

 

2. CloudWatch エージェントのインストール

では早速、CloudWatch エージェントを導入していきます。

まず CloudWatch エージェントをインストールするには、以下の3種類の方法があります。

 

  1. コマンドラインを使用する
  2. AWS Systems Manager を使用する
  3. AWS CloudFormation を使用する

 

参考 : CloudWatch エージェントのインストール

またサポートされる OS などは以下に記載されているため、実施する前にご確認いただけると混乱せずに進められると思います。

参考 : CloudWatch エージェントを使用して Amazon EC2 インスタンスとオンプレミスサーバーからメトリクスとログを収集する

今回は Systems Manager からインストールしてみたいと思います。

使用するサービスと用途は以下です。

  1. EC2 (ホスト名 : cloudwatch-test)
    – CloudWatch エージェントをインストールするサーバ
  2. IAM
    – EC2 から CloudWatch にメトリクスの書き込みを行うためのロールを作成
    – AWS Systems Manager のパラメータストアに書き込みを行うためのロールを作成
  3. AWS Systems Manager
    – Run Command により CloudWatch エージェントのインストール・起動を実施
    – CloudWatch エージェントの設定ファイルをパラメータストアに保存

 

2.1. IAM ロールを作成する

まずは以下のマニュアルに沿って EC2 にアタッチする IAM ロールを作成していきます。

参考 : CloudWatch エージェントで使用する IAM ロールおよびユーザーを作成する

今回は以下の2種類のロールを作成します。

 

  • CloudWatchAgentServerRole
  • CloudWatchAgentAdminRole

 

どちらのロールも EC2 にアタッチする CloudWatch に書き込み許可を与えるためのロールですが、2つ目の CloudWatchAgentAdminRole に関しては、 CloudWatch エージェントの設定ファイルをパラメータストアに書き込む権限を持っています。

使い分けとしては基本は1つ目の CloudWatchAgentServerRole をアタッチしておくが、パラメータストアへの書き込みが必要な時は2つ目の CloudWatchAgentAdminRole を使用するといった形です。

1台管理用のサーバをたてて、それだけ CloudWatchAgentAdminRole を付与するというやり方も良いかと思います。

詳細は以下をご確認頂けると幸いです。

参考 : AWS Systems Manager パラメータストア

 

2.1.1. CloudWatchAgentServerRole の作成

まずは1つ目の CloudWatchAgentServerRole から作成していきます。

マネジメントコンソールから IAM を選択し、ロールを選択した後、 「ロールの作成」 を押下します。

「信頼されたエンティティの種類を選択」 にて 「AWS サービス」 を選択、「ユースケースの選択」 にて 「EC2」 を選択して 「次のステップ: アクセス権限」 を押下します。

次にポリシーの選択ですが、以下を選択し、 「次のステップ: タグ」 を押下します。

 

  • CloudWatchAgentServerPolicy
  • AmazonSSMManagedInstanceCore

 

次ページのタグは任意です。

ロール名はユーザーガイドに沿って 「CloudWatchAgentServerRole」 にします。

後は設定したポリシーを確認して、最後に 「ロールの作成」 を押下します。

次に CloudWatchAgentAdminRole の作成です。

 

2.1.2. CloudWatchAgentAdminRole の作成

作成の仕方は1つ目とほぼ変わらないので上記を参考作っていただきたいのですが、ポリシーの 「CloudWatchAgentServerPolicy」 を 「CloudWatchAgentAdminPolicy」 に変更します。

CloudWatchAgentAdminRole のポリシーとしては以下になります。

 

  • CloudWatchAgentAdminPolicy
  • AmazonSSMManagedInstanceCore

 

ロール名は 「CloudWatchAgentAdminRole」 にしました。

最後に対象の EC2 に上記のロールをアタッチします。

今回は前述した通りパラメータストアに書き込みを行うため 「CloudWatchAgentAdminRole」 をアタッチします。

EC2 のコンソール画面を開き、対象のインスタンスのチェックボックスを選択、 「アクション」 → 「インスタンスの設定」 → 「IAM ロールの割り当て/置き換え」 を押下します。

s

先ほど作成した 「CloudWatchAgentAdminRole」 を選択し、最後に 「適用」 を押下します。

これで IAM の作業は完了です。

 

2.2. インストールおよび設定

次は CloudWatch エージェント の設定に移ります。

前述の通り AWS Systems Manager にて CloudWatch エージェントをインストールするのですが、Systems Manager でインストールするには、対象サーバに SSM エージェントのインストール が必要となります。

SSM エージェント (AWS Systems Manager エージェント) とは、CloudWatch エージェントとは別の、AWS Systems Manager のエージェントのことです。

参考 : SSM エージェント について

この SSM エージェントをサーバにインストールすると、EC2・オンプレミスに関わらず AWS Systems Manager の コンソールから、情報を監視したり、リモートでコマンドを実行することが可能になります。

CloudWatch エージェントを使用するには SSM のバージョンが 2.2.93.0 以降である必要があったり、OS によってはデフォルトでインストールされてたりするので、以下から事前に導入されているかご確認いただいた方が宜しいかと思います。

参考 : Linux の EC2 インスタンスで SSM エージェント をインストールして設定する

 

2.2.1. SSM エージェントのインストール

それでは SSM エージェントをインストールしていきます。手順としては対象サーバにログインし、“yum” でインストールします。

以下のコマンドを実行します。

 
$ sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm

次にプロセスが立ち上がっているかを確認します。

 
$ sudo systemctl status amazon-ssm-agent

最後に自動起動も有効にしておきましょう。

 
$ sudo systemctl enable amazon-ssm-agent

これで SSM エージェントのインストールは完了です。

 

2.2.2. CloudWatch エージェントのインストール

SSM エージェントをインストールしたので、Systems Manager から操作ができるようになりました。

続いて、CloudWatch エージェント をインストールしていきましょう。

まずは 「AWS Systems Manager」 から 「Run Command」 を選択します。

次に 「コマンドを実行する」 を押下します。

|

次に 「AWS-ConfigureAWSPackage」 を検索し、表示された項目にチェックをつけます。

そのまま下に移動し 「コマンドのパラメータ」 の項目で以下を設定します。

・Action : Install
・Name : AmazonCloudWatchAgent

次に 「ターゲット」 の項目にて 「インスタンスを手動で選択する」 を選択し、
対象のインスタンスにチェックをつけます。

最後に 「実行」 を押下します。

無事成功しました。
これで CloudWatch エージェントのインストールは完了です。

 

2.2.3. CloudWatch エージェントの設定ファイル作成

インストールが完了したので、CloudWatch エージェントを起動させていきたい所ですが、起動には、前述の通りCloudWatch エージェントの設定ファイルを作成する必要があります。

設定ファイルの作成の仕方は以下の2種類の方法があります。

1. ウィザードを使用して CloudWatch エージェント設定ファイルを作成する
2. CloudWatch エージェント設定ファイルを手動で作成または編集する

今回は 1. のウィザードを使用して作成していきます。
対象サーバにログインし、以下コマンドを実行します。

 
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

ここからは対話型になりますので、一つずつ確認していきます。

まずは OS を選択します。今回は Linux なので、「1」 にします。

尚、何も入力せずに 「Enter」 を押すと 「default choice」 の設定になりますので
「default choice」 と設定が一緒であれば、何も入力せず 「Enter」 を押下で OK です。

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

次は、EC2 か オンプレミスかです。
今回は EC2 なので 「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: [1]:
1

これは CloudWatch エージェントを何のユーザで起動させるかです。
今回はデフォルトの root にするため、「1」 にします。

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

StatsD デーモンをオンにするかなので、「1」を選択します。

尚、StatsD デーモンはデータ収集用のツールで、
カスタムメトリクス用のデータを収集するために使われているようです。

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

StatsD デーモンのポート指定です。
デフォルトの「8125」にします。

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

StatsD デーモンの収集間隔の指定です。
デフォルトの「1」にします。

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

StatsD デーモンによって収集されるデータの集約間隔です。
これもデフォルトの「4」にします。

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

CollectD を使ってメトリクス収集するかです。
これは yes にするため「1」にします。

尚、CollectD も StatsD デーモンと同様、データ収集用のツールで、
メモリ使用量、稼働時間の統計などを取得しているようです。

 
Do you want to monitor metrics from CollectD?
1. yes
2. no
default choice: [1]:
1

CPU やメモリも監視するか、なので「1」にします。

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

CPU のコアごとに監視するかです。
監視はそこそこしたいですが、追加料金が適用される場合があるようです。

詳細はわかりませんでしたが、コアごとにメトリクスが収集されるため、
その分メトリクス数が多くなるからということでしょうか?

正確にはわかりませんが、今回は “no” の「2」を選択します。

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

EC2 の イメージID や インスタンスID なども項目に追加したいかです。
デフォルトの「1」にします。

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

メトリクスを何秒間隔で収集するかです。
デフォルトの「4」にします。

 
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

これは AWS 側で事前定義された「メトリクスセット」を選択します。
今回は “Advanced” にしてみようと思いますので、「3」を指定します。

注意点としては各メトリクスセットで収集されるメトリクスが異なるので、
事前に以下をチェックして頂けると宜しいかと思います。

参考 : CloudWatch エージェントの事前定義されたメトリクスセット

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

今までの設定が出力され、問題ないかと聞かれますので “yes” の「1」を指定します。

 
Current config as follows:
{
    "agent": {
        "metrics_collection_interval": 60,
        "run_as_user": "root"
    },
    "metrics": {
        "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,
                "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
            },
            "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]:
1

次は “CloudWatch Log Agent の設定ファイルはあるか” です。

対象サーバに “CloudWatch Logs エージェント” をインストールしている状態であれば、
設定ファイルをインポートできるようです。

CloudWatch Logs エージェントに関しては以下をご確認いただきたいですが、
廃止予定なので、もしご使用であればタイミングで移行したいですね。

参考 : CloudWatch Logs の使用開始

今回は設定がないため「2」を指定します。

 
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

ログファイルを監視するかなので、今回は「2」を指定します。
CloudWatch Logs にログを送りたい場合はこちらで設定します。

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

また設定内容が出力され、本設定ファイルを SSM パラメータストアに保存するかの問いです。
前述の通り、パラメータストアに保存するので「1」を指定します。

 
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": {
        "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,
                "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
            },
            "statsd": {
                "metrics_aggregation_interval": 60,
                "metrics_collection_interval": 10,
                "service_address": ":8125"
            },
            "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]:
1

パラメータストアに保存する際の、”パラメータストアの名前”を指定します。
デフォルトの「AmazonCloudWatch-linux」にします。

 
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

設定ファイルをパラメータストアのどのリージョンの保存するかです。
「ap-northeast-1」にします。

 
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]
ap-northeast-1

最後にどの IAM ユーザ・ロールを使用するかです。
ここでパラメータストアへの書き込み権限がなければエラーとなります。

既にパラメータストアへの書き込み権限があるロールを EC2 にアタッチ済みのため、
デフォルトの「1」にします。

 
Which AWS credential should be used to send json config to parameter store?
1. XXXXXXXXXXXXXXXX(From SDK)   ←  マスクしております
2. Other
default choice: [1]:
1
Successfully put config to parameter store AmazonCloudWatch-linux.
Program exits now.

これでパラメータストアに CloudWatch エージェントの設定ファイルを保存できました。
正常に終了すれば AWS Systems Manager のパラメータストアに表示されます。

パラメータストアへの書き込みが完了したので、 EC2 にアタッチしている IAM ロールを
セキュリティ強化のため 「CloudWatchAgentServerRole」 に変更しておきましょう。

これで CloudWatch エージェントの設定ファイルの作成が完了しました。

 

2.3. エージェントの起動

CloudWatch エージェントの設定ファイル作成が完了したので、
エージェントの起動を行なっていきます。

AWS Systems Manager から 「Run Command」 を選択し、
検索窓に 「AmazonCloudWatch-ManageAgent」 と入力後、
表示された項目にチェックをつけます。

そのまま下に移動し 「コマンドのパラメータ」 の項目で、
先ほどパラメータストアに保存したファイル名を入力します。

・Optional Configuration Location : AmazonCloudWatch-linux

次に 「ターゲット」 の項目にて 「インスタンスを手動で選択する」 を選択し、
対象のインスタンスにチェックをつけます。

最後に 「実行」 を押下します。
これで起動が完了しました。

 

3. CloudWatch メトリクスの確認

これまでの作業で対象サーバの “メモリ・ディスク使用率” が
CloudWatch に送信されているはずなので確認してみましょう。

コンソールから CloudWatch を選択し、「メトリクス」を押下します。
すると、これまでなかった「CWAgent」という項目が表示されていますので、これを選択します。

「ImageId,InstanceId,InstanceType」 を選択します。

メモリ使用率である「mem_used_percent」がありました。

ディスク使用率も「ImageId,InstanceId,InstanceType,device,fstype,path」に存在します。
これで当初の目的であるメモリ・ディスク使用率を監視することができそうです。

 

4. エージェント起動時のエラーについて

本検証の「CloudWatch エージェントの開始」を実施している際に、
エラーを引いたので共有させていただきます。

Systems Manager の 「Run Command」 から「CloudWatch エージェントの開始」を行った所、
以下のように失敗しました。

詳細を確認した所、以下のエラーメッセージが出力されておりました。

 
======== Error Log ========

2020/04/28 01:28:37 I! AmazonCloudWatchAgent Version 1.237768.0.

2020/04/28 01:28:37 E! Error parsing /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml, open /usr/share/collectd/types.db: no such file or directory

確認した所、パッケージ 「collectd」 がサーバにインストールされていないことが原因でした。
以下 のコマンドで「collectd」をインストールしたら、エージェントの起動が上手くいきました。

 
$ sudo yum install collectd

 

5. 最後に

今回は 「統合 CloudWatch エージェントを導入してメモリ・ディスク使用率を監視する」
をやってみましたが、なかなか骨が折れました。

ただこれで EC2 のモニタリングに必要な情報はそこそこ揃いましたし、
前回のブログと合わせてアラームも設定できるので、より使いやすくはなったと思います。

今後に関しては、CloudWatch Logs を用いたログ監視をやってみたいのと、
アラーム・ダッシュボードの設定もやっていきたいです。

エンジニア募集中

Wedding Parkでは一緒に技術のウエディングパークを創っていくエンジニアを募集しています。
興味のある方はぜひ一度気軽にオフィスに遊びにいらして頂ければと思います。
株式会社ウエディングパークwantedly

Join Us !

ウエディングパークでは、一緒に働く仲間を募集しています!
ご興味ある方は、お気軽にお問合せください(カジュアル面談から可)

採用情報を見る