AWS SDK for Python (Boto3) で CloudWatch のメトリクスを取得する手順について解説します。
日常的に業務で AWS でインフラを運用管理している私としては GUI でボタンをクリックして設定していくスタイルから徐々に CUI またはプログラムでの運用管理に移行したいと考えています。
また Python はインターネットで調べると他の言語に比べて情報が多いというところと、コンパイル型ではなく敷居が低いという点から選択しています。
AWS SDK for Ruby で CloudWatch メトリクスを取得する手順については以下の記事を参考にしてください。
【AWS】AWS SDK for Ruby (3.0.1) で CloudWatch のメトリクスを取得する手順
Python で CloudWatch メトリクスを取得したいと思った理由
コマンドラインやプログラムで CloudWatch のメトリクスを取得したいと思った理由としては、以下の記事のように Zabbix とも連携できてよりレベルの高い運用保守ができるのではと考えたからです。
ZabbixでAWS/CloudWatchの値を取得してみた
https://dev.classmethod.jp/articles/zabbix-with-cloudwatch/
Python プログラムは以下の記事を参考にしました。
boto3(AWS SDK for Python)でCloudWatchからメトリクスを取得する【cloudpack 大阪 BLOG】
https://cloudfish.hatenablog.com/entry/2015/11/01/122309
CentOS8 に Python 3.8 をインストールする
始めに CentOS8 に Python 3.8 をインストールしました。
■OS は CentOS8.3
[root@test01 ~]# cat /etc/redhat-release |
■Python のインストール
CentOS8 ではパッケージをインストールする場合は、yum コマンドを使用せずに dnf コマンドを利用します。
dnf コマンドは yum とコマンドの構文はほぼ同じで dnf install ●● でインストールできます。
dnf install python38 で pip3.8 も一緒にインストールされます。
[root@test01 ~]# dnf install python38 |
■Ruby のバージョン確認
[root@test01 ~]# python3.8 –version |
■pip のバージョン確認
[root@test01 ~]# pip3.8 –version |
AWS SDK for Python(boto3)のインストール
Python と pip コマンドをインストールしたら AWS SDK for Python(boto3)をインストールします。
■AWS SDK for Python(boto3) のインストール
AWS SDK for Python(boto3)は、pip コマンドでインストールできます。
[root@test01 ~]# pip3.8 install boto3 |
AWS SDK for Python の動作確認
AWS SDK for Python の動作確認をします。
■AWS SDK for Python の動作確認
[root@test01 ~]# python3.8 |
AWS CLI のインストールする
動作確認等で必要になるかもしれないので AWS CLI もインストールしておきます。
■AWS CLI のインストール
AWS CLI も pip コマンドでインストールできます。
[root@test01 ~]# pip3.8 install awscli |
■AWS CLI のバージョン確認
[root@test01 ~]# aws –version |
Python のプログラム作成
CloudWatch のメトリクスを取得する Python プログラムを作成します。
■Python のプログラム(boto3 用)
[root@test01 ~]# vi cloudwatch02.py |
各パラメータの説明をします。
■get_metric_statistics
Google 翻訳で翻訳
get_metric_statistics 指定されたメトリックの統計を取得します。 1回の呼び出しから返されるデータポイントの最大数は1,440です。 1,440を超えるデータポイントをリクエストすると、CloudWatchはエラーを返します。 データポイントの数を減らすには、指定した時間範囲を狭めて隣接する時間範囲で複数のリクエストを行うか、指定した期間を増やすことができます。 データポイントは時系列で返されません。 ← 複数のデータポイントを取得すると順番はバラバラで表示されるので別途ソートする必要があります。 CloudWatchは、指定した期間の長さに基づいてデータポイントを集約します。 たとえば、1時間の統計をリクエストすると、CloudWatchはすべてのデータポイントを各1時間のタイムスタンプで集計します。 したがって、CloudWatchによって集約される値の数は、返されるデータポイントの数よりも多くなります。 CloudWatchには、パーセンタイル統計を計算するための生データポイントが必要です。 代わりに統計セットを使用してデータを公開する場合、次の条件のいずれかが当てはまる場合にのみ、このデータのパーセンタイル統計を取得できます。
メトリック値のいずれかが負の数である場合、パーセンタイル統計はメトリックに使用できません。 Amazon CloudWatchは、次のようにメトリックスデータを保持します。 60秒未満のデータポイントは3時間利用できます。 これらのデータポイントは高解像度のメトリックであり、StorageResolution1で定義されたカスタムメトリックでのみ使用できます。
最初に公開された期間が短いデータポイントは、長期保存のために集約されます。 たとえば、1分の期間を使用してデータを収集する場合、データは1分の解像度で15日間利用できます。 15日後も、このデータは引き続き利用できますが、5分の解像度でのみ集計および取得できます。 63日後、データはさらに集計され、1時間の解像度で利用できます。 CloudWatchは、2016年7月9日より、5分および1時間のメトリックスデータの保持を開始しました。 |
■Namespace(名前空間)
Namespace は日本語では「名前空間」と呼ばれます。
一般的には、命名規則 AWS/サービス名 が使用されます。
たとえば、Amazon EC2 インスタンスは AWS/EC2 という名前空間を使用します。
CloudWatch の画面では、以下の「EC2」が名前空間です。
名前空間の例
■MetricName(メトリクス)
CloudWatch 画面でのメトリクス名は以下より確認できます。
メトリクスの例
- CPUUtilization
- DiskReadOps
- DiskWriteOps
- DiskReadBytes
- DiskWriteBytes
- NetworkIn
- NetworkOut
- NetworkPacketsIn
- NetworkPacketsOut
- MetadataNoToken
■Dimensions(ディメンション)
ディメンションは下図のように「InstanceId」と「インスタンスID」のセットで一意のインスタンスを特定できます。
■メトリクスと名前空間とディメンションの関係図
datetime.timedelta の使い方
timedelta オブジェクトを使用すると、datetimeオブジェクトやdateオブジェクトと引き算や足し算などが可能になります。
指定できるのは以下の単位となります。
- weeks
- days
- hours
- minutes
- seconds
- milliseconds(ミリ秒)
- microseconds(マイクロ秒)
■プログラムの実行結果
[root@test01 ~]# python3.8 cloudwatch02.py
~ 省略 ~
‘Unit’: ‘Percent’}, |
1daysより少なくすると値が取得できない現象
プログラムの StartTime と EndTime の間隔を 1days より少なくすると値が取得できない現象が発生しました。
■プログラム(CPUUtilization の値が取得できない)
import boto3 |
以下のように、utcnowを付けたところ、表示されるようになりました。
■プログラム(CPUUtilization の値が取得できる)
import boto3 |
■プログラム実行結果
[root@test01 ~]# python3.8 cloudwatch03.py |
なぜ値が取得できるようになったのか
- datetime.datetime.now() ← 値が取得できない。
- datetime.datetime.utcnow() ← 値が取得できる。
おそらく CloudWatch はタイムゾーンが UTC(協定世界時)となっている為、datetime.now だと時間がずれて取得できないと思われます。
1days の場合はタイムゾーンがずれていても、枠内に入った値のみが取得出来ていただけで、値を取得する時間の枠を絞ると UTC で合わせないと時間がずれてしまい、値が取得できなくなります。
以下の記事を参考にしました。
CloudWatch
http://boto.cloudhackers.com/en/latest/cloudwatch_tut.html
The Metric object has a query method that lets us actually perform the query against the collected data in CloudWatch.
To call that, we need a start time and end time to control the time span of data that we are interested in.
For this example, let’s say we want the data for the previous hour:
実行結果から更に必要な情報を取得する
上記のプログラムを実行すると不要な情報も取得されます。
■プログラム実行結果
[root@test01 ~]# python3.8 cloudwatch03.py |
必要な情報は「Average」の「18.008333333336243」だけです。
それ以外の情報は必要ないので、必要な情報のみ抽出します。
■プログラム
import boto3 |
一見、複雑に見えても辞書型もリスト型も 1つずつ中に入っていけば目的の値にたどり着けます。
上記の場合は、value[0][‘Average’] で目的の値までたどり着けました。
コメント