|
|
@@ -0,0 +1,73 @@
|
|
|
+import boto3
|
|
|
+import os,time
|
|
|
+from botocore.exceptions import ClientError
|
|
|
+from datetime import datetime, timedelta, timezone
|
|
|
+
|
|
|
+client = boto3.client('ec2')
|
|
|
+ec2 = boto3.resource('ec2')
|
|
|
+ddb = boto3.resource('dynamodb')
|
|
|
+
|
|
|
+# 'EBS-Snapshot-Lifecycle' is the table you store snapshot metadata, modify it to your own table name
|
|
|
+table = ddb.Table('EBS-Snapshot-Lifecycle')
|
|
|
+
|
|
|
+# set days to keep 快照保留周期
|
|
|
+DAYS_TO_RETAIN = 7
|
|
|
+
|
|
|
+def lambda_handler(event, context):
|
|
|
+
|
|
|
+ os.environ['TZ'] = 'Asia/Shanghai'
|
|
|
+ time.tzset()
|
|
|
+ i=time.strftime('%X %x %Z')
|
|
|
+
|
|
|
+ # set volume id, get volume who has a tag-key is 'Snapshot'
|
|
|
+ describe_volumes=client.describe_volumes(
|
|
|
+ Filters=[
|
|
|
+ {
|
|
|
+ 'Name': 'tag-key',
|
|
|
+ 'Values': ['Snapshot',
|
|
|
+ ]
|
|
|
+
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ )
|
|
|
+ volume_id_list = []
|
|
|
+ for vol in describe_volumes['Volumes']:
|
|
|
+ volume_id_list.append(vol.get('VolumeId'))
|
|
|
+
|
|
|
+ # set snapshot
|
|
|
+ for volume_id in volume_id_list:
|
|
|
+ volume = ec2.Volume(volume_id)
|
|
|
+
|
|
|
+ for tags in volume.tags:
|
|
|
+ if(tags.get('Key') == 'Name'):
|
|
|
+ volume_name = tags.get('Value')
|
|
|
+ description = volume_name + ' volume snapshot is created at ' + i
|
|
|
+
|
|
|
+ try:
|
|
|
+ response = client.create_snapshot(
|
|
|
+ Description=description,
|
|
|
+ VolumeId=volume_id)
|
|
|
+ except:
|
|
|
+ print('Create Snapshot occured error, Volume id is ' + volume_id)
|
|
|
+ else:
|
|
|
+ print('Snapshot is created succeed, Snapshot id is ' + response.get('SnapshotId'))
|
|
|
+
|
|
|
+ # write into DynanoDB table
|
|
|
+ snapshot_id = response.get('SnapshotId')
|
|
|
+ start_time = response.get('StartTime')
|
|
|
+ ttl_time = int(start_time.timestamp()) + 86400 * DAYS_TO_RETAIN
|
|
|
+
|
|
|
+ try:
|
|
|
+ table.put_item(
|
|
|
+ Item={
|
|
|
+ 'snapshot_id': snapshot_id,
|
|
|
+ 'create_time': start_time.astimezone(timezone(timedelta(hours=8))).strftime('%X %x %Z'),
|
|
|
+ 'description': description,
|
|
|
+ 'timestamp': int(start_time.timestamp()),
|
|
|
+ 'ttl': ttl_time,
|
|
|
+ }
|
|
|
+ )
|
|
|
+ except:
|
|
|
+ print('Write to DynanoDB Table occured error, snapshot id is ' + snapshot_id)
|
|
|
+ else:
|
|
|
+ print('Write to DynanoDB Table succeed, snapshot id is ' + snapshot_id)
|