AWS
CloudWatch
OpsJAWSDay 19

新しいCloudWatch AgentでEC2インスタンスのメモリ使用率を監視する

この記事は OpsJAWS Advent Calendar 2017 19日目の記事です。

はじめに

先日、新しいCloudWatch Agentが登場しました。
https://aws.amazon.com/jp/about-aws/whats-new/2017/12/amazon-cloudwatch-introduces-a-new-cloudwatch-agent-with-aws-systems-manager-integration-for-unified-metrics-and-logs-collection/

これまでディスク使用量やメモリ使用率といった仮想マシン上のメトリックについては
CloudWatch Monitoring Scripts 等 を設定してCloudWatchにデータを送信する必要がありました。
新しい Agent ではこれらのゲストOS上のメトリックについても収集できるようになっています。

収集可能なメトリックの一覧については以下のドキュメントを参照ください。
稼働対象(EC2 or On-premises)、OS、ログ取得レベルによっても取得出来る内容が異なります。
http://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CW_Support_For_AWS.html#metrics-collected-by-CloudWatch-agent

やってみる

実際にAmazon Linuxサーバのメモリ使用率の監視設定を行ってみます。

IAMロールの作成

CloudWatch Agent を実行する EC2 インスタンスにアタッチする IAM ロールを事前に作成しておきます。

まず、以下の内容でポリシーを作成します。ポリシー名は任意に設定します。

CloudWatchAgentAdminPolicy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "CloudWatchAgentAdminPolicy",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "cloudwatch:PutMetricData",
                "ec2:DescribeTags",
                "logs:DescribeLogStreams",
                "logs:CreateLogGroup",
                "logs:PutLogEvents",
                "ssm:GetParameter",
                "ssm:PutParameter"
            ],
            "Resource": "*"
        }
    ]
}

新規のEC2用のIAMロールを作成し、上記のポリシーをアタッチします。
Agent の設定は AWS Systems Manager のパラメータストアに格納し、他サーバに展開させることが可能です。
上記例ではパラメータストアへの書き込みのため、ssm:PutParameter権限を付与しています。
通常、全てのインスタンスがパラメータストアへの書き込み権限を持つ必要はありませんので、
上記とは別に ssm:PutParameter を除いた一般用のIAMロールを別途作成することが望ましいです。

image.png

CloudWactch Agent のインストール

先ほど作成したIAMロールを、インストール対象のEC2インスタンスにアタッチします。

Agent のインストール方法は以下の2通りです。

  • AWS Systems Manager(ssm)によるインストール
  • CLI によるインストール

運用を考えると ssm でインストールを行うほうが楽ですが、
今回はAgentの基本的な操作を覚えるために、EC2インスタンスにログインし、CLIでインストールを行いました。

$ wget https://s3.amazonaws.com/amazoncloudwatch-agent/linux/amd64/latest/AmazonCloudWatchAgent.zip
$ unzip AmazonCloudWatchAgent.zip
$ sudo ./install.sh

プロキシを設定する必要がある環境の場合は、
/opt/aws/amazon-cloudwatch-agent/etc/common-config.tomlに設定します。

common-config.tml
[proxy]
http_proxy = "{http_url}"
https_proxy = "{https_url}"
no_proxy = "{domain}"

Agent 設定

Agent 設定ファイルの作成

Agent の設定ファイルは、収集するメトリックやログファイルを指定したファイルです。
JSONで作成されたファイルをAgent 起動時にTOMLに変換する形になります。
手動で作成することもできますが、ここではウィザードを使用して作成します。

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

ウィザードでは以下を設定します。カッコ内は今回選択した内容です。
収集間隔は最短で1秒を指定できるようになっていますが、今回は60秒を選択しました。

  • インストール先のOS(Linux)
  • インストール先がEC2かオンプレミスか(EC2)
  • ホストのメトリクスを収集するか(yes)
  • CPUコア毎のメトリクスを収集するか(yes)
  • EC2ディメンションを全てのメトリクスに追加するか(yes)
  • メトリクスを収集する間隔(60s)
  • メトリクスの収集レベル(Standard)

