简体   繁体   English

如何使用 Boto3 一次性创建多个 cloudwatch 警报

[英]How to create multple cloudwatch alarms using Boto3 in a one shot

I want to create ~267 Cloudwatch alarms, manual process is so pathetic, can someone guide me to use Boto3 script so that I can set up all alarms in a one shot.我想创建〜267个Cloudwatch警报,手动过程太可怜了,有人可以指导我使用Boto3脚本,以便我可以一次性设置所有警报。

import boto3

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

# Create alarm
cloudwatch.put_metric_alarm(
    AlarmName='Web_Server_CPU_Utilization',
    ComparisonOperator='GreaterThanThreshold',
    EvaluationPeriods=1,
    MetricName='CPUUtilization',
    Namespace='AWS/EC2',
    Period=60,
    Statistic='Average',
    Threshold=70.0,
    ActionsEnabled=False,
    AlarmDescription='Alarm when server CPU exceeds 70%',
    Dimensions=[
        {
          'Name': 'InstanceId',
          'Value': 'i-xxxxxxxxxx'
        },
    ],
    Unit='Seconds'
)

Assuming you want to add a CloudWatch alarm for different EC2 instances, you can simply put the instance IDs in a list and iterate over that list to create the alarms.假设您要为不同的 EC2 实例添加 CloudWatch 警报,您可以简单地将实例 ID 放在一个列表中并遍历该列表以创建警报。 That'd look like:看起来像:

import boto3

cloudwatch = boto3.client('cloudwatch')

ec2_instances = [
    'i-xxxxxxxxx1',
    'i-xxxxxxxxx2',
    'i-xxxxxxxxx3'
]

for ec2_instance in ec2_instances:
    cloudwatch.put_metric_alarm(
        AlarmName='Web_Server_CPU_Utilization_%s' % ec2_instance,
        ComparisonOperator='GreaterThanThreshold',
        EvaluationPeriods=1,
        MetricName='CPUUtilization',
        Namespace='AWS/EC2',
        Period=60,
        Statistic='Average',
        Threshold=70.0,
        ActionsEnabled=False,
        AlarmDescription='Alarm when server CPU exceeds 70%',
        Dimensions=[
            {
              'Name': 'InstanceId',
              'Value': ec2_instance
            },
        ],
        Unit='Seconds'
    )

Here is a simple script I use to set up CloudWatch alarms on my running EC2 instances.这是我用来在运行的 EC2 实例上设置 CloudWatch 警报的简单脚本。 The aim is to reboot my EC2 instances if StatusCheckFailed_Instance is True.目的是在 StatusCheckFailed_Instance 为 True 时重启我的 EC2 实例。

In case you are getting the "Insufficient Data" message as well, its worthwhile creating the same alarm on the EC2 console and then making sure your put_metric_alarm call matches the source/CloudFormation JSON.如果您也收到“数据不足”消息,那么值得在 EC2 控制台上创建相同的警报,然后确保您的 put_metric_alarm 调用与源/CloudFormation JSON 匹配。

AWS seems to be really fussy about the JSON. AWS 似乎对 JSON 非常挑剔。 Once I matched the EC2 console's JSON exactly it worked like a charm.一旦我完全匹配了 EC2 控制台的 JSON,它就像一个魅力。

Hope this helps someone.希望这可以帮助某人。

import boto3

# Specify your region here
region = "ap-northeast-1"

ec2_client = boto3.client("ec2", region_name=region)
cloudwatch = boto3.client('cloudwatch')

# Get running EC2 instances
reservations = ec2_client.describe_instances(Filters=[
    {
        "Name": "instance-state-name",
        "Values": ["running"],
    }
]).get("Reservations")

# Set up an alarm for each instance
for reservation in reservations:
    for instance in reservation["Instances"]:
        instance_id = instance['InstanceId']

        cloudwatch.put_metric_alarm(
            AlarmName=f'Status_Check_{instance_id}',
            AlarmDescription=f'Alarm when status check fails on {instance_id}',
            ActionsEnabled=True,
            OKActions=[],
            AlarmActions=[
                f"arn:aws:automate:{region}:ec2:reboot"
            ],
            InsufficientDataActions=[],
            MetricName='StatusCheckFailed_Instance',
            Namespace='AWS/EC2',
            Statistic='Maximum',
            Dimensions=[
                {
                  'Name': 'InstanceId',
                  'Value': instance_id
                },
            ],
            Period=60,
            EvaluationPeriods=2,
            DatapointsToAlarm=2,
            Threshold=0.99,
            ComparisonOperator='GreaterThanOrEqualToThreshold'
        )

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM