Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x AWS Lambda在EC2实例状态下发送邮件_Python 3.x_Aws Lambda_Boto3_Amazon Sns_Amazon Cloudwatch - Fatal编程技术网

Python 3.x AWS Lambda在EC2实例状态下发送邮件

Python 3.x AWS Lambda在EC2实例状态下发送邮件,python-3.x,aws-lambda,boto3,amazon-sns,amazon-cloudwatch,Python 3.x,Aws Lambda,Boto3,Amazon Sns,Amazon Cloudwatch,我创建了一个AWS Lambda函数,每当EC2实例改变状态时发送警报邮件(SNS),效果非常好。为此,我在cloudWatch中创建了一个规则来触发lambda函数&它捕获所有实例细节并发布SNS以发送邮件 当前功能: 1.触发点-实例状态的更改 2.Lambda触发-捕获实例状态(正在运行/已停止) 3.Lambda发布SNS邮件-邮件具有所有EC2实例的实例状态详细信息(正在运行/已停止),即使是状态未更改的实例 所需功能: 1.触发点-实例状态的更改 2.Lambda触发-捕获实例状态(

我创建了一个AWS Lambda函数,每当EC2实例改变状态时发送警报邮件(SNS),效果非常好。为此,我在cloudWatch中创建了一个规则来触发lambda函数&它捕获所有实例细节并发布SNS以发送邮件

当前功能: 1.触发点-实例状态的更改 2.Lambda触发-捕获实例状态(正在运行/已停止) 3.Lambda发布SNS邮件-邮件具有所有EC2实例的实例状态详细信息(正在运行/已停止),即使是状态未更改的实例

所需功能: 1.触发点-实例状态的更改 2.Lambda触发-捕获实例状态(正在运行/已停止) 3.Lambda发布SNS邮件-邮件应仅发送已更改的ec2实例的实例状态详细信息(正在运行/已停止)

提前谢谢

Lambda代码:

import boto3
import json
import logging
import datetime 
import os
from botocore.exceptions import ClientError
from datetime import timedelta

region ='us-east-1'
ec2 = boto3.resource('ec2',region)
client = boto3.client('ec2',region)
snsClient = boto3.client('sns',region)


def lambda_handler(event, context):
    global stop
    global start
    stop = ec2.instances.filter(Filters=[{'Name': 'instance-state-name', 'Values': ['stopped']}])
    start = ec2.instances.filter(Filters=[{'Name': 'instance-state-name', 'Values': ['running']}])
    for instance1 in stop:
        print('Ec2 Instances which are stopped: ', 'Instance ID: ', instance1.id, 'Instance state: ', instance1.state, 'Instance type: ',instance1.instance_type)
    for instance2 in start:
        print('Ec2 Instances which are running: ', 'Instance ID: ', instance2.id, 'Instance state: ', instance2.state, 'Instance type: ',instance2.instance_type)
    publish_sns()   


def publish_sns():
    print('Publish Messsage to SNS Topic')
    subject_str = 'Alert! EC2 Instances Started / Stopped'
    affected_instances1 = [instance1.id for instance1 in stop]
    affected_instances2 = [instance2.id for instance2 in start]
    DT = datetime.datetime.now() + timedelta(hours = 5.5)

    Waqt = DT.strftime("%Y-%m-%d %H:%M:%S")
    msg = '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nHello Team, \n\nFollowing EC2 instances have been started / stopped: \n\nStopped instances: \n'+ str(affected_instances1)+ '\n\nStarted instances: \n'+str(affected_instances2)+'\n\nInstance state changed time IST: '+str(Waqt)+'\n\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^'
    response = snsClient.publish(TopicArn=os.environ['SNSARN'],Message=msg,Subject=subject_str)

您的lambda是通过两个参数(event和context)调用的,您应该使用event,因为它包含关于EC2实例更改的信息,而不是查询EC2.instance,后者将始终返回所有实例,而不管它们的状态如何更改


不管您的实现如何,您描述的是能够知道所有实例的先前状态,并在发送电子邮件之前过滤未更改的实例。您可以将整个数组保存到数据库中,并在lambda被状态更改调用时将其进行比较。

使用两个参数调用lambda-event和context-您应该使用event,因为它包含有关EC2实例更改的信息,而不是查询EC2.instance,后者将始终返回所有实例让他们的状态改变


不管您的实现如何,您描述的是能够知道所有实例的先前状态,并在发送电子邮件之前过滤未更改的实例。您可以将整个数组保存到数据库中,并在lambda被状态更改调用时将其进行比较。

您的问题到底是什么?某些功能不起作用,是否需要其他功能?当前脚本:发送包含所有实例状态的邮件我的要求:它应该只发送状态已更改的实例的实例状态详细信息。@Exelian为了更好地理解,我已编辑了我的问题。。希望这有帮助你的问题到底是什么?某些功能不起作用,是否需要其他功能?当前脚本:发送包含所有实例状态的邮件我的要求:它应该只发送状态已更改的实例的实例状态详细信息。@Exelian为了更好地理解,我已编辑了我的问题。。希佩雷茨,我感谢你的努力回答我的问题。你能建议我如何实施它吗。因为与S3相比,DBs似乎相对昂贵。我可以每2分钟设置一次EC2实例的日志记录吗?当实例状态发生变化时,我可以使用lambda比较S3日志数据,并在邮寄之前过滤掉未更改的实例。这是个好主意吗??请建议我,我无法创建cloudwatch规则来保存EC2实例状态详细信息,以便每2分钟登录一次S3。。在cloudwatch规则中,目标服务没有S3。boto3中是否有一个选项来获取实例从运行更改为停止或停止运行的时间,以便我可以筛选出未更改的实例,并只发送更改的实例的状态。嗨,Peretz,感谢您回答我的问题。你能建议我如何实施它吗。因为与S3相比,DBs似乎相对昂贵。我可以每2分钟设置一次EC2实例的日志记录吗?当实例状态发生变化时,我可以使用lambda比较S3日志数据,并在邮寄之前过滤掉未更改的实例。这是个好主意吗??请建议我,我无法创建cloudwatch规则来保存EC2实例状态详细信息,以便每2分钟登录一次S3。。在cloudwatch规则中,目标服务没有S3,boto3中是否有一个选项来获取实例从运行更改为停止或停止更改为运行的时间,以便我可以筛选出未更改的实例,并只发送更改的实例的状态。。