2016-11-04 2 views
0

ich mit dem folgende Skript versucht, Snapshots für Instanzen zu erstellen, den Tag Namen [Backup oder Backup] nach https://serverlesscode.com/post/lambda-schedule-ebs-snapshot-backups/ & & https://serverlesscode.com/post/lambda-schedule-ebs-snapshot-backups-2/Erstellung von Snapshots AWS Lambda mit

import boto3 
import collections 
import datetime 

ec = boto3.client('ec2') 

def lambda_handler(event, context): 
    reservations = ec.describe_instances(
     Filters=[ 
      {'Name': 'tag-key', 'Values': ['backup', 'Backup']}, 
     ] 
    ).get(
     '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: 
    try: 
     retention_days = [ 
      int(t.get('Value')) for t in instance['Tags'] 
      if t['Key'] == 'Retention'][0] 
    except IndexError: 
     retention_days = 7 

    for dev in instance['BlockDeviceMappings']: 
     if dev.get('Ebs', None) is None: 
      continue 
     vol_id = dev['Ebs']['VolumeId'] 
     print "Found EBS volume %s on instance %s" % (
      vol_id, instance['InstanceId']) 

     snap = ec.create_snapshot(
      VolumeId=vol_id, 
     ) 

     to_tag[retention_days].append(snap['SnapshotId']) 

     print "Retaining snapshot %s of volume %s from instance %s for %d days" % (
      snap['SnapshotId'], 
      vol_id, 
      instance['InstanceId'], 
      retention_days, 
     ) 


for retention_days in to_tag.keys(): 
    delete_date = datetime.date.today() + datetime.timedelta(days=retention_days) 
    delete_fmt = delete_date.strftime('%Y-%m-%d') 
    print "Will delete %d snapshots on %s" % (len(to_tag[retention_days]), delete_fmt) 
    ec.create_tags(
     Resources=to_tag[retention_days], 
     Tags=[ 
      {'Key': 'DeleteOn', 'Value': delete_fmt}, 
     ] 
    ) 

mit Der Code funktionierte gut, gab aber eine Nullantwort zurück mit den Worten:

Found 0 instances that need backing up 

Ich habe zwei Instanzen in meiner Konsole mit dem Namen Backup. Was könnte dann der Grund für die Nullantwort sein?

Antwort

0

Ich habe es gelöst. Ich habe meine Tags bis jetzt falsch zugeordnet.

+0

Können Sie mir sagen, wie Sie das getan haben? :-) Ich habe das gleiche Problem .. – Mathias

+0

Jede Instanz hat Tags. Gemäß dem Code werden Snapshots für alle Instanzen erstellt, die ein Tag Backup oder Backup haben. Gehen Sie also zum Abschnitt "Tags" und fügen Sie das Tag allen Instanzen hinzu, für die Sie eine Sicherung benötigen. Dies wird gelöst. – prudhvi

+0

danke, das hat geklappt .. ich habe in zwei verschiedenen Regionen gearbeitet, deshalb funktioniert es nicht .. – Mathias

0

Ich hatte ein ähnliches Problem, und ich habe es mit einer etwas anderen Filterung gelöst:

Filters=[ 
     {'Name': 'tag:toBackup', 'Values': ['yes', 'Yes']}, 
    ] 

Und für jedes meiner Instanzen Ich möchte Backup-Set ich einen Tag, das Key Feld gesetzt toBackup und Wert Feld entweder auf yes oder Yes festgelegt.

Inspiriert von this answer von mootmoot, die auf Russell Ballestrini Blog Filtering AWS resources with Boto3 zeigen.

0

Navigieren Sie in der Lambda-Konsole durch Funktionen> Erstellen Sie eine Lambda-Funktion -> Konfigurieren Sie die Funktion. Verwenden Sie dann die folgenden Parameter: Name, Beschreibung, Laufzeit. Ich benutzen die Boto-Bibliothek, die für den Code unten in dem AWS SDK für Python ist:

# Backup all in-use volumes in all regions 


import boto3 

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

    # Get list of regions 
    regions = ec2.describe_regions().get('Regions',[]) 

    # Iterate over regions 
    for region in regions: 
     print "Checking region %s " % region['RegionName'] 
     reg=region['RegionName'] 

     # Connect to region 
     ec2 = boto3.client('ec2', region_name=reg) 

     # Get all in-use volumes in all regions 
     result = ec2.describe_volumes(Filters=[{'Name': 'status', 'Values': ['in-use']}]) 

     for volume in result['Volumes']: 
      print "Backing up %s in %s" % (volume['VolumeId'], volume['AvailabilityZone']) 

      # Create snapshot 
      result = ec2.create_snapshot(VolumeId=volume['VolumeId'],Description='Created by Lambda backup function ebs-snapshots') 

      # Get snapshot resource 
      ec2resource = boto3.resource('ec2', region_name=reg) 
      snapshot = ec2resource.Snapshot(result['SnapshotId']) 

      volumename = 'N/A' 

      # Find name tag for volume if it exists 
      if 'Tags' in volume: 
       for tags in volume['Tags']: 
        if tags["Key"] == 'Name': 
         volumename = tags["Value"] 

      # Add volume name to snapshot for easier identification 
      snapshot.create_tags(Tags=[{'Key': 'Name','Value': volumename}]) 

Es Schnappschüsse für jedes Volumen in allen Regionen schaffen. Darüber hinaus wird der Name des Volumes dem erstellten Snapshot-Namens-Tag hinzugefügt. So wird es einfacher sein, die Liste der Snapshots zu sehen.