【问题标题】:Python: Boto3: get_metric_statistics() only accepts keyword argumentsPython: Boto3: get_metric_statistics() 只接受关键字参数
【发布时间】:2021-07-23 19:27:05
【问题描述】:

刚开始在 Python 中使用 Boto3,这绝对是新的。

我正在尝试使用简单的 get_metric_statistics 脚本来返回有关实例的 CPUUtilization 的信息。这是我要使用的脚本:

import boto3
import datetime

cw = boto3.client('cloudwatch')

cw.get_metric_statistics(       
        300,
        datetime.datetime.utcnow() - datetime.timedelta(seconds=600),
        datetime.datetime.utcnow(),
        'CPUUtilization',
        'AWS/EC2',
        'Average',
        {'InstanceId':'i-11111111111'},
        )

但我不断收到以下消息:

Traceback (most recent call last):
  File "C:..../CloudWatch_GetMetricStatistics.py", line 13, in <module>
    {'InstanceId':'i-0c996c11414476c7c'},
  File "C:\Program Files\Python27\lib\site-packages\botocore\client.py", line 251, in _api_call
    "%s() only accepts keyword arguments." % py_operation_name)
TypeError: get_metric_statistics() only accepts keyword arguments.

我有:

  1. 查看了有关 Boto3 的文档,我相信我已正确编写/包含所有内容
  2. 在 .aws 文件夹中设置正确的区域/输出格式/安全凭证
  3. 谷歌搜索了 put_metric_statistics 等类似问题,试图找出答案

我仍然对我缺少什么感到困惑?

任何指导将不胜感激。

非常感谢 本

【问题讨论】:

标签: amazon-web-services boto3 amazon-cloudwatch


【解决方案1】:

这行得通:

import boto3
import datetime

cw = boto3.client('cloudwatch')

cw.get_metric_statistics(
        Period=300,
        StartTime=datetime.datetime.utcnow() - datetime.timedelta(seconds=600),
        EndTime=datetime.datetime.utcnow(),
        MetricName='CPUUtilization',
        Namespace='AWS/EC2',
        Statistics=['Average'],
        Dimensions=[{'Name':'InstanceId', 'Value':'i-abcd1234'}]
        )

为了找到正确的值,我使用AWS Command-Line Interface (CLI)

aws cloudwatch list-metrics --namespace AWS/EC2 --metric-name CPUUtilization --max-items 1

它返回的信息如:

{
    "Metrics": [
        {
            "Namespace": "AWS/EC2", 
            "Dimensions": [
                {
                    "Name": "InstanceId", 
                    "Value": "i-abcd1234"
                }
            ], 
            "MetricName": "CPUUtilization"
        }
    ], 
    "NextToken": "xxx"
}

然后您可以使用这些值来填充您的get_metric_statistics() 请求(例如Dimensions 参数)。

【讨论】:

  • 啊,太棒了,谢谢!我已经对语法进行了几次迭代(包括添加 KV 对的 Name 部分),但显然它不太正确。非常感谢 - 现在问题已经解决了。
  • 太棒了!如果此答案或任何答案解决了您的问题,请单击复选标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。
  • 谢谢。有没有办法可以动态传递区域?当我的实例跨区域时,get_metric_statistics 仅检索属于我之前在 aws configure 中使用的区域的实例的数据点。那么有没有一种方法可以将区域作为参数传递?
  • @SelvaPrasad 解决特定区域,使用cw = boto3.client('cloudwatch', region_name='xyz')
【解决方案2】:

参考documentation,以及你的错误信息:

get_metric_statistics() only accepts keyword agruments

命名参数必须按照文档中的定义传递给函数:

get_metric_statistics(**kwargs)

【讨论】:

  • 正确,根本原因是,args 需要是 name=value 格式!例如,get_metric_statistics(Period=300,... 而不是 get_metric_statistics(300,...
【解决方案3】:

您在尝试获取详细信息时是否使用了 region_name。你能分享你的 github 以更好地了解你在做什么。

【讨论】:

  • 这是一个已被接受的老问题。
猜你喜欢
  • 2021-10-10
  • 1970-01-01
  • 2021-09-24
  • 2018-11-22
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 2015-08-18
相关资源
最近更新 更多