如何使用boto更新现有的cloudwatch ALARM?

时间:2017-03-12 06:30:11

标签: python amazon-web-services boto

我在AWS中有一些现有的云观察警报,我已经成功地将它们分开并将它们存储在一系列字典中,如下所示:

[   {   'alarm_name': u'emsclassicldap_db_connections',
        'alarm_threshold': 200.0,
        'rds_name': u'emsclassicldap',
        'rds_type': u'db.m3.medium'},
    {   'alarm_name': u'smso-jenkins-40-shared_db_connections',
        'alarm_threshold': 266.0,
        'rds_name': u'smso-jenkins-40-shared',
        'rds_type': u'db.m3.medium'},
    {   'alarm_name': u'smso-jenkins-master-shared_db_connections',
        'alarm_threshold': 266.0,
        'rds_name': u'smso-jenkins-master-shared',
        'rds_type': u'db.m3.large'},
    {   'alarm_name': u'syd01-devops-deepali-shared_db_connections',
        'alarm_threshold': 266.0,
        'rds_name': u'syd01-devops-deepali-shared',
        'rds_type': u'db.m3.medium'}]

以上如果一个简单的清单并没有什么花哨的。现在我有一些上面的警报有一些错误的alarm_threshold值需要使用以下标准的正确值更新:

thershold_db_t2_medium = 309  # 99% of 312
thershold_db_m3_medium = 316  # 99% of 320
thershold_db_m3_large  = 633  # 99% of 640
thershold_db_m3_xlarge = 1267  # 99% of 1280
thershold_db_m3_2xlarge= 2534  # 99% of 2560
thershold_db_m4_large  = 675  # 99% of 682
thershold_db_m4_xlarge = 1351  # 99% of 1365
thershold_db_m4_2xlarge=  2703  # 99% of 2730

我写了以下内容来更新闹钟

my_region_list=['ap-southeast-2']
def final_compare_update(w):
    for region in my_region_list:
        c = boto.ec2.cloudwatch.connect_to_region(region)
        for each_dict in w:
         #print each_dict['rds_type']
             if each_dict['rds_type']=="db.m2.medium" and each_dict['alarm_threshold'] != thershold_db_t2_medium:
                c.update_alarm(name=each_dict['alarm_name'],comparision='>=',threshold=thershold_db_t2_medium, period=300, evaluation_periods=3,statistic='Maximum')
                print "updated "+each_dict['alarm_name']
             elif each_dict['rds_type']=="db.m3.medium" and each_dict['alarm_threshold'] != thershold_db_m3_medium:
                c.update_alarm(name=each_dict['alarm_name'], comparision='>=', threshold=thershold_db_m3_medium,period=300, evaluation_periods=3, statistic='Maximum')
                print "updated " + each_dict['alarm_name']
             elif each_dict['rds_type'] == "db.m3.large" and each_dict['alarm_threshold'] != thershold_db_m3_large:
                c.update_alarm(name=each_dict['alarm_name'], comparision='>=', threshold=thershold_db_m3_large, period=300,evaluation_periods=3, statistic='Maximum')
                print "updated " + each_dict['alarm_name']
             elif each_dict['rds_type'] == "db.m3.xlarge" and each_dict['alarm_threshold'] != thershold_db_m3_xlarge:
                c.update_alarm(name=each_dict['alarm_name'], comparision='>=', threshold=thershold_db_m3_xlarge,period=300,evaluation_periods=3, statistic='Maximum')
                print "updated " + each_dict['alarm_name']
             elif each_dict['rds_type'] == "db.m3.2xlarge" and each_dict['alarm_threshold'] != thershold_db_m3_2xlarge:
                c.update_alarm(name=each_dict['alarm_name'], comparision='>=', threshold=thershold_db_m3_2xlarge,period=300, evaluation_periods=3, statistic='Maximum')
                print "updated " + each_dict['alarm_name']
             elif each_dict['rds_type'] == "db.m4.large" and each_dict['alarm_threshold'] != thershold_db_m4_large:
                 c.update_alarm(name=each_dict['alarm_name'], comparision='>=', threshold=thershold_db_m4_large,period=300, evaluation_periods=3, statistic='Maximum')
                 print "updated " + each_dict['alarm_name']
             elif each_dict['rds_type'] == "db.m4.xlarge" and each_dict['alarm_threshold'] != thershold_db_m4_xlarge:
                 c.update_alarm(name=each_dict['alarm_name'], comparision='>=', threshold=thershold_db_m4_xlarge,period=300, evaluation_periods=3, statistic='Maximum')
                 print "updated " + each_dict['alarm_name']
             elif each_dict['rds_type'] == "db.m4.2xlarge" and each_dict['alarm_threshold'] != thershold_db_m4_2xlarge:
                 c.update_alarm(name=each_dict['alarm_name'], comparision='>=', threshold=thershold_db_m4_2xlarge,period=300, evaluation_periods=3, statistic='Maximum')
                 print "updated " + each_dict['alarm_name']
             else:
                 print "Nothing was updated!"

这引起了我的错误:

Traceback (most recent call last):
  File "update_alarm.py", line 128, in <module>
    final = final_compare_update(w)
  File "update_alarm.py", line 88, in final_compare_update
    c.update_alarm(name=each_dict['alarm_name'], comparision='>=', threshold=thershold_db_m3_medium,period=300, evaluation_periods=3, statistic='Maximum')
TypeError: put_metric_alarm() got an unexpected keyword argument 'name'

怎么做?

1 个答案:

答案 0 :(得分:1)

update_alarm()函数将MetricAlarm对象作为输入。以下是boto documentation

中的示例
from boto.ec2.cloudwatch import MetricAlarm
scale_up_alarm = MetricAlarm(
            name='scale_up_on_cpu', namespace='AWS/EC2',
            metric='CPUUtilization', statistic='Average',
            comparison='>', threshold='70',
            period='60', evaluation_periods=2,
            alarm_actions=[scale_up_policy.policy_arn],
            dimensions=alarm_dimensions)
cloudwatch.create_alarm(scale_up_alarm)

顺便说一句,it appears that update_alarm()put_metric_alarm()的别名,这就是错误消息提到该功能的原因。

这是一个适合我的人,打电话给update_alarm()

c.update_alarm(MetricAlarm(
            name='hello', namespace='AWS/EC2',
            metric='CPUUtilization', statistic='Average',
            comparison='<', threshold='60',
            period='60', evaluation_periods=2
            ))

因此,您的代码应更新为:

c.update_alarm(MetricAlarm(
            name=each_dict['alarm_name'],
            comparison='>=',
            threshold=threshold_db_m3_medium,
            period=300,
            evaluation_periods=3,
            statistic='Maximum'
            ))