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

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

新規登録して質問してみよう
ただいま回答率
85.48%
AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

2回答

5675閲覧

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

GotHokLin

総合スコア34

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2018/02/06 05:59

編集2018/02/06 06:41

前提・実現したいこと

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

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

投稿2018/02/06 15:41

TaichiYanagiya

総合スコア12146

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GotHokLin

2018/02/08 01: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の利用料を自分自身で支払う案件ではないため、相談の上どちらの手法を取るか検討したいと思います。 ご回答ありがとうございました。
guest

0

ベストアンサー

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/06 10:53

ike-dai

総合スコア45

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GotHokLin

2018/02/08 01:04

ike-daiさん、ご返信ありがとうございます。 ご指摘のstart-timeとend-timeの期間は120秒でも結果が0個となる場合もあったため、3分とすることで、確実に1個以上のデータが返ってくることになりました。 お教えいただきましたオプションで時刻順でソートし、最新のものを抽出することで当初の目的は達成できそうです。 このオプションのことは知りませんでしたので、私にとっては非常に有益な情報でした。誠にありがとうございました。
GotHokLin

2018/02/08 01: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さんにベストアンサーを付けさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問