我正在编写一个Python 3脚本,旨在使用Boto 3库从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 /Boto 3中做同样的事情。到目前为止,我的代码是:
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中使用的方法等同于命令行吗?假设它们是,我会错过什么?
7条答案
按热度按时间vh0rcniy1#
这里有一个很好的例子,用boto3从python中的cloudwatch获取数据。我花了几个小时才让它工作,但现在应该很容易参考。
字符串
33qvvth12#
这就是我所做的:
字符串
a9wyjsp73#
我看不出你的代码有什么明显的错误,所以这个区域看起来是主要的嫌疑犯。
您可以在创建客户端时使用以下命令进行设置:
字符串
如果没有设置,boto将首先尝试从
AWS_DEFAULT_REGION
env变量中获取区域,然后从~/.aws/config
配置文件中获取。尝试检查这些以查看默认区域设置。wixjitnu4#
我有一个可行的解决方法,以防其他人需要它,但我仍然想找到一个非笨拙的答案,如果存在的话。它可能不会。我决定我只是生成命令行,使用python运行它并检索json结果-相同的净结果。
字符串
xqk2d5yq5#
我认为错误是你的命令
cloudwatch = boto3.client('cloudwatch')
。默认区域是east-1。所以你可以使用这样的命令:字符串
lfapxunr6#
这个脚本解决了这个问题。详细的解释可以在脚本下面找到。
字符串
根据boto3 documentation,指标的所有维度都必须在请求中指定。如果维度没有指定,boto 3不会引发异常,但会返回空响应。
如果您指定的存储桶在cloudwatch客户端区域之外,或者您没有访问权限,也会返回空响应。
如果度量包含多个维,则必须为每个维包含一个值。[.]如果未发布维的特定组合,则无法检索其统计信息。
每个维度的值都可以在AWS文档中找到:例如AWS S3 Metrics and Dimensions和Amazon DynamoDB Metrics and Dimensions。
如果没有可用的数据点,它可能表明原始发布者请求的StandardStorage存储类型中没有对象;因此,建议的脚本迭代所有有效的存储类,并为每个存储类计算所需的度量。
f45qwnt87#
我能够解决这个问题。你需要在boto3调用中指定Dimensions参数。