EC2 实例状态更改警报 Lambda、云事件和 SNS

Posted

技术标签:

【中文标题】EC2 实例状态更改警报 Lambda、云事件和 SNS【英文标题】:EC2 instance state change alerts Lambda , Cloud Event & SNS 【发布时间】:2021-01-07 10:33:41 【问题描述】:

我希望如果我的 ec2 的状态发生变化,那么我将收到一个 SNS,其中包含 ec2 名称、实例 ID 和帐户名称、区域。

import boto3

def lambda_handler(event, context):

    # Extract Instance ID from event
    instance_id = event['detail']['instance-id']

    # Obtain information about the instance
    ec2_client = boto3.client('ec2')
    instance_info = ec2_client.describe_instances(InstanceIds=[instance_id])
    instance = instance_info['Reservations'][0]['Instances'][0]

    # Extract name tag
    name_tags = [t['Value'] for t in instance['Tags'] if t['Key']=='Name']
    name = name_tags[0] if name_tags is not None else ''

    # Send message to SNS
    MY_SNS_TOPIC_ARN = 'arn:aws:sns:ap-southeast-2:123456789012:foo'
    sns_client = boto3.client('sns')
    sns_client.publish(
        TopicArn = MY_SNS_TOPIC_ARN,
        Subject = 'Instance Change State: ' + instance_id,
        Message = 'Instance: ' + instance_id + ' has changed state\n' +
                  'State: ' + instance['State']['Name'] + '\n' +
                  'IP Address: ' + instance['PublicIpAddress'] + '\n' +
                  'Name: ' + name
    )

出现以下错误...

START RequestId:7c29aec4-2d51-4b29-91a0-8fc1217397ce 版本:$LATEST “细节”:KeyError 回溯(最近一次通话最后): 文件“/var/task/lambda_function.py”,第 6 行,在 lambda_handler instance_id = event['detail']['instance-id'] KeyError:“详细信息”

【问题讨论】:

你是如何调用函数的?您是否按照Email notification through SNS and Lambda 创建了 CloudWatch 事件?该函数似乎没有从 CloudWatch Events 接收事件信息。 能否在函数处理程序的开头添加print(event) 并检查事件对象结构? 【参考方案1】:

您是否通过 cloudwatch 事件创建触发器并根据 EC2 实例状态更改创建 cloudwatch 事件?

乍一看,事件模式预览是


  "source": [
    "aws.ec2"
  ],
  "detail-type": [
    "EC2 Instance State-change Notification"
  ]

因此,请检查以上内容,并提供有关您的案例的更多信息。

【讨论】:

是的,但它没有给出 EC2 名称。我想要 Ec2 名称。 能否将事件打印出来以便我们检查是否需要自定义用户数据?

以上是关于EC2 实例状态更改警报 Lambda、云事件和 SNS的主要内容,如果未能解决你的问题,请参考以下文章

AWS EC2 高 CPU 警报响起

CloudWatch 自定义 EC2 内存指标和带有 AutoScaling 策略的警报

无法将 s3 与来自 aws lambda 的 ec2 文件夹同步

AWS lambda 使用启动模板和 boto3 创建 ec2 实例,仅使用所需的权限

CloudWatch 自动警报删除执行多次

通过 AWS Lambda 函数访问 EC2 实例服务