Return 来自 AWS 的所有警报,而不是在 Python 上使用 describe_alarms 仅 50 个

Return all alarms from AWS instead of only 50 using describe_alarms on Python

如何在使用函数 describe_alarms 时打印所有警报名称,而不是仅打印 50 个?

代码,使用Python:

conn = boto.connect_cloudwatch()
alarms = conn.describe_alarms()    
for item in alarms:
    print item.name

谢谢。

默认情况下 returns 50。如果你想要更多,请设置 max_records=value 并尝试。

由于底层 AWS API 实施限制,它将 return 最多 100 个警报。不知道现在修好了没有。

conn.describe_alarms(max_records=100)

Help on method describe_alarms in module boto.ec2.cloudwatch:

describe_alarms(self, action_prefix=None, alarm_name_prefix=None, alarm_names=None, max_records=None, state_value=None, next_token=None)

:type max_records: int
:param max_records: The maximum number of alarm descriptions
    to retrieve.

虽然我来晚了一点,但这是我的解决方案(在 Java 中)。您必须获取下一个令牌并继续循环询问结果,直到没有下一个令牌,因此它的行为类似于网站上的分页

String nextToken = null;
List<MetricAlarm> metricAlarms = new ArrayList<>();
for (int i = 0; i < 100; i++) {

    DescribeAlarmsRequest describeAlarmsRequest = new DescribeAlarmsRequest();
    describeAlarmsRequest.setNextToken(nextToken);
    describeAlarmsRequest.setMaxRecords(100);

    DescribeAlarmsResult describeAlarmsResult = getClient().describeAlarms(describeAlarmsRequest);
    List<MetricAlarm> metricAlarmsTmp = describeAlarmsResult.getMetricAlarms();
    metricAlarms.addAll(metricAlarmsTmp);
    nextToken = describeAlarmsResult.getNextToken();
    logger.info("nextToken: {}", nextToken);

    if (nextToken == null) {
        break;
    }
}
logger.info("metricAlarms size: {}", metricAlarms.size());

当然还有改进的余地,例如创建 while 循环而不是 for 循环。

更新:

这里是我的精修版

String nextToken = null;
List<MetricAlarm> metricAlarms = new ArrayList<>();

while (nextToken != null || metricAlarms.size() == 0) {
    DescribeAlarmsRequest describeAlarmsRequest = new DescribeAlarmsRequest().withNextToken(nextToken).withMaxRecords(100); // create the request
    DescribeAlarmsResult describeAlarmsResult = getClient().describeAlarms(describeAlarmsRequest); // get the result
    metricAlarms.addAll(describeAlarmsResult.getMetricAlarms()); // add new alarms to our list
    nextToken = describeAlarmsResult.getNextToken(); // check if we have a nextToken
    if (nextToken == null && cachedMetricAlarms.size() == 0) { // if we have no alarm in AWS we get inside the loop but we would never exit -> intercept that
            break;
        }
}
logger.info("metricAlarms size: {}", metricAlarms.size());

这是一个完整的示例,说明如何对记录进行分页,以确保您检索到所有记录,而不是受到 Cloudwatch 警报上的最大记录限制 API:

alarmMaxRecords = 10

response = client.describe_alarms(
AlarmNamePrefix=prefix,
MaxRecords=alarmMaxRecords
)

alarmsItems = []
while response:
    alarmsItems += response['MetricAlarms']
    response = client.describe_alarms(AlarmNamePrefix=prefix, MaxRecords=alarmMaxRecords, NextToken=response['NextToken']) if 'NextToken' in response else None

for alarm in alarmsItems:
    # Do something with the alarm
    print(response['MetricAlarms'])

以上将一次检索 10 条记录,但最多可以是 100 条。

或者更简单地使用boto3提供的paginate方法:

import boto3

# Create CloudWatch client
cloudwatch = boto3.client('cloudwatch')

# List alarms of insufficient data through the pagination interface
paginator = cloudwatch.get_paginator('describe_alarms')
for response in paginator.paginate(AlarmNamePrefix=prefix, MaxRecords=alarmMaxRecords):
    # Do something with the alarm
    print(response['MetricAlarms'])