使用 AWS Lambda 一次为多个实例创建 CPUUtilization 指标警报

pru*_*hvi 3 lambda alarm amazon-web-services amazon-cloudwatch

我有 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
Run Code Online (Sandbox Code Playgroud)

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

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

App*_*ins 7

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

您没有为警报收集数据,因为维度被设置为 {instance_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'])
Run Code Online (Sandbox Code Playgroud)

您需要将您的describe_instances实例过滤为所需的实例,并且需要更改底部的帐户 ID,但这应该为 20 个实例中的每个实例创建一个警报,警报名称为“CPU Alarm i-whatevertheinstanceIDis”