質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.02%

AWS cliを利用し、cloudwatchの最新の値のみを取得したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,250

GotHokLin

score 11

 前提・実現したいこと

Amazon Linux1上のAWS cli(awsコマンド)を利用してCloudwatchからRDSやELB等のサービスのリソースなどの値を取得したいと考えております。
最終的には簡単なスクリプトを組んで、そのスクリプトをZabbixから外部チェックという形で実行し、取得した値をZabbixに集約したいと考えております。
そのため、指定したリソースの最新の値1つのみをCloudwatchから取得したいのですが、今行っているコマンドではタイミングによっては値が取得できない、もしくは複数返ることがあります。
awsコマンドを利用して最新の値を1つだけ返してくるオプションや手段はないものでしょうか。

 該当のソースコード

現在は以下のコマンドを実行してRDSのCPU使用率の値を取得しております。

/usr/local/bin/aws cloudwatch get-metric-statistics \
  --start-time 2018-02-06T05:29:49Z \
  --end-time 2018-02-06T05:31:49Z \
  --namespace AWS/RDS \
  --dimensions Name=DBInstanceIdentifier,Value=RDSのインスタンス名〓 \
  --metric CPUUtilization \
  --statistics Average \
  --region ap-northeast-1 \
  --period 60

--start-timeと--end-timeの値は、実際にはスクリプト内部でdateコマンドの-uオプションでUTC時刻とし、--start-timeを現在時刻の1分前(-d '1 minute ago'で指定)、--end-timeに現在時刻を割り当てています。

 発生している問題・エラーメッセージ

この使い方ではコマンドを実行するタイミングによっては結果が0個~2個返ってくることがあります。

  • 結果が0個の場合
{
    "Datapoints": [],
    "Label": "CPUUtilization"
}
  • 結果が1個の場合
{
    "Datapoints": [
        {
            "Timestamp": "2018-02-06T05:30:00Z",
            "Average": 2.5,
            "Unit": "Percent"
        }
    ],
    "Label": "CPUUtilization"
}
  • 結果が2個の場合
{
    "Datapoints": [
        {
            "Timestamp": "2018-02-06T05:29:00Z",
            "Average": 1.33333333333515,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2018-02-06T05:30:00Z",
            "Average": 2.5,
            "Unit": "Percent"
        }
    ],
    "Label": "CPUUtilization"
}

 試したこと

AWSの公式サイトのドキュメントを見ておりますが、こちらの英語力の問題か期間を指定する方法以外存在していないようです。
最新の1つの値だけを取得するといったオプションはない模様です。

 補足情報(FW/ツールのバージョンなど)

$ aws --version
aws-cli/1.14.32 Python/2.7.12 Linux/4.9.77-31.58.amzn1.x86_64 botocore/1.8.36

以上です。なにとぞよろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

start-timeとend-timeの間隔をもう少し長めにとってみてはいかがでしょうか。
CloudWatchでは60秒間隔でDatapointが記録されていて、そのタイミングとstart-time、end-timeの指定の仕方次第では上記の通り、0個〜2個取得されてしまうかと思います。
例えば、start-timeとend-timeの間隔を2倍の120秒間隔とすれば必ず1個はデータが入ってくる状態になるかと思います。
あとは、入ってきたをTimestampでソートし、最新の時刻の情報のみを取り出せば良いかと思います。
aws cliのオプションで--queryというのがあり、この中でJMESPathのsort_byでソートできます。

コマンドとしては以下のようなイメージです。

/usr/local/bin/aws cloudwatch get-metric-statistics \
  --start-time 2018-02-06T05:29:49Z \
  --end-time 2018-02-06T05:31:49Z \
  --namespace AWS/RDS \
  --dimensions Name=DBInstanceIdentifier,Value=RDSのインスタンス名〓 \
  --metric CPUUtilization \
  --statistics Average \
  --region ap-northeast-1 \
  --period 60 \
  --query 'sort_by(Datapoints,&Timestamp)[*]'

これで順番に並ぶので、あとは一番下のデータが最新になっているのでピックアップしてみる感じでどうでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/08 10:04

    ike-daiさん、ご返信ありがとうございます。
    ご指摘のstart-timeとend-timeの期間は120秒でも結果が0個となる場合もあったため、3分とすることで、確実に1個以上のデータが返ってくることになりました。

    お教えいただきましたオプションで時刻順でソートし、最新のものを抽出することで当初の目的は達成できそうです。
    このオプションのことは知りませんでしたので、私にとっては非常に有益な情報でした。誠にありがとうございました。

    キャンセル

  • 2018/02/08 10:31

    TaichiYanagiyaさんのご回答のコメントへも記載させていただきましたが、zabbix_senderを利用したZabbixへのデータ登録方法を紹介されているike-daiさんのブログを発見いたしました。

    http://d.hatena.ne.jp/ike-dai/20120622/1340360976

    CloudWatchのAPIを利用することでコストがかさむという事を考えると、一定時間まとめた値をzabbix_senderを使って一括で登録するというのも一つの手かと思っております。

    現状の環境では、ZabbixサーバはAWSとは別の環境に構築済みで、AWSのVPC内にZabbix Proxyを立て、AWSのVPC内のEC2に稼働させているzabbix_agentはZabbix Proxyに向けてデータを送っている状況です。
    この場合、zabbix_senderもVPC内のZabbix Proxyに向けて送るということになるかと思います。
    ike-daiさんのブログ記事の手法でも試してみたいと思います。

    お二人どちらも、当方の知らない有益なご回答をいただけたのでベストアンサーに迷いましたが、zabbix_senderの具体例をブログで紹介されていたike-daiさんにベストアンサーを付けさせていただきます。

    キャンセル

+1

「最新の値を取る」というよりも、タイムスタンプ : 値 のペアを取り、zabbix_sender に -T オプションを付けて、タイムスタンプごと Zabbix Server に入力するといいのではないでしょうか?

CloudWatch は API 呼び出し回数で課金されるので、1時間に 1回、1時間分のデータを取得して zabbix_sender で流し込んでいました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/08 10:16

    TaichiYanagiyaさん、コメントありがとうございます。
    AWSを触り始めたのが最近なもので、CloudWatchをAPIで呼ぶ回数によって課金されるということを知りませんでした。
    そうなると、zabbix_senderを使ってまとめて登録するというのはコスト面で有利ですね。

    AWSのCloudWatchから取得した値をTimestampと合わせてZabbixに送るという手法を、この質問にご回答いただいたもうおひとかた、ike-daiさんがご自身のブログで紹介されておりました。このブログ記事を参考にしながら、TaichiYanagiyaさんご提案の方法でも値をZabbixに格納できるかやってみたいと思います。

    http://d.hatena.ne.jp/ike-dai/20120622/1340360976

    今回の案件はAWSの利用料を自分自身で支払う案件ではないため、相談の上どちらの手法を取るか検討したいと思います。
    ご回答ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる