2017-08-21 3 views
0

J'essaie d'ajouter une balise à une fonction AWS lambda qui crée des AMI d'instances EC2. Ci-dessous la fonction lambda J'utilise:Ajout de balises au script de sauvegarde lambda EC2 AWS

import boto3 
import collections 
import datetime 
import sys 
import pprint 

ec = boto3.client('ec2') 
retention_days = 7 
def lambda_handler(event, context): 

reservations = ec.describe_instances(
    Filters=[ 
     {'Name': 'tag-key', 'Values': ['backup', 'Backup', 'Client']}, 
    ] 
).get(
    'Reservations', [] 
) 
print (reservations) 
instances = sum(
    [ 
     [i for i in r['Instances']] 
     for r in reservations 

    ], []) 

print "Found %d instances that need backing up" % len(instances) 

to_tag = collections.defaultdict(list) 

for instance in instances: 
     name_tag = [ 
      str(t.get('Value')) for t in instance['Tags'] 
      if t['Key'] == 'Name'][0] 
     print (name_tag) 
     print ("check_loop") 

     create_time = datetime.datetime.now() 
     create_fmt = create_time.strftime('%Y-%m-%d') 

     AMIid = ec.create_image(InstanceId=instance['InstanceId'], Name="Lambda12 - " + instance['InstanceId'] + " " + name_tag +" from " + create_fmt, Description="Lambda created AMI of instance " + instance['InstanceId'] + " " + name_tag + " from " + create_fmt, NoReboot=True, DryRun=False) 
     to_tag[retention_days].append(AMIid['ImageId']) 

     delete_date = datetime.date.today() + datetime.timedelta(days=retention_days) 
     delete_fmt = delete_date.strftime('%m-%d-%Y') 


     instancename = '' 
     for tags in instance["Tags"]: 
      if tags["Key"] == 'Client': 
       print ("This is instance inside if with key" + tags["Key"]) 
       instancename = tags["Value"] 
       print ("This is instancename" + instancename) 
       ec.create_tags (
        DryRun=False, 
        Resources=to_tag[retention_days], 
        Tags=[ 
          {'Key': 'Client', 'Value': instancename}, 
        ] 
       ) 
      print "This is last instancename" + instancename 

     ec.create_tags(
      Resources=to_tag[retention_days], 
      Tags=[ 
        {'Key': 'DeleteOn', 'Value': delete_fmt}, 
       ] 
     ) 


     print ("Name tag " + name_tag) 
     print ("check_loopend") 

Maintenant, les questions que je fais face dans ce code est lié à cette partie:

instancename = '' 
    for tags in instance["Tags"]: 
     if tags["Key"] == 'Client': 
      print ("This is instance inside if with key" + tags["Key"]) 
      instancename = tags["Value"] 
      print ("This is instancename" + instancename) 
      ec.create_tags (
       DryRun=False, 
       Resources=to_tag[retention_days], 
       Tags=[ 
         {'Key': 'Client', 'Value': instancename}, 
       ] 
      ) 
     print "This is last instancename" + instancename 

Je veux ajouter des balises à la MUAS lorsque l'instance a tag du format:

{'Key': 'Client', 'Value': 'XYZ'} 

Où XYZ est la valeur.

Mais quand la boucle ci-dessus se termine, toutes mes instances sont étiquetées avec la valeur qui vient à la dernière itération de la boucle.

Ex.

exemple 1-{'Key': 'Client', 'Value': 'ABC'} exemple 2 - La clé n'existe pas exemple 3-{'Key': 'Client', 'Value': 'XYZ'}

A la fin de ces trois, tous les AMIs respectifs sont s'étiquetés avec: {'Key': 'Client', 'Value': 'XYZ'}

est-il tout ce qui me manque?

Toute aide serait appréciée.

P.S. - Il n'y a pas de problème d'indentation au début du code.

+0

Quel est votre problème actuel? – mootmoot

+0

Jetez un oeil à la section Exemple. Mon problème est dans la boucle où je suis supposé ajouter des balises '{'Key': 'Client', 'Valeur': nom de l'instance}'. Toutes les AMI sont étiquetées avec la seule valeur de la variable 'instancename'. –

Répondre

0

Comme je l'ai utilisé un script très similaire pour mes sauvegardes je peux commenter -

Vous définissez vous variable dans la boucle pour les appareils et faire ensuite le marquage par des groupes d'instances qui ont la même période de conservation. SO vous obtenez la dernière mise à jour à la variable instancename et mettez à jour toutes les instances (en supposant que la plupart partagent un calendrier de rétention) à la fois.