cloudwatchカスタムメトリクスの値をawscliで取得する方法

前提

・検証OS:Redhat Linux 8.2
・検証用EC2にCloudWatchAgentServerPolicy権限が付与されること

現象

AWS CLIでcloudwatchのメトリクス取得したく検証しましたが、
標準メトリクス(CPUUtilization)を取得できますが、カスタムメトリクスが取得できない。エラーメッセージもでない。
まず、標準メトリクスとカスタムメトリクスの取得を比較しながら、説明します。

標準メトリクスを取得(CLI)

【AWS公式より抜粋】
公式(特定のリソースの統計を取得する)の実行コマンドを参考に実行してみました。データを取得できました。
コマンド:

aws cloudwatch get-metric-statistics --namespace AWS/EC2 --metric-name CPUUtilization \
--dimensions Name=InstanceId,Value=i-064c12df5219b073a --statistics Maximum \
--start-time 2021-05-25T23:18:00 --end-time 2021-05-28T23:18:00 --period 360

実行例:

aws cloudwatch get-metric-statistics --namespace AWS/EC2 --metric-name CPUUtilization \
> --dimensions Name=InstanceId,Value=i-064c12df5219b073a --statistics Maximum \
> --start-time 2021-05-25T23:18:00 --end-time 2021-05-28T23:18:00 --period 360
{
    "Label": "CPUUtilization",
    "Datapoints": [
        {
            "Timestamp": "2021-05-26T15:54:00+00:00",
            "Maximum": 2.20338983050847,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2021-05-26T15:36:00+00:00",
            "Maximum": 54.5762711864407,
            "Unit": "Percent"
        },
        :
        省略

※参考[1]

カスタムメトリクスを取得(CLI)

AWSコンソール上で確認できますが、CLIを実行しても、データを取得できない。(エラーメッセージもでない)
※公式(特定のリソースの統計を取得する)の実行コマンドを参考に実行してみました。データを取得できませんでした。

コマンド:

aws cloudwatch get-metric-statistics \
--namespace CWAgent \
--metric-name mem_used_percent \
--dimensions Name=InstanceId,Value=i-064c12df5219b073a \
--statistics Maximum \
--start-time 2021-05-25T23:18:00 --end-time 2021-05-28T23:18:00 --period 360

実行例:

aws cloudwatch get-metric-statistics \
> --namespace CWAgent \
> --metric-name mem_used_percent \
> --dimensions Name=InstanceId,Value=i-064c12df5219b073a \
> --statistics Maximum \
> --start-time 2021-05-25T23:18:00 --end-time 2021-05-28T23:18:00 --period 360
{
    "Label": "mem_used_percent",
    "Datapoints": []
}

カスタムメトリクスを取得できない原因

【ディメンション】
メトリクスが複数のディメンションで作成されている場合、そのメトリクスのデータポイントは、設定されたすべてのディメンションを指定することによってのみ取得できます。
※参考[2]

解決方法

namespaceの確認(aws cloudwatch list-metrics)

コマンド:

aws cloudwatch list-metrics --namespace CWAgent

実行例:

aws cloudwatch list-metrics --namespace CWAgent
{
    "Metrics": [
        {
            "Namespace": "CWAgent",
            "MetricName": "mem_used_percent",
            "Dimensions": [
                {
                    "Name": "InstanceId",
                    "Value": "i-064c12df5219b073a"
                },
                {
                    "Name": "ImageId",
                    "Value": "ami-00eedaa8f7f2a6440"
                },
                {
                    "Name": "InstanceType",
                    "Value": "t2.micro"
                }
            ]
        },
        :
        省略

すべてのディメンションを指定することで、取得できました。

コマンド:

aws cloudwatch get-metric-statistics \
--namespace CWAgent \
--metric-name mem_used_percent \
--dimensions Name=InstanceId,Value=i-064c12df5219b073a Name=ImageId,Value=ami-00eedaa8f7f2a6440 Name=InstanceType,Value=t2.micro \
--statistics Maximum \
--start-time 2021-05-25T23:18:00 --end-time 2021-05-28T23:18:00 --period 360

実行例:

aws cloudwatch get-metric-statistics \
> --namespace CWAgent \
> --metric-name mem_used_percent \
> --dimensions Name=InstanceId,Value=i-064c12df5219b073a Name=ImageId,Value=ami-00eedaa8f7f2a6440 Name=InstanceType,Value=t2.micro \
> --statistics Maximum \
> --start-time 2021-05-25T23:18:00 --end-time 2021-05-28T23:18:00 --period 360
{
    "Label": "mem_used_percent",
    "Datapoints": [
        {
            "Timestamp": "2021-05-26T16:12:00+00:00",
            "Maximum": 29.210169799849684,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2021-05-26T16:42:00+00:00",
            "Maximum": 33.92071539017583,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2021-05-26T16:00:00+00:00",
            "Maximum": 28.089500366216196,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2021-05-26T16:30:00+00:00",
            "Maximum": 29.332720579435406,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2021-05-26T16:36:00+00:00",
            "Maximum": 33.90731139865864,
            "Unit": "Percent"
:
省略

補足:カスタムメトリクスの設定有効化手順

設定ファイル

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
                        }
                }
        }
}

設定ファイルを有効化

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

まとめ

標準メトリクス(CPUUtilization)とカスタムメトリクス(mem_used_percent)を比較しました。結論から言うと、
メトリクスを取得する前に、必ず「aws cloudwatch list-metrics」でディメンションの数を確認しましょう。

【単一のディメンション】
例:
・CPUUtilization:–dimensions にInstanceIdのみで取得できます。
【複数のディメンション】
例:
・mem_used_percent
–dimensions に設定されたすべてのディメンションを指定することによってのみ取得できます。

参考

[1]
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/US_SingleMetricPerInstance.html
[2]
https://aws.amazon.com/jp/premiumsupport/knowledge-center/cloudwatch-getmetricstatistics-data/

Last modified: 2021-05-27

Author