用于检查特定标记是否存在的Lambda函数-python

时间:2018-06-12 18:07:27

标签: python amazon-web-services amazon-ec2 aws-lambda

我想要关注:

获取以下任何一个EC2实例:

  1. 标记为标记所有者,值为未知或未知
  2. 缺少标签所有者
  3. 我能够完成1)但不知道如何获得2)

    import boto3   
    import collections     
    import datetime     
    import time     
    import sys 
    
    ec = boto3.client('ec2', 'eu-west-1')     
    ec2 = boto3.resource('ec2', 'eu-west-1')     
    
    
    def lambda_handler(event, context):           
        instance_ids = []
        reservations = ec.describe_instances(     
            Filters=[     
                {'Name': 'tag:Owner', 'Values': ['Unknown', 'unknown']},     
            ]     
        ).get('Reservations', []) 
    
        for reservation in reservations:
              instances = reservation['Instances']
              for instance in instances:
                  instance_ids.append(instance['InstanceId'])
    
        print("Stopping instances: {}".format(','.join(instance_ids)))
    

2 个答案:

答案 0 :(得分:2)

就像我在评论中说的那样,您想放弃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"

如果您的帐户中有大量实例,则对describe_instances的响应可能会被分页,您也必须处理它。

答案 1 :(得分:0)

结合我的问题代码和@Rage答案我设法得到了我想要的东西

再次感谢RaGe !!

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))