AWS CLI で CloudWatch の FILL 関数により自動生成される各メトリクスの色を任意の色にしたい時の方法

AWS CLI で CloudWatch の FILL 関数により自動生成される各メトリクスの色を任意の色にしたい

AWS CLI で put-dashboard コマンドを使用して CloudWatch ダッシュボードとグラフウィジェットの作成を行なっていました。
グラフウィジェット内では FILL 関数 [FILL(METRICS(), 0)] を使用していたのですが、この FILL 関数は第一引数の配列の数だけグラフを生成します。
その自動生成する複数のグラフそれぞれに色を指定しようとしました。
しかし、メトリクスの色は color プロパティで指定できるのですが、どうやら配列で指定できず、単一値のみでした。

問題のjson
Copied!
{
  "widgets": [
    {
      "type": "metric",
      "x": 0,
      "y": 0,
      "width": 6,
      "height": 6,
      "properties": {
        "view": "timeSeries",
        "stacked": false,
        "metrics": [
          [
            "AWS/EC2",
            "CPUUtilization",
            "InstanceId",
            "i-xxxxxxxxxxxxxxxxx",
            {
              "id": "m1",
              "color": "#FF80AB"
            }
          ],
          [
            "AWS/EC2",
            "CPUUtilization",
            "InstanceId",
            "i-yyyyyyyyyyyyyyyyy",
            {
              "id": "m2",
              "color": "#EA80FC"
            }
          ],
          [
            {
              "expression": "FILL(METRICS(), 0)",
              "id": "e1",
              "label": "FILL",
              "visible": true,
              "color": "#82B1FF",
              "yAxis": "left"
            }
          ]
        ],
        "region": "ap-northeast-1"
      }
    }
  ]
}

AWS マネジメントコンソールから確認すると指定された色が一つのグラフのみ適用され他はランダムな色になっているのが確認できます。

分割前のグラフ

AWS CLI で CloudWatch の FILL 関数により自動生成される各グラフの色を任意の色にする方法

対象となるメトリクスの数だけ数式のメトリクス(FILL 関数)を定義する

対象となるメトリクスの数だけ数式のメトリクス(FILL 関数)を定義して、それぞれに対して色を指定することにしました。

そもそも、FILL 関数は第一引数に予備値として使用する値を指定するのですが、今回使用している METRICS() 関数は、リクエストのすべての CloudWatch メトリクス(単一の時系列または時系列の配列)を返します。
METRICS() 関数を FILL 関数の予備値として使用すると、FILL 関数は METRICS() 関数の返り値が時系列の配列のため、その配列の数だけグラフが生成します。
以下の AWS のドキュメントを確認すると、現状 FILL 関数のように 1 つの式により、グラフの時系列の配列が作成される場合、これらの各時系列に使用される色を変更することはできないと明記されていました。

Metric Math を使用する

1 つの式により、グラフの時系列の配列が作成される場合、これらの各時系列に使用される色を変更することはできません。

そのため、METRICS() 関数ではなく、メトリクスの ID を用いて単一の時系列を指定することで、色を変更することができることができるのではと考え試したところ問題なく色の指定ができました。
しかし、結果として対象となるメトリクスの数だけ数式のメトリクス(FILL 関数)を定義する必要はあります。

完成したjson
Copied!
{
  "widgets": [
    {
      "type": "metric",
      "x": 0,
      "y": 0,
      "width": 6,
      "height": 6,
      "properties": {
        "view": "timeSeries",
        "stacked": false,
        "metrics": [
          [
            "AWS/EC2",
            "CPUUtilization",
            "InstanceId",
            "i-xxxxxxxxxxxxxxxxx",
            {
              "id": "m1",
              "color": "#FF80AB"
            }
          ],
          [
            "AWS/EC2",
            "CPUUtilization",
            "InstanceId",
            "i-yyyyyyyyyyyyyyyyy",
            {
              "id": "m2",
              "color": "#EA80FC"
            }
          ],
          [
            {
              "expression": "FILL(m1, 0)",
              "id": "e1",
              "label": "M1_FILL",
              "visible": true,
              "color": "#82B1FF",
              "yAxis": "left"
            }
          ],
          [
            {
              "expression": "FILL(m2, 0)",
              "id": "e2",
              "label": "M2_FILL",
              "visible": true,
              "color": "#00BFA5",
              "yAxis": "left"
            }
          ]
        ],
        "region": "ap-northeast-1"
      }
    }
  ]
}

AWS マネジメントコンソールから確認すると指定された色が適用されているのが確認できます。
見た目も分割する前と変わっていません。

分割後のグラフ

参考文献