boto3(AWS SDK for Python)でCloudWatchからメトリクスを取得する【cloudpack 大阪 BLOG】

boto3を使ってCloudWatchからメトリクスを取得する必要が出てきたので勉強がてら簡単なサンプルを作ってみました。

環境

サーバ:CentOS6.6
Python:2.6.6
boto3:1.2.1

boto3(AWS SDK for Python)のインストール

AWSのリソースにアクセスするためのSDKをインストールします。

pip install boto3

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を指定します。
f:id:cloudfish:20151031174614j:plain

実行結果
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'}}