我正在使用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中使用的方法是否等同于命令行? 假设它们是,我可能会缺少什么?
答案 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}
])