AWS

Amazon CloudWatchでEC2のディスク使用率を監視する

ClowdWatchにはあらかじめEC2用のメトリクス(チェックできる値)が用意されていますが、残念ながらディスク使用率のメトリクスはありません。

EC2のディスク使用率をCloudWatchで監視するには、EC2インスタンスにCloudWatchエージェントをインストールする必要があります。

CloudWatchエージェントを介してEC2の情報をCloudWatchで取得するような感じです。

その手順です。
※基本的にAWS公式の手順書通りです。

やること

  1. EC2インスタンスにCloudWatchエージェントをインストール

    1. CloudWatchエージェント用のIAMロール作成
    2. インスタンスにIAMロールをアタッチ
    3. CloudWatchエージェントをインストール
  2. CloudWatchエージェントの設定ファイルを作成

  3. CloudWatchエージェントを起動

1. EC2インスタンスにCloudWatchエージェントをインストール

1. CloudWatchエージェント用のIAMロール作成

CloudWatchエージェントがEC2の情報にアクセスできるように、IAMロールを作成します。

余談ですが、AWSのサービスを扱う上で ロール は非常に重要な要素です。AWSomeDayに行ったときにAWSの人が説明していたフレーズでわかりやすかったのは、 ロール = 権限が付いたヘルメット という考え方です。余談ですが。

まずポリシーを作成します。ポリシーは、ロールに付与する権限の情報 のようなイメージです。
マネジメントコンソールで IAM > ポリシー > ポリシーの作成 と進みます。

json型式で下記のように指定します。

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

sc 2018-03-01 16.33.45.png

次に進んで名前の入力と、内容を確認します。

sc 2018-03-01 16.33.57.png

これでポリシーが作成できました。

続いて、ロールを作成します。
マネジメントコンソールで IAM > ロール > ロールの作成 と進みます。

サービスとユースケースの選択では、EC2EC2 Role for Simple System Manager を選択します。

sc 2018-03-01 16.35.28.png

選択したユースケースにデフォルトで付与されているポリシーが表示されるので、そのまま進みます。

sc 2018-03-01 16.37.54.png

適当に名前を付けて保存します。

sc 2018-03-01 16.38.14.png

続いて、いま作成したロールに、先ほど作成したポリシーをアタッチします。

ロールの一覧から作成したロールを選択して、ポリシーのアタッチ ボタンを押します。

検索窓で先ほど作成したポリシーを検索・選択して、アタッチします。

sc 2018-03-01 16.38.55.png

sc 2018-03-01 16.39.18.png

以上でロールの作成が完了しました。

2. インスタンスにIAMロールをアタッチ

作成したロールを、監視したいインスタンスにアタッチします。

マネジメントコンソールでEC2一覧を表示し、該当のインスタンスを選択してアクションから インスタンスの設定 > IAMロールの割り当て/置換 と進みます。

sc 2018-03-01 16.51.50.png

作成したロールをアタッチします。

3. CloudWatchエージェントをインストール

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

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

作成方法は色々ありますが、ウィザードで作成してみます。

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

コマンドを叩くと対話形式で色々と選択していきます。選ぶ時は数字キーを使います。
=============================================================
= 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
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
Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:
1
Do you want to monitor cpu metrics per core? Additional CloudWatch charges may apply.
1. yes
2. no
default choice: [1]:
2
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]:
2
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
Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:
2
Current config as follows:
{
    "metrics": {
        "metrics_collected": {
            "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"
                ],
                "metrics_collection_interval": 60,
                "resources": [
                    "*"
                ]
            },
            "mem": {
                "measurement": [
                    "mem_used_percent"
                ],
                "metrics_collection_interval": 60
            },
            "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
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
Do you want to monitor any log files?
1. yes
2. no
default choice: [1]:
2
Saved config file to /opt/aws/amazon-cloudwatch-agent/bin/config.json successfully.
Current config as follows:
{
    "metrics": {
        "metrics_collected": {
            "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"
                ],
                "metrics_collection_interval": 60,
                "resources": [
                    "*"
                ]
            },
            "mem": {
                "measurement": [
                    "mem_used_percent"
                ],
                "metrics_collection_interval": 60
            },
            "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]:
2
Program exits now.

作成された設定ファイルは直接viなどで開いて修正することも可能です。
設定ファイルを修正した場合は、CloudWatchエージェントを再起動する必要があります。

3. CloudWatchエージェントの開始

設定ファイルを作成したら、エージェントを起動する必要があります。
コマンドを叩いて起動します。

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

ステータスの確認

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status
{
  "status": "running",
  "starttime": "2018-03-01T08:25:58+0000",
  "version": "1.208.0"
}

CloudWatchでメトリクスの確認

エージェントを開始すると、あとは勝手にエージェントがCloudWatchにデータを送ってくれます。
マネジメントコンソールでCloudWatchの メトリクス を確認してみると、CWAgent という名前空間が新たにできています。

sc 2018-03-01 17.29.08.png

その中の device, fstype, host, path には、EC2インスタンス内のファイルシステムとそのパスが一覧で表示されており、その中の メトリクス名 dist_used_percent でストレージの使用率をモニタリングできます。

sc 2018-03-01 17.33.08.png

あとはこのメトリクスに対してアラームを設定してSNSで通知すればOKです。

SNSでの通知については前に書いた方法と同じです。

https://qiita.com/michimani/items/199c1df46f539b77369b