CloudWatchエージェントでEC2インスタンスのカスタムメトリクスを取得する


EC2のCPU使用率やネットワークI/OなどはCloudWatchの標準メトリクスで監視可能ですが、メモリやディスクの使用率などはカスタムメトリクスを使用しなければ取得することができません。
今回はCloudWatch エージェントを使用したカスタムメトリクスの収集方法を紹介します。

カスタムメトリクス

EC2インスタンスのカスタムメトリクスを取得する方法は以下の方法があります。

  • CloudWatch エージェントを使用する。
  • AWSが配布しているCloudWatch Monitoring Scriptを使用する。
  • AWS SDKを使用してスクリプトを自作する。
  • AWS CLIを使用してスクリプトを自作する。

現在AWSでは、CloudWatch Monitoring Scriptなどのスクリプトを使用するのではなく、CloudWatch エージェントを用いてカスタムメトリクスを収集することを推奨しています。

CloudWatch エージェント

インスタンスにCloudWatch エージェントをインストールすることで、メモリやディスクなどの標準メトリクスでは取得できないメトリクスやログを収集することができます。
CloudWatch エージェントを使用する利点としては以下があげられます。

  • Amazon EC2インスタンスとオンプレミスサーバーからメトリクスとログを収集することができる
  • LinuxとWindowsサーバーからメトリクスを収集することができる
  • 設定値をAWS Systems Managerに保存できるため、複数のサーバーで同じ設定を共有することができる

個人的には3つ目のSystem Managerを使用することで、設定を他のサーバーでも共有できることがおすすめです。複数のサーバーの監視項目設定を一括で変更と反映ができます。

CloudWatch エージェントの導入プロセスは以下のようになります。

  1. IAMロールの作成
  2. インスタンスにCloudWatch エージェントをインストールする
  3. AWS System Managerで設定ファイル(パラメーター)を作成する
  4. CloudWatch エージェントを起動する

IAMロールの作成

まずがIAMロールを作成します。
CloudWatch エージェントがCloudWatchにメトリクスを書込み、CloudWatch エージェントがEC2インスタンス及びSystem Managerと通信するために必要なアクセス権限を作成する必要があります。
ロールに設定するポリシーは以下の3つです。

  • CloudWatchAgentServerPolicy
  • AmazonEC2RoleforSSM
  • AmazonSSMReadOnlyAccess

ロール名は「CloudWatchAgentRole」とします。
IAMロール作成は割愛します。以下のサイトを参考にしてください。

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

インスタンスにCloudWatch Agentをインストールする

EC2インスタンスはRed Hat Enterprise Linux 7.5 (HVM), SSD Volume Typeを利用します。

  • instance Type : t2.micro
  • IAM Role : CloudWatchAgentRole

インスタンスには先ほど作成したIAMロールをアタッチします。
インストールを行うために、wgetunzipが必要なのでインストールします。

$ sudo yum install wget
$ sudo yum install unzip

次にCloudWatch エージェントをダウンロードし解凍とインストール用のシェルを起動します。

$ sudo mkdir /media/install
$ sudo mkdir /usr/share/cloudwatchagent
$ cd /media/install
$ sudo wget https://s3.amazonaws.com/amazoncloudwatch-agent/linux/amd64/latest/AmazonCloudWatchAgent.zip
$ sudo unzip AmazonCloudWatchAgent.zip -d /usr/share/cloudwatchagent
$ cd /usr/share/cloudwatchagent
$ sudo ./install.sh

シェルを実行するとRPM経由でCloudWatch Agentが/opt/aws/amazon-cloudwatch-agentのディレクトリにインストールされます。

$ cd /opt/aws/amazon-cloudwatch-agent
$ ls
bin  doc  etc  LICENSE  logs  NOTICE  RELEASE_NOTES  THIRD-PARTY-LICENSES  var

AWS System Managerで設定ファイルを作成する

AWS System Mangerで収集するメトリクスとその収集間隔を設定します。今回はメモリ使用率(mem_used_percent)とディスク使用率(disk_used_percent)を収集します。
設定はJSON形式で記述します。
System Managerのコンソールからパラメーターストアに移動しパラメータの作成を行います。

以下の設定を行い、パラメータの作成を押すと完了です。

  • 名前 : CloudWatchAgentParemeter
  • 説明 : Parameter for CloudWatchAgent
  • タイプ : 文字列
  • 値 : 以下のJson形式の文字列を張り付け
{
    "agent": {
        "metrics_collection_interval": 60,
        "region": "ap-northeast-1",
        "logfile": "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log",
        "debug": false
    },
    "metrics": {
        "namespace":"CustmeMetrics Sample",
        "append_dimensions": {
            "ImageId": "${aws:ImageId}",
            "InstanceId": "${aws:InstanceId}",
            "InstanceType": "${aws:InstanceType}"
        },
        "metrics_collected": {
            "disk": {
                "measurement": [
                    "used_percent"
                ],
                "metrics_collection_interval": 60,
                "resources": [
                    "*"
                ]
            },
            "mem": {
                "measurement": [
                    "mem_used_percent"
                ],
                "metrics_collection_interval": 60
            }
        }
    }
}

各項目について簡単に紹介しますが、設定ファイルの記述方法は以下のサイトに詳しく掲載されています。

CloudWatch エージェント設定ファイルを手動で作成または編集する

CloudWatch エージェントの設定ファイルは、agent、metrics、logsの3つのセクションからなるJSONファイルです。

  • agent : エージェントの全体的な設置に関するフィールド
  • metrics : 収集するカスタムメトリクスの項目と収集間隔を設定するフィールド
  • logs : CloudWatch Logsに発行されるログファイルの設定をするフィールド

今回はログファイルの収集は行わないので省略しています。
metricsセクションでは収集するカスタムメトリクスについて以下の設定を行っています。

  • namespace : CloudWatchに表示されるメトリクスの名前空間の設定
  • append_dimensions : メトリクスに付与するタグの設定
  • metrics_collected : 収集するメトリクスの項目とその収集間隔の設定

カスタムメトリクスの収集の設定を行うmetrics_collectedタグについて、インスタンスのメモリ情報の取得を例に紹介します。

  • mem : メモリを取得する設定。ディスクの情報を取得する際はdiskと記述する。
  • measurement : 取得するメトリクス名を設定。CloudWatch エージェントにより収集されるメトリクスのメトリクス名を指定します。
  • metrics_collection_interval : メトリクスの取得間隔を秒単位で設定します。

CloudWatch エージェントを起動する

設定ファイルをSystem Managerで作成し終えると、あとはエージェントをインストールしたインスタンスで設定ファイルを指定してAgentを実行するのみです。
CloudWatch Agentの起動は以下のコマンドで行います。

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

-a fetch-configオプションでSystem Managerのパラメーターストアから設定ファイルを読み込むように指定し、-cオプションで設定ファイルを指定しています。指定方法は、ssm:"パラメーター名"となります。
以下のようなログが出力されれば成功です。

/opt/aws/amazon-cloudwatch-agent/bin/config-translator --input /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json --output /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml --mode ec2 --config /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml
Valid Json input schema.
No log configuration found.
Configuration validation first phase succeeded
/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

CloudWatch エージェントを停止するには以下のコマンドを実行します。

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a stop

確認

CloudWatchのコンソールからメトリクスに移動しカスタム名前空間を確認してください。
設定ファイルのmetricsフィールドのnamespaceタグで設定した名前空間が作成されています。

  • メモリ使用率

  • ディスク利用率

まとめ

CloudWatch エージェントを使用してEC2インスタンスのカスタムメトリクスを取得する方法を紹介しました。
標準メトリクスと同様に、取得したメトリクスに対してアラームを設定すればカスタムメトリクスの監視を行うことができます。
スクリプトを使用または自作するよりも、設定が簡単でAutoScalingなどの冗長性にも簡単に対応できると思います。
また、CloudWatch エージェント自体のサーバーへの負荷も低いので安心して使用できると思います。