Python Lambda函数,用于检查特定标记是否不存在

Python Lambda函数,用于检查特定标记是否不存在,python,amazon-web-services,amazon-ec2,aws-lambda,Python,Amazon Web Services,Amazon Ec2,Aws Lambda,我正在尝试获得以下信息: 获取所有符合以下条件之一的EC2实例: 使用标记所有者和值Unknown或Unknown标记 你是丢失的标签所有者吗 我能够完成1)但不知道如何完成2) 正如我在评论中所说,您希望放弃Owner过滤器,以便您的响应也包括没有Owner标记的实例,然后您可以在本地进行过滤 reservations = ec.describe_instances().get('Reservations', []) for reservation in reservations: f

我正在尝试获得以下信息:

获取所有符合以下条件之一的EC2实例:

  • 使用标记所有者和值Unknown或Unknown标记
  • 你是丢失的标签所有者吗
  • 我能够完成1)但不知道如何完成2)


    正如我在评论中所说,您希望放弃
    Owner
    过滤器,以便您的响应也包括没有Owner标记的实例,然后您可以在本地进行过滤

    reservations = ec.describe_instances().get('Reservations', [])
    for reservation in reservations:
        for instance in reservation['Instances']:
            tags = {}
            for tag in instance['Tags']:
                tags[tag['Key']] = tag['Value']
    
            if not 'Owner' in tags:
                print instance['InstanceId'] + " does not have Owner tag"
            elif tags['Owner'] in ['Unknown', 'unknown']:
                print instance['InstanceId'] + " has [U|u]nknown Owner tag"
    

    如果您的帐户中有大量实例,描述实例的响应可能会被分页,您也必须处理这个问题。

    将我的问题和@Rage-answer中的代码结合起来,我成功地得到了我想要的

    再次感谢你

    import boto3   
    import collections     
    import datetime     
    import time     
    import sys 
    
    ses = boto3.client('ses')
    
    email_from = 'Email'
    email_to = 'Email'
    email_cc = 'Email'
    emaiL_subject = 'Subject'
    email_body = 'Body'
    
    
    
    
    
    
    ec = boto3.client('ec2', 'eu-west-1')     
    ec2 = boto3.resource('ec2', 'eu-west-1')     
    from datetime import datetime
    from dateutil.relativedelta import relativedelta
    
    #create date variables 
    
    date_after_month = datetime.now()+ relativedelta(days=7)
    #date_after_month.strftime('%d/%m/%Y')
    today=datetime.now().strftime('%d/%m/%Y')
    
    
    
    
    
    
    def lambda_handler(event, context): 
      #Get instances with Owner Taggs and values Unknown/known
        instance_ids = []
        reservations = ec.describe_instances().get('Reservations', []) 
    
        for reservation in reservations:
         for instance in reservation['Instances']:
            tags = {}
            for tag in instance['Tags']:
                tags[tag['Key']] = tag['Value']
            if not 'Owner' in tags or tags['Owner']=='unknown' or tags['Owner']=='Unknown':
                  instance_ids.append(instance['InstanceId'])  
    
                    #Check if "TerminateOn" tag exists:
    
                  if 'TerminateOn' in tags:  
                      #compare TerminteOn value with current date
                        if tags["TerminateOn"]==today:
    
                        #Check if termination protection is enabled
                         terminate_protection=ec.describe_instance_attribute(InstanceId =instance['InstanceId'] ,Attribute = 'disableApiTermination')
                         protection_value=(terminate_protection['DisableApiTermination']['Value'])
                         #if enabled disable it
                         if protection_value == True:
                            ec.modify_instance_attribute(InstanceId=instance['InstanceId'],Attribute="disableApiTermination",Value= "False" )
                        #terminate instance 
                         ec.terminate_instances(InstanceIds=instance_ids)
                         print "terminated" + str(instance_ids)
                         #send email that instance is terminated
    
                        else: 
                        #Send an email to engineering that this instance will be removed X amount of days (calculate the date based on today's date and the termination date."
    
                          now=datetime.now()
                          future=tags["TerminateOn"]
                          TerminateOn = datetime.strptime(future, "%d/%m/%Y")
                          days= (TerminateOn-now).days
                          print str(instance_ids) +  " will be removed in "+ str(days) + " days"
    
    
                  else: 
                     if not 'TerminateOn' in tags:#, create it  
                      ec2.create_tags(Resources=instance_ids,Tags=[{'Key':'TerminateOn','Value':date_after_month.strftime('%d/%m/%Y')}])
                      ec.stop_instances(InstanceIds=instance_ids)
    
                      print "was shut down "+format(','.join(instance_ids))
    

    不要将
    Owner
    用作标记过滤器,因为您显然希望包含没有Owner标记的实例。然后,您可以在返回的实例中查找没有所有者标记的实例
    import boto3   
    import collections     
    import datetime     
    import time     
    import sys 
    
    ses = boto3.client('ses')
    
    email_from = 'Email'
    email_to = 'Email'
    email_cc = 'Email'
    emaiL_subject = 'Subject'
    email_body = 'Body'
    
    
    
    
    
    
    ec = boto3.client('ec2', 'eu-west-1')     
    ec2 = boto3.resource('ec2', 'eu-west-1')     
    from datetime import datetime
    from dateutil.relativedelta import relativedelta
    
    #create date variables 
    
    date_after_month = datetime.now()+ relativedelta(days=7)
    #date_after_month.strftime('%d/%m/%Y')
    today=datetime.now().strftime('%d/%m/%Y')
    
    
    
    
    
    
    def lambda_handler(event, context): 
      #Get instances with Owner Taggs and values Unknown/known
        instance_ids = []
        reservations = ec.describe_instances().get('Reservations', []) 
    
        for reservation in reservations:
         for instance in reservation['Instances']:
            tags = {}
            for tag in instance['Tags']:
                tags[tag['Key']] = tag['Value']
            if not 'Owner' in tags or tags['Owner']=='unknown' or tags['Owner']=='Unknown':
                  instance_ids.append(instance['InstanceId'])  
    
                    #Check if "TerminateOn" tag exists:
    
                  if 'TerminateOn' in tags:  
                      #compare TerminteOn value with current date
                        if tags["TerminateOn"]==today:
    
                        #Check if termination protection is enabled
                         terminate_protection=ec.describe_instance_attribute(InstanceId =instance['InstanceId'] ,Attribute = 'disableApiTermination')
                         protection_value=(terminate_protection['DisableApiTermination']['Value'])
                         #if enabled disable it
                         if protection_value == True:
                            ec.modify_instance_attribute(InstanceId=instance['InstanceId'],Attribute="disableApiTermination",Value= "False" )
                        #terminate instance 
                         ec.terminate_instances(InstanceIds=instance_ids)
                         print "terminated" + str(instance_ids)
                         #send email that instance is terminated
    
                        else: 
                        #Send an email to engineering that this instance will be removed X amount of days (calculate the date based on today's date and the termination date."
    
                          now=datetime.now()
                          future=tags["TerminateOn"]
                          TerminateOn = datetime.strptime(future, "%d/%m/%Y")
                          days= (TerminateOn-now).days
                          print str(instance_ids) +  " will be removed in "+ str(days) + " days"
    
    
                  else: 
                     if not 'TerminateOn' in tags:#, create it  
                      ec2.create_tags(Resources=instance_ids,Tags=[{'Key':'TerminateOn','Value':date_after_month.strftime('%d/%m/%Y')}])
                      ec.stop_instances(InstanceIds=instance_ids)
    
                      print "was shut down "+format(','.join(instance_ids))