【问题标题】:CloudWatch auto alarm deletion executing multiple timesCloudWatch 自动警报删除执行多次
【发布时间】:2022-01-13 16:20:22
【问题描述】:

我有一段在 AWS Lambda 函数中运行的 python 脚本,当 EC2 实例进入停止状态时删除 CloudWatch 警报。

elif    'source' in event and event['source'] == 'aws.ec2' and event['detail']['state'] == 'stopped':
        instanceID = event['detail']['instance-id']
        GetAlarmNamePrefix = "AutoAlarm-" + instanceID
        print(GetAlarmNamePrefix)
        for instance in instanceID:
            print("deleting alarms for instance :" + instanceID)
            AlarmNamePrefix = GetAlarmNamePrefix
            response = cloudwatch.describe_alarms(AlarmNamePrefix=AlarmNamePrefix,)
            alarm_list = []
            if 'MetricAlarms' in response:
                for alarm in response['MetricAlarms']:
                    alarm_name = alarm['AlarmName']
                alarm_list.append(alarm_name)
                print(alarm_list)
                cloudwatch.delete_alarms(AlarmNames=alarm_list)

这段代码可以很好地删除警报,但是当我查看 CloudWatch 日志组中 Lambda 函数的执行日志时,我可以看到为同一个 CloudWatch 警报多次创建了大量事件。

请帮我修复此代码。

【问题讨论】:

    标签: amazon-web-services aws-lambda amazon-cloudwatch cloudwatch-alarms


    【解决方案1】:

    看看这些行:

            instanceID = event['detail']['instance-id']
            GetAlarmNamePrefix = "AutoAlarm-" + instanceID
            print(GetAlarmNamePrefix)
            for instance in instanceID:
                print("deleting alarms for instance :" + instanceID)
    

    理论上,它会循环遍历每个实例。然而:

    • print() 语句正在打印 instanceID 而不是 instance
    • 循环中的任何内容实际上都没有引用instance

    事实上,instanceID 是一个包含一个实例 ID 的字符串,正如在打印 GetAlarmNamePrefix 时可以看到的那样。

    因此,您可以删除for 循环。

    可能会将多个事件传递给 Lambda 函数。但是,提取event 的代码部分未显示,因此我无法评论是否应该更改。

    【讨论】:

    • 感谢约翰的帮助。
    猜你喜欢
    • 2022-11-07
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 2012-11-30
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多