繁体   English   中英

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

[英]How to create multple cloudwatch alarms using Boto3 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'
)

假设您要为不同的 EC2 实例添加 CloudWatch 警报,您可以简单地将实例 ID 放在一个列表中并遍历该列表以创建警报。 看起来像:

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'
    )

这是我用来在运行的 EC2 实例上设置 CloudWatch 警报的简单脚本。 目的是在 StatusCheckFailed_Instance 为 True 时重启我的 EC2 实例。

如果您也收到“数据不足”消息,那么值得在 EC2 控制台上创建相同的警报,然后确保您的 put_metric_alarm 调用与源/CloudFormation JSON 匹配。

AWS 似乎对 JSON 非常挑剔。 一旦我完全匹配了 EC2 控制台的 JSON,它就像一个魅力。

希望这可以帮助某人。

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