CloudWatch 自动警报删除执行多次

Posted

技术标签:

【中文标题】CloudWatch 自动警报删除执行多次【英文标题】:CloudWatch auto alarm deletion executing multiple times 【发布时间】: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 警报多次创建了大量事件。

请帮我修复此代码。

【问题讨论】:

【参考方案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 的代码部分未显示,因此我无法评论是否应该更改。

【讨论】:

感谢约翰的帮助。

以上是关于CloudWatch 自动警报删除执行多次的主要内容,如果未能解决你的问题,请参考以下文章

通过 CDK 从 CfnDeliveryStream 获取 cloudwatch 警报的指标

我可以在不向 CloudWatch 仪表板添加警报的情况下定义具有扩展策略的 EC2 自动扩展组吗?

AWS Cloudwatch - 在 15 分钟的 lambda 超时时不发送警报邮件

AWS 监控与报警 aws CloudWatch 自动恢复硬件故障实例 Auto Recover

自动安装 CloudWatch 代理

由于 heredoc,Cloudwatch 警报创建失败