如何使用AWS Boto3获取Cloudwatch指标统计信息?

时间:2017-03-09 16:55:22

标签: python-3.x amazon-web-services amazon-s3 amazon-cloudwatch

我正在使用Python 3脚本,该脚本旨在使用Boto3库从AWS CloudFront获取S3空间利用率统计信息。

我从AWS CLI开始,发现我可以通过这样的命令获得我所拥有的内容:

aws cloudwatch get-metric-statistics --metric-name BucketSizeBytes --namespace AWS/S3 --start-time 2017-03-06T00:00:00Z --end-time 2017-03-07T00:00:00Z --statistics Average --unit Bytes --region us-west-2 --dimensions Name=BucketName,Value=foo-bar Name=StorageType,Value=StandardStorage --period 86400 --output json

这将返回我期望的数据。现在我想在Python 3 / Boto3中做同样的事情。我的代码就是:



from datetime import datetime, timedelta
import boto3

seconds_in_one_day = 86400  # used for granularity

cloudwatch = boto3.client('cloudwatch')

response = cloudwatch.get_metric_statistics(
    Namespace='AWS/S3',
    Dimensions=[
        {
            'Name': 'BucketName',
            'Value': 'foo-bar'
        },
        {
            'Name': 'StorageType',
            'Value': 'StandardStorage'
        }
    ],
    MetricName='BucketSizeBytes',
    StartTime=datetime.now() - timedelta(days=7),
    EndTime=datetime.now(),
    Period=seconds_in_one_day,
    Statistics=[
        'Average'
    ],
    Unit='Bytes'
)

print(response)




当我运行它时,我得到一个有效的响应但没有数据点(它是一个空数组)。它们似乎是相同的,除了Python方法似乎没有区域,命令行需要它。

我尝试了另外一件事:我的代码是计算最后日期的日期与硬编码的命令行的日期。我确实试着编写日期,只是为了看看我是否会收回数据,结果是一样的。

所以我的问题是这些:

我在Boto / Python中使用的方法是否等同于命令行? 假设它们是,我可能会缺少什么?

6 个答案:

答案 0 :(得分:1)

我没有看到您的代码明显错误,所以该地区看起来像是一个主要的嫌疑人。

您可以在创建客户端时使用以下命令进行设置:

cloudwatch = boto3.client('cloudwatch', region_name='us-west-2')

如果未设置,boto将首先尝试从AWS_DEFAULT_REGION env变量获取区域,然后尝试~/.aws/config配置文件。尝试检查那些以查看默认区域集。

答案 1 :(得分:1)

我能够解决这个问题。您需要在boto3调用中指定Dimensions参数。

答案 2 :(得分:1)

我认为错误是您的命令Option Explicit Public Sub EnumerateWorkbookQueries() Dim q As WorkbookQuery For Each q In ThisWorkbook.Queries Debug.Print q.Name Next q End Sub 。默认区域为east-1。因此,您可以使用以下内容:

cloudwatch = boto3.client('cloudwatch')

答案 3 :(得分:0)

我有一个可行的解决办法,以防其他人需要这个,但我仍然希望找到一个非kludgy答案,如果存在。它可能不会。我决定只生成命令行并使用python运行它并检索json结果 - 相同的净结果。

dependencies {
     testCompile 'org.junit.jupiter:junit-jupiter-api:5.0.0-M2'
}

答案 4 :(得分:0)

这是一个非常好的示例,可以使用boto3在python中从cloudwatch获取数据。我不得不花几个小时才能使它工作,但现在应该很容易参考。

def get_req_count(region, lb_name):
    client = boto3.client('cloudwatch', region_name=region)
    count = 0
    response = client.get_metric_statistics(
            Namespace="AWS/ApplicationELB",
            MetricName="RequestCount",
            Dimensions=[
                {
                    "Name": "LoadBalancer",
                    "Value": lb_name
                },
            ],
            StartTime=str_yesterday,
            EndTime=str_today,
            Period=86460,
            Statistics=[
                "Sum",
            ]
    )   

    #print(response2)        
    for r in response['Datapoints']:
        count = (r['Sum'])

    return count    

答案 5 :(得分:0)

这就是我所做的:

client = boto3.client(service_name='cloudwatch', region_name='us-east-1')

        response = client.get_metric_statistics(
            Namespace = 'AWS/EC2',
            Period = 300,
            StartTime = datetime.utcnow() - timedelta(seconds = 600),
            EndTime = datetime.utcnow(),
            MetricName = metricVar,
            Statistics=['Average'], Unit='Percent',
            Dimensions = [
                {'Name': 'InstanceId', 'Value': asgName}
            ])