作成

2016-11-04 3 views
0
Iは https://serverlesscode.com/post/lambda-schedule-ebs-snapshot-backups/ & & https://serverlesscode.com/post/lambda-schedule-ebs-snapshot-backups-2/

作成

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}, 
     ] 
    ) 

に従ってタグ[バックアップまたはバックアップ]を有するインスタンスのスナップショットを作成するには、以下のスクリプトを使用してみました

コードは正常に機能しましたが、ヌル応答が返されました。

Found 0 instances that need backing up 

コンソールに2つのインスタンスがあり、タグ名バックアップで実行しています。次に、ヌル・レスポンスの背後にある理由は何でしょうか?

答えて

0

私はそれを解決しました。私は間違った方法でタグを割り当てていました。

+0

これはどうやって伝えられますか? :-)私は同じ問題を抱えています。 – Mathias

+0

すべてのインスタンスにタグがあります。コードによると、バックアップまたはバックアップというタグを持つすべてのインスタンスのスナップショットが作成されます。したがって、タグのセクションに移動し、バックアップが必要なすべてのインスタンスにタグを追加します。これで解決します。 – prudhvi

+0

ありがとう、これは働いた..私は2つの異なる地域で働いていたので、それはなぜ働いていないのですか.. – Mathias

0

私は同様の問題があったと私はわずかに異なるフィルタリングでそれを解決してきました:

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

そして、私のインスタンスごとに、私は私がキーフィールドに設定されたタグを設定してバックアップしたいですtoBackupおよびフィールドをyesまたはYesに設定します。

this answermootmootから、ラッセル・ボールトリーニブログFiltering AWS resources with Boto3を指し示します。

0

ラムダコンソールで、関数>ラムダ関数を作成 - >構成関数をナビゲートします。次に、次のパラメータを使用します。名前、説明、ランタイム。私は以下のコードをPython用AWS SDKにある後のBotoライブラリを使用:

# 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}]) 

それはすべての地域ですべてのボリュームのスナップショットを作成します。さらに、作成したスナップショット名タグにボリュームの名前を追加します。したがって、スナップショットのリストを確認するのがより簡単になります。