概要

タイトルの通り、put-metric-data コマンドを使えば CloudWatch メトリクスにデータを入れられます。
コマンドの実行方法と注意点をご紹介します。

ユースケース

監視設定が正しく行われていることを確認するため、監視テストを実施することは多いと思います。
監視テスト実行方法として、実際にアラート発生させることができれば一番良いのですが、監視項目によってはなかなか難しいこともあります。
例 : Lambda のスロットリングについて確認したい場合、同一アカウントで大量に Lambda を実行させないといけない、など

そのような時、今回紹介するコマンドを使えば、簡単に擬似アラートが発生させられるのでとても便利です。

いきなり結論

AWS CLI で、aws put-metric-data コマンドを実行すれば、CloudWatch メトリクスにデータを入れることができます。
コマンドの詳細は以下のドキュメントをご覧ください。

put-metric-data

コマンドについて補足

  • カスタムメトリクスに限らず、AWS 側で自動作成するメトリクスについても、このコマンドでデータを入れることができます
  • 実際の監視対象リソースが存在しない場合にも、データを入れることができます
    • 例 : これから作成予定の EventBridge ルールについて、そのルール名を指定して FailedInvocations (呼び出し失敗)を CloudWatch メトリクスにカウントさせる
  • unit オプションについて、指定しなくてもデータ Put が可能ですが、指定しないとうまくいかないことがあります
    • この記事の後半で検証します

実際にやってみた

検証の流れ

  • aws put-metric-data コマンドを使って Lambda の Errors メトリクスにデータを Put
    • コマンド内で指定する Lambda 関数は、実際には存在しない状態
  • CloudWatch コンソール上で対象 Lambda の Errors メトリクスデータが入ってきていることを確認

aws put-metric-data コマンドを使って Lambda の Errors メトリクスにデータを Put

今回はこちらのコマンドを実行してみます。

aws cloudwatch put-metric-data --metric-name Errors --namespace AWS/Lambda --value 1 --dimensions FunctionName=sekiguchi-iret-cloudwatch-test --unit Count

オプションについては以下の通りです。

  • --metric-name : メトリクス名
    • データを入れたいメトリクスを指定
    • 今回は Errors を指定
  • --namespace : 名前空間
  • --value : 値
    • メトリクスに PUT するデータの値
      • 今回は Errors メトリクスなのでエラー発生回数を 1 としてデータをPUT
  • --dimensions : ディメンション
    • ここでは関数名として sekiguchi-iret-cloudwatch-test を指定
      • 実際には存在しない関数
  • --unit : ユニット
    • 単位を指定

上記のコマンドを CloudShell から実行してみます。
ちなみに実行前に CloudWatch メトリクスで sekiguchi-iret-cloudwatch-test で検索した結果がこちらです。
存在しない関数なので、もちろんデータは無く、メトリクスも存在していません。

コマンドを実行します。

無事実行できました。
一応 echo $? で本当に成功したのかを確認しています。

CloudWatch コンソール上で対象 Lambda の Errors メトリクスデータが入ってきていることを確認

コマンド実行後、すぐに CloudWatch メトリクスにて、関数名 : sekiguchi-iret-cloudwatch-test の Errors メトリクスが作成されていることが確認できました。

また、グラフ上にてデータが入ってきたことを確認できました。

(おまけ)unit オプションをつけないとうまくいかない時がある

このコマンドについて unit オプションをつけないで実行していましたが、実行してもデータがメトリクスに入ってこない時がありました。
検証の結果、頻繁にデータが入ってくるメトリクスの場合、unit オプションをつけないとデータがうまく入らないことがわかりました。

検証

事前準備

Hello World! を出力するだけの簡単な Lambda : sekiguchi-cloudwatch-test-lambda-function をデプロイしました。

設定 >> トリガー にて、1 分ごとに関数をキックする EventBridge ルールを設定しています。

Lambda 関数は1分ごとに実行されている状態です。
CloudWatch メトリクス : Throttles に1分ごとにデータが入ってきていることを確認しました。

この状態のメトリクスにコマンドを用いてデータが入れられるかどうかを確認します。

検証結果

まずは --unit Count をつけないでコマンドを実行してみます。

aws cloudwatch put-metric-data --metric-name Throttles --namespace AWS/Lambda --value 1 --dimensions FunctionName=sekiguchi-cloudwatch-test-lambda-function

実行してしばらく待ちましたが、 Throttles メトリクスはずっと 0 のままです。

では続いて --unit Count をつけてコマンドを実行してみます。

aws cloudwatch put-metric-data --metric-name Throttles --namespace AWS/Lambda --value 1 --dimensions FunctionName=sekiguchi-cloudwatch-test-lambda-function --unit Count

メトリクスにデータが入ってきたことが確認できました!

unit オプションがあるかどうかでこうした挙動の変化が生じてしまうため、基本的にコマンド実行する際は unit オプションは忘れずにつけたほうが良さそうです。
unit オプションの有無によってなぜこうした変化が生じるのかについては調査しましたがわかりませんでした。
今後の課題として引き続き調査していきたいと思います。

終わりに

「監視テストしたいけど、どうやってアラート発生させよう…」と途方に暮れていた時、このaws put-metric-dataコマンドを知って感動しました。
存在しないリソースについてもCloudWatchに情報入れられるというのも、興味深いですね。
参考になれば幸いです。