使用 AWS Lambda 一次为多个实例创建 CPUUtilization 指标警报
Creating Alarm on CPUUtilization Metric for multiple instances at a time using AWS Lambda
我有 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 通知。
为什么会这样?我做错了什么吗?
首先,为了安全起见,我将从上面发布的代码中删除您的帐户 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'])
您需要将 describe_instances
过滤为您想要的实例,并且您需要更改底部的帐户 ID,但这应该会为 20 个实例中的每一个创建一个警报'CPU Alarm i-whatevertheinstanceIDis'
的闹钟名称
我有 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 通知。
为什么会这样?我做错了什么吗?
首先,为了安全起见,我将从上面发布的代码中删除您的帐户 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'])
您需要将 describe_instances
过滤为您想要的实例,并且您需要更改底部的帐户 ID,但这应该会为 20 个实例中的每一个创建一个警报'CPU Alarm i-whatevertheinstanceIDis'