如果删除了卷,则删除快照
delete the snapshot if its volume is deleted
我需要删除 EBS 卷已删除的 Elastic Block Store 卷的快照。我想使用 Lambda 函数来执行此操作。我写了一个脚本,如果 EBS 卷不存在,它会给我 false。如何修改它以删除任何相关快照?
def get_snapshots():
account_ids = list()
account_ids.append( boto3.client('sts').get_caller_identity().get('Account'))
return ec2.describe_snapshots(OwnerIds=account_ids)
def volume_exists(volume_id):
if not volume_id: return ''
try:
ec2.describe_volumes(VolumeIds=[volume_id])
return True
except ClientError:
return False
def lambda_handler(event, context):
with open('/tmp/report.csv', 'w') as csvfile:
writer = csv.writer(csvfile)
writer.writerow([
'volume exists'
])
snaps = get_snapshots()
for snap in snaps.get('Snapshots'):
writer.writerow([
str(volume_exists(snap['VolumeId']))
])
有什么建议吗?
这里有一些代码可以删除没有现有卷的快照:
import boto3
ec2_client = boto3.client('ec2')
# Make a list of existing volumes
volume_response = ec2_client.describe_volumes()
volumes = [volume['VolumeId'] for volume in volume_response['Volumes']]
# Find snapshots without existing volume
snapshot_response = ec2_client.describe_snapshots(OwnerIds=['self'])
for snapshot in snapshot_response['Snapshots']:
if snapshot['VolumeId'] not in volumes:
delete_response = ec2_client.delete_snapshot(SnapshotId=snapshot['SnapshotId'])
或者,这是一个使用 resource
而不是 client
的版本:
import boto3
ec2_resource = boto3.resource('ec2')
# Make a list of existing volumes
all_volumes = ec2_resource.volumes.all()
volumes = [volume.volume_id for volume in all_volumes]
# Find snapshots without existing volume
snapshots = ec2_resource.snapshots.filter(OwnerIds=['self'])
for snapshot in snapshots:
if snapshot.volume_id not in volumes:
snapshot.delete()
如果它们如您所愿,您需要将其合并到 Lambda 函数中。
(除了根据本网站服务条款授予的许可外,此 post 的内容还根据 MIT-0 获得许可。)
最好的方法是创建一个“EBS 删除”云监视事件并触发一个 lambda。 lambda 中事件的有效负载为您提供有关已删除卷的所有信息。从那里您可以查询快照并删除它们。
为此,转到 Cloudwatch -> 事件 -> 规则 并创建一个新规则,如下面的屏幕截图所示:
您还可以在此处附加您的 lambda。我会一直走 Event 路。
我需要删除 EBS 卷已删除的 Elastic Block Store 卷的快照。我想使用 Lambda 函数来执行此操作。我写了一个脚本,如果 EBS 卷不存在,它会给我 false。如何修改它以删除任何相关快照?
def get_snapshots():
account_ids = list()
account_ids.append( boto3.client('sts').get_caller_identity().get('Account'))
return ec2.describe_snapshots(OwnerIds=account_ids)
def volume_exists(volume_id):
if not volume_id: return ''
try:
ec2.describe_volumes(VolumeIds=[volume_id])
return True
except ClientError:
return False
def lambda_handler(event, context):
with open('/tmp/report.csv', 'w') as csvfile:
writer = csv.writer(csvfile)
writer.writerow([
'volume exists'
])
snaps = get_snapshots()
for snap in snaps.get('Snapshots'):
writer.writerow([
str(volume_exists(snap['VolumeId']))
])
有什么建议吗?
这里有一些代码可以删除没有现有卷的快照:
import boto3
ec2_client = boto3.client('ec2')
# Make a list of existing volumes
volume_response = ec2_client.describe_volumes()
volumes = [volume['VolumeId'] for volume in volume_response['Volumes']]
# Find snapshots without existing volume
snapshot_response = ec2_client.describe_snapshots(OwnerIds=['self'])
for snapshot in snapshot_response['Snapshots']:
if snapshot['VolumeId'] not in volumes:
delete_response = ec2_client.delete_snapshot(SnapshotId=snapshot['SnapshotId'])
或者,这是一个使用 resource
而不是 client
的版本:
import boto3
ec2_resource = boto3.resource('ec2')
# Make a list of existing volumes
all_volumes = ec2_resource.volumes.all()
volumes = [volume.volume_id for volume in all_volumes]
# Find snapshots without existing volume
snapshots = ec2_resource.snapshots.filter(OwnerIds=['self'])
for snapshot in snapshots:
if snapshot.volume_id not in volumes:
snapshot.delete()
如果它们如您所愿,您需要将其合并到 Lambda 函数中。
(除了根据本网站服务条款授予的许可外,此 post 的内容还根据 MIT-0 获得许可。)
最好的方法是创建一个“EBS 删除”云监视事件并触发一个 lambda。 lambda 中事件的有效负载为您提供有关已删除卷的所有信息。从那里您可以查询快照并删除它们。
为此,转到 Cloudwatch -> 事件 -> 规则 并创建一个新规则,如下面的屏幕截图所示:
您还可以在此处附加您的 lambda。我会一直走 Event 路。