boto3(AWS SDK for Python)でCloudWatchからメトリクスを取得する【cloudpack 大阪 BLOG】
boto3を使ってCloudWatchからメトリクスを取得する必要が出てきたので勉強がてら簡単なサンプルを作ってみました。
環境
サーバ:CentOS6.6
Python:2.6.6
boto3:1.2.1
EC2インスタンスのメトリクスを取得のサンプル
まずはEC2のCPU使用率を取得してみたいと思います。
下記のコードを記載して適当なファイル名で保存してください。
import boto3 from boto3.session import Session import datetime import dateutil.tz import pprint pp = pprint.PrettyPrinter(indent=4) accesskey = "YOUR_ACCESSKEY" secretkey = "YOUR_SECRETKEY" region = "YOUR_REGION" session = Session( aws_access_key_id=accesskey, aws_secret_access_key=secretkey, region_name=region) client = session.client('cloudwatch') # Get EC2 CPUUtilization response = client.get_metric_statistics( Namespace='AWS/EC2', MetricName='CPUUtilization', Dimensions=[ { 'Name': 'InstanceId', 'Value': 'i-12345678' }, ], StartTime=datetime.datetime.utcnow() - datetime.timedelta(seconds=600), EndTime=datetime.datetime.utcnow(), Period=300, Statistics=['Average'] ) pp.pprint(response)
CloudWatchコンソール
リファレンスをななめ読みしただけですが、サイドメニューのMetricsがNamespaceとなりMetricNameが画面右側のMetricNameを指定します。Namespaceは「AWS/」をMetricsに付加すればよさそうです。(ここは後ほど書いてますが誤りでした)Dimensionsについては、取得したいサービスによって名称が異なるため、NameとValueを指定するようになっています。CPU使用率の場合はNameにInstanceIdをValueに実際のIDを指定します。
実行結果
python get_ec2_cpu.py { u'Datapoints': [ { u'Average': 0.20000000000000001, u'Timestamp': datetime.datetime(2015, 10, 31, 8, 16, tzinfo=tzutc()), u'Unit': 'Percent'}], u'Label': 'CPUUtilization', 'ResponseMetadata': { 'HTTPStatusCode': 200, 'RequestId': '1dfba5e6-7fa9-11e5-bc7c-1f8b347fd072'}}
EMRのメトリクスを取得
実際に取得したいMetricsは、EC2ではなくEMRのメトリクスを取得したかったのでEC2と同様にコードを書いてみましたが何故か取得できず。エラーは発生せず返却されるDatapointsの値に何もセットされていませんでした。スペルミスか時間指定が間違っているのかと思い見直すも問題はなさそうでした。そもそもNamespaceに問題があるのか?と疑いを抱き、list_metrics関数で取得してみると何も取得できませんでした。どうやら名前空間の指定に問題があるようで、調べてみると名前空間はAWS の名前空間 - Amazon CloudWatchで定義されていました。CloudWatchのMetricsと紐付くと思い込んでいましたがそうではないようです。今回は「AWS/ElasticMapReduce」と指定して正しく値を取得することができました。
response = client.get_metric_statistics( #Namespace='AWS/EMR', ←間違い Namespace='AWS/ElasticMapReduce', ←正 MetricName='IsIdle', Dimensions=[ { 'Name': 'JobFlowId', 'Value': 'j-1PNEZHM6MFON8' }, ], StartTime=datetime.datetime.utcnow() - datetime.timedelta(seconds=300), EndTime=datetime.datetime.utcnow(), Period=300, Statistics=['Average'] )
実行結果
python boto_sample.py { u'Datapoints': [ { u'Average': 1.0, u'Timestamp': datetime.datetime(2015, 10, 22, 9, 20, tzinfo=tzutc()), u'Unit': 'None'}], u'Label': 'IsIdle', 'ResponseMetadata': { 'HTTPStatusCode': 200, 'RequestId': '7c3a6076-8044-11e5-82dd-9bacba3e4791'}}