首页 文章

使用AWS Lambda一次为多个实例创建CPUUtilization Metric上的警报

提问于
浏览
2

我有20个EC2 Windows实例,并且在达到阈值时尝试创建警报 . 如果我必须从Cloud Watch控制台为每个实例的CPU指标创建警报,我必须创建20个警报 . 我没有这样做,而是决定写一个Lambda函数 . 它看起来如下:

import boto3
import collections
from datetime import datetime
import calendar

def lambda_handler(event, context):

    client = boto3.client('cloudwatch')

    alarm = client.put_metric_alarm(
    AlarmName='CPU Alarm',
    MetricName='CPUUtilization',
    Namespace='AWS/EC2',
    Statistic='Average',
    ComparisonOperator='GreaterThanOrEqualToThreshold',
    Threshold=70.0,
    Period=300,
    EvaluationPeriods=1,
    Dimensions=[
        {
            'Name': 'InstanceId',
            'Value': '{instance_id}'
        }
    ],
    Unit='Percent',
    ActionsEnabled=True,
    AlarmActions=['arn:aws:sns:us-east-1:380431751678:CloudWatch'])

    print alarm

根据上面的脚本,它将找到AWS / EC2名称空间并监视名称为CPUUtilization的所有指标 . 我有20个名称的指标 . 上面的脚本创建了警报,但状态是 INSUFFICIENT_DATA . 我等了30分钟,我的服务器的CPU利用率超过了指定的阈值(70%) . 为了验证,我已经从CloudWatch控制台创建了一个警报,它完全相同,但它只针对一个实例 . 这已经自动被发送到 ALARM 状态并且已发送SNS通知 .

为什么会这样?难道我做错了什么?

1 回答

  • 4

    首先,为了安全起见,我会从上面发布的代码中删除您的帐户ID!

    您没有收集警报的数据,因为维度被设置为,但您没有为该变量提供任何值 .

    您需要遍历实例并为每个实例创建一个警报,如下所示:

    import boto3
    import collections
    from datetime import datetime
    import calendar
    
    client = boto3.client('cloudwatch')
    ec = boto3.client('ec2')
    
    def lambda_handler(event, context):
        reservations = ec.describe_instances()
            for r in reservations['Reservations']:
                for i in r['Instances']:
                    instance_id = i['InstanceId']
                    for t in i['Tags']:
                        if t['Key'] == 'Name':
                            iname = t['Value']
                            alarm = client.put_metric_alarm(
                            AlarmName='CPU Alarm ' + iname ,
                            MetricName='CPUUtilization',
                            Namespace='AWS/EC2',
                            Statistic='Average',
                            ComparisonOperator='GreaterThanOrEqualToThreshold',
                            Threshold=70.0,
                            Period=300,
                            EvaluationPeriods=1,
                            Dimensions=[
                                {
                                    'Name': 'InstanceId',
                                    'Value': instance_id
                                }
                            ],
                            Unit='Percent',
                            ActionsEnabled=True,
                            AlarmActions=['arn:aws:sns:us-east-1:012345678912:CloudWatch'])
    

    您需要将 describe_instances 过滤到您想要的实例并且您需要'll need to change the account ID at the bottom, but that should create an alarm for each of the 20 instances with an alarm name of ' CPU Alarm i-whatevertheinstanceIDis'

相关问题