双六工場日誌

平凡な日常を淡々と綴ります。

Python版 AWS CLIでCloudwatchの情報を取得する

AWSを使っていると、Cloudwatchの情報を外部に取り出したくなるのが人情だと思います。

しかし、Cloudwatchの情報取得に関しては、Javaで書かれた「Amazon CloudWatch Command Line Tool」の情報やAPIを叩くツールを自作するような情報が多く、比較的新しいPythonAWS CLIでの取得方法の情報はあまり見かけません。

AWS CLIは、旧来のツールで必要なJavaのインストールの必要がなく、また、1つのツールを導入するだけで、Cloudwatchを含む、すべてのAWSのサービスが操作可能というメリットがあり、比較的手軽に使うことができます。そのため、できればこちらで済ませたいところ。

ただ、AWS CLIでのCloudwatchは、いくつか癖があり、実際に使えるようになるまでハマったので、使い方をまとめておきたいと思います。

AWS CLIの導入と初期設定

今回の例を実行するために必要な初期設定方法は、以下の通りです。こちらは、ネット上に多くの情報が多くあるので、説明はざっくりで。

Billing情報の取得例

説明するよりは、例があった方がわかりやすいと思うので、例を2つ。(Gistへのリンクなので表示されていない場合は再読み込みをお願いします)スクリプトは、Mac OS 10.8 とCentOS 6にて動作確認しています。*1

コマンドの出力は以下のようなJSONになります。*2

[
 {
    "Unit": "Percent",
    "Average": 0.33399999999999996,
    "Timestamp": "2014-01-23T14:51:00Z"
  },
(中略)
  {
    "Unit": "Percent",
    "Average": 0.32799999999999996,
    "Timestamp": "2014-01-23T14:56:00Z"
  },
  {
    "Unit": "Percent",
    "Average": 0.33399999999999996,
    "Timestamp": "2014-01-23T15:01:00Z"
  }
]

オプションの中身

スクリプトで指定しているコマンドとオプションの意味は以下の通りです。

  • aws cloudwatch get-metric-statistics
    • AWS CLIコマンドとサブコマンド。サブコマンドの1つ目に、AWSのサービス名を入れ、2つ目にそのサービスに対する操作を入れます。
    • "complete -C aws_completer aws"を実行していれば、サブコマンドはタブ補完が効きます。また、"aws cloudwatch help"、"aws cloudwatch get-metric-statistics help"のように、コマンドに続けて"help"を入力すると、それぞれのリファレンスマニュアルを見ることができます。
  • --region
    • 取得対象リージョンの指定。Billing情報を取得する際には、必ず「us-east-1」を指定する必要がある。そのほかの場合は、自分が使っているリージョンを指定。"configure"時にデフォルト指定していれば、省略可能。
  • --namespace
  • --metric-name
  • --start-time, --end-time
    • メトリックの取得範囲をISO Dateの形式で指定する。日付だけ、日付+時間の両方の指定が可能。ただし、指定された期間÷データ間隔で決まるデータ件数(Datapoint数)が1440以下である必要あり。
  • --period
    • メトリックのデータ間隔を秒間隔で指定する。指定する値は、60の倍数である必要がある。Cloudwatchでは、デフォルトでは5分間間隔でデータが取得されているため、ここでは、300を指定。
  • --statistics
    • 平均値や最大値など、メトリックをどの断面で取り出すかの指定。
    • 指定可能な値は、「"SampleCount"|"Average"|"Sum"|"Minimum"|"Maximum" 」
  • --dimensions
  • jq '.Datapoints | sort_by(.Timestamp)'
    • これはAWS CLIのコマンドではなく、コマンドラインJSON解析コマンド、jqコマンドと、そのオプション。
    • AWS CLIで取得した生のJSONはなぜかデータが時系列順に並んでいないため、jqコマンドを通して、時系列順にデータが並ぶようにする。
      • この点はいずれ修正されるかもしれませんが、現在のところは、jqと組み合わせてデータを整形するのがベストプラクティスだと思います。

これらのオプションの組み合わせだけで、おおよそのAWSの利用状況は取得できると思います。

AWS CLIの公式のコマンドリファレンス*3には、ほかのサービスのメトリック取得方法やCloudwatch以外のサブコマンドの使い方も載っています。ここで例示したもの以外の使い方を知りたい方は、そちらを見てみてください。

夜も更けてきたので、今日はここまでで。

*1:MacLinuxでは、dateコマンドの中身が異なっているので、両方で動くように調整

*2:パラメータの指定が間違っていた場合は、エラーではなく空のリストが返ってきます。なので、正しいパラメータの確認をしにくいんですよね。。。

*3:各コマンド・サブコマンドに続けて"help"を入力した時に見られるマニュアルと同等の内容です。