2017-08-21 1 views
0

Ich versuche, eine AWS-Lambda-Funktion, die AMIs von EC2-Instanzen erstellt, mit einem Tag zu versehen. Unten ist die Lambda-Funktion verwende ich:Hinzufügen von Tags zum EC2 AWS Lambda-Backup-Skript

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

Nun ist die Fragen, die ich in diesem Code zu diesem Teil verwandt bin vor:

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 

Ich mag Tags hinzufügen, um Ami, wenn die Instanz-Tag hat des Formats:

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

Wo XYZ ist der Wert.

Aber irgendwie, wenn die obige Schleife endet, werden alle meine Instanzen mit dem Wert markiert, der bei der letzten Iteration der Schleife kommt.

Ex.

Instanz 1-{'Key': 'Client', 'Value': 'ABC'} Instanz 2 - Key existiert nicht Instanz 3-{'Key': 'Client', 'Value': 'XYZ'}

Am Ende dieser drei, alle entsprechenden AMIs sind mit immer dem Stichwort: {'Key': 'Client', 'Value': 'XYZ'}

Gibt es alles was mir fehlt?

Jede Hilfe wäre willkommen.

P.S. - Es gibt kein Einrückungsproblem am Anfang des Codes.

+0

Was ist Ihr tatsächliches Problem? – mootmoot

+0

Schauen Sie sich den Abschnitt Beispiel an. Mein Problem ist in der Schleife, wo ich die Tags '{'Key': 'Client', 'Value': instancename}' hinzufügen soll. Alle AMIs werden mit einem einzigen Wert der Variablen 'Instanzname' getaggt. –

Antwort

0

verwendete ich ein sehr ähnliches Skript für meine Backups ich kommentieren -

Sie setzen Sie sich für Geräte in der Schleife Variable und dann die Markierung von Gruppen von Fällen zu tun, die die gleiche Aufbewahrungsfrist haben. SO erhalten Sie die letzte Aktualisierung auf den Variablen-Instanznamen und aktualisieren alle Instanzen auf einmal (vorausgesetzt, die meisten teilen einen Aufbewahrungszeitplan).