prudhvi
prudhvi

Reputation: 1171

Trying to disable all the Cloud Watch alarms in one shot

My organization is planning for a maintenance window for the next 5 hours. During that time, I do not want Cloud Watch to trigger alarms and send notifications.

Earlier, when I had to disable 4 alarms, I have written the following code in AWS Lambda. This worked fine.

import boto3
import collections

client = boto3.client('cloudwatch')

def lambda_handler(event, context):
    response = client.disable_alarm_actions(
    AlarmNames=[
        'CRITICAL - StatusCheckFailed for Instance 456',
        'CRITICAL - StatusCheckFailed for Instance 345',
        'CRITICAL - StatusCheckFailed for Instance 234',
        'CRITICAL - StatusCheckFailed for Instance 123'
    ]
)

But now, I was asked to disable all the alarms which are 361 in number. So, including all those names would take a lot of time.

Please let me know what I should do now?

Upvotes: 0

Views: 1792

Answers (2)

x89
x89

Reputation: 3460

If you do not have the specific alarm arns, then you can use the logic in the previous answer. If you have a specific list of arns that you want to disable, you can fetch names using this:

def get_alarm_names(alarm_arns):
    names = []
    response = client.describe_alarms()
    for i in response['MetricAlarms']:
      if i['AlarmArn'] in alarm_arns:
        names.append(i['AlarmName'])
    return names

Here's a full tutorial: https://medium.com/geekculture/terraform-structure-for-enabling-disabling-alarms-in-batches-5c4f165a8db7

Upvotes: 0

John Rotenstein
John Rotenstein

Reputation: 269480

Use describe_alarms() to obtain a list of them, then iterate through and disable them:

import boto3
client = boto3.client('cloudwatch')

response = client.describe_alarms()

names = [[alarm['AlarmName'] for alarm in response['MetricAlarms']]]
disable_response = client.disable_alarm_actions(AlarmNames=names)

You might want some logic around the Alarm Name to only disable particular alarms.

Upvotes: 1

Related Questions