ログファイル監視対象の設定

既にCloudWatch Logs を使用している環境の場合は、引き続きこのウィザードで設定を移行できます。
移行を行わない場合も監視対象のログファイルのパスを指定し、追加することができます。
ここでは デフォルト選択の syslog(/var/log/messages) を対象に指定し、ログの監視設定を完了します。

設定ファイルは /opt/aws/amazon-cloudwatch-agent/bin/config.json に保存されます。
今回、最終的な設定内容は以下のようになります。

config.json
{
    "logs": {
        "logs_collected": {
            "files": {
                "collect_list": [
                    {
                        "file_path": "/var/log/messages",
                        "log_group_name": "messages"
                    }
                ]
             }
         }
    },
    "metrics": {
        "append_dimensions": {
            "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
            "ImageId": "${aws:ImageId}",
            "InstanceId": "${aws:InstanceId}",
            "InstanceType": "${aws:InstanceType}"
        },
        "metrics_collected": {
            "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
            },
            "swap": {
                "measurement": [
                    "swap_used_percent"
                ],
                "metrics_collection_interval": 60
            }
        }
    }
}

パラメータストアへの保存

ウィザードの最後に設定ファイルをSSM パラメータストアに保存するかの確認があります。
選択肢は全てデフォルトで問題ありません。

  • 設定ファイルを SSM パラメータストアに保存するか(yes)
  • パラメータストア名(agent-config-linux)
  • 保存先リージョン(ap-northeast-1)
  • AWSクレデンシャルの選択(From SDK)

aws cliで手動アップロードすることも可能です。

$ cd /opt/aws/amazon-cloudwatch-agent/bin/
$ aws ssm put-parameter --name "agent-config-linux" --type "String" --value file://config.json

AWS Systems Manger のコンソールを確認すると、パラメータストアが保存されていることが確認できます。

image.png

Agentの起動

SSMパラメータストアに保存した設定ファイルでAgentを起動してみます。

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c ssm:agent-config-linux -s
/opt/aws/amazon-cloudwatch-agent/bin/config-downloader --output-file /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json --download-source ssm:agent-config-linux --mode ec2 --config /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml
Successfully fetched the config from parameter store ssm:agent-config-linux and saved in /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
Start configuration validation...
/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.
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
amazon-cloudwatch-agent start/running, process 2811

メッセージの内容から、JSONの設定ファイルが
/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml として保存されていることがわかります。

ログファイルは /opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log に出力されています。
またAgentインストール時にサービス登録が行われていますが、

  • common-config.toml
  • amazon-cloudwatch-agent.toml

の2ファイルが存在しないと、OS起動時にAgentが正常に起動できないようです。

ステータス確認、および終了コマンドは以下のように行うことができます。
また amazon-cloudwatch-agent.toml が作成されている状態であれば、2回目以降の起動では
設定ファイルのフェッチは不要です。

# ステータス確認
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status
{
  "status": "running",
  "starttime": "2017-12-19T01:43:56+0000",
  "version": "1.73.9"
}

# 停止
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a stop
amazon-cloudwatch-agent stop/waiting

# 起動
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a start
amazon-cloudwatch-agent start/running, process 3044

監視設定

コンソール上で取得したメトリックの確認および、アラームの設定を行います。

メトリックの確認

カスタム名前空間の CWAgent を選択します。
少しわかりにくいですが、それぞれのメトリックを確認できます。

  • ImageId, InstanceId, InstanceType, device, fstype, path: Disk
  • ImageId, InstanceId, InstanceType, cpu: CPU
  • ImageId, InstanceId, InstanceType, name: Disk I/O
  • ImageId, InstanceId, InstanceType: Memory

image.png

ImageId, InstanceId, InstanceType を選択すると、mem_user_percent および swap_user_percent の値を確認することができました。

image.png

アラームの設定

特に変わった手順はありません。
グラフ化したメトリクスからアクションのアラームの作成を選択します。
image.png

アラーム名、閾値、間隔、通知先等を任意に設定し、アラームの作成を押下します。
image.png

以上でメモリ使用率の監視設定が完了しました。
参考になれば幸いです。