【问题标题】:AWS Lambda-create tag if not existsAWS Lambda 创建标签(如果不存在)
【发布时间】:2018-11-22 09:03:00
【问题描述】:

对于每个 AWS 区域

1.获取所有EC2实例

2.被标记为标签所有者和值未知或未知

3.缺少标签所有者

对于每个 EC2 实例

4.检查实例是否有标签“Terminate_On”

否则

5. 使用标签“Terminate_On”和从现在起 7 天后的日期值标记实例。

步骤 1,2 和 3 已完成:

import boto3   
import collections     
import datetime     
import time     
import sys 
from datetime import datetime
from dateutil.relativedelta import relativedelta

ec = boto3.client('ec2', 'eu-west-1')     
ec2 = boto3.resource('ec2', 'eu-west-1')     
date_after_month = datetime.now()+ relativedelta(days=7)
#print date_after_month.strftime('%d/%m/%Y')  

def lambda_handler(event, context):  

    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:
                a =  instance['InstanceId'] + " does not have Owner tag"
            elif tags['Owner'] in ['Unknown', 'unknown']:
                b = instance['InstanceId'] + " has [U|u]nknown Owner tag"
            if not 'TerminateOn' in tags:  
                ec2.create_tags(
                    Resources=[instance['InstanceId']],
                    Tags= [{
                        'Key':'TerminateOn', 
                        'Value':date_after_month.strftime('%d/%m/%Y')}])  
            #print a+" "+b

4.对于上面代码返回的实例(带有Owner标签的实例和没有owner标签的实例)检查Terminate_On标签是否存在

5.如果没有,则使用date_after_month.strftime('%d/%m/%Y') 作为值创建该标签

问题出在第 5 步,如果一个 EC2 实例正在运行,没问题,创建标签,但如果超过一个,则只为第一个创建标签

并显示以下错误:

for tag in instance['Tags']:
KeyError: 'Tags'

【问题讨论】:

  • 添加一些打印语句或日志以查看 instance 变量中的内容

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


【解决方案1】:

完整的解决方案:

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

【讨论】:

  • 我正在尝试做同样的事情,但它在我的代码中不起作用。如果标签不存在,我正在尝试创建一个标签,但我的代码忽略了这些条件。我不能问这个新问题,因为这个问题已经在这里了
  • vtag = ec2.Volume(id=delV) for tag in vtag.tags: has_tag = False if 'Tech.BackUp.Retention.Days' in tag['Key'] 或者不是 'Tech .BackUp.Retention.Days' in tag['Key']: has_tag = True else: print("doesn't exist")
猜你喜欢
  • 2018-12-04
  • 2018-11-01
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 2017-12-25
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多