为什么我的 CloudWatch 警报未应用于 EC2 实例?

Why is my CloudWatch alarm not being applied to the EC2 instances?

我在 Lambda 函数中有 python 代码,用于将 CloudWatch 警报应用于 EC2 实例。

如果它们在 10 分钟内没有响应,CloudWatch 警报将重新启动它们。这个警报很容易在每个 EC2 实例的基础上制作,但这是很多手动工作,我们有很多服务器。

我已经设置了一个 CloudWatch 规则,当 EC2 实例在重启后进入“'running'”状态时,或者在新的 EC2 实例启动并进入“'running''。

我已经尝试在我的代码中指定一个特定的服务器,并且成功了。但是,我想要的是在服务器重新启动时将其应用于服务器的一段代码;因此,在维护 windows 到来时将它们全部覆盖,并且它们都将重新启动。

from collections import defaultdict

import boto3

ec2_sns = 'SNS-Topic:'
ec2_rec ="arn:aws:automate:eu-central-1:ec2:recover"    

def lambda_handler(event, context):
ec2 = boto3.resource('ec2')
cw = boto3.client('cloudwatch')
ec2info = defaultdict()
running_instances = ec2.instances.filter(Filters=[{'Name': 'tag- 
key','Values': ['cloudwatch'],}])
for instance in running_instances:
    for tag in instance.tags:
        if 'Name'in tag['Key']:
            name = tag['Value']

            ec2info[instance.id] = {'Name': 
name,'InstanceId':instance.instance_id,}

            attributes = ['Name','InstanceId']
            for instance_id, instance in ec2info.items():
                    instanceid =instance["InstanceId"]
                    nameinsta = instance["Name"]
                    print(instanceid,nameinsta )

                     #Create StatusCheckFailed Alamrs
                    cw.put_metric_alarm(
                     AlarmName = ('InstanceId') + 
"_System_Unresponsive_(Created by Lambda)",
                     AlarmDescription='System_unresponsive for 10 
minutes',
                     ActionsEnabled=True,
                     OKActions=[
                         'No data',
                     ],
                     AlarmActions=[
                         'arn:aws:lambda:eu-central 
1:788677770941:function:System_unresponsive:reboot',
                     ],
                     InsufficientDataActions=[
                     'Insuficient data',
                     ],
                     MetricName='StatusCheckFailed',
                     Namespace='AWS/EC2',
                     Statistic='Average',
                     Dimensions=[ {'Name': "InstanceId",'Value': 
 instanceid},],
                     Period=300,
                     Unit='Seconds',
                     EvaluationPeriods=2,
                     DatapointsToAlarm=2,
                     Threshold=1,
                     ComparisonOperator='LessThanOrEqualToThreshold')

我希望代码在服务器重新启动时将指定的 CloudWatch 警报应用到服务器,但它没有。

当您测试它时,您得到的结果是“'null'”。

您可以使用 CloudTrail 深入了解 AWS 正在执行的 API 调用以启动实例并使用 CloudWatch Events 仅捕获那些特定事件。

一旦捕捉到正确的事件并将它们发送到 lambda,lambda 将在事件信息中接收实例 ID。您可以使用该信息 create/update 仅针对事件中包含的实例发出警报。您可以在函数内部使用 print(json.dumps(event)) 检查 CloudWatch Logs 中的事件内容。