Python 3.x 删除快照(具有特定说明的快照除外)
我试图删除旧的AWS快照,但我需要排除任何描述值以“CreateImage创建”开头的快照 我尝试了boto3.resource和boto3.client的变体Python 3.x 删除快照(具有特定说明的快照除外),python-3.x,amazon-web-services,aws-lambda,boto3,Python 3.x,Amazon Web Services,Aws Lambda,Boto3,我试图删除旧的AWS快照,但我需要排除任何描述值以“CreateImage创建”开头的快照 我尝试了boto3.resource和boto3.client的变体 from datetime import datetime, timedelta, timezone import boto3 client = boto3.client('ec2') snapshots = client.snapshots.filter(Description!='Created by CreateImage')
from datetime import datetime, timedelta, timezone
import boto3
client = boto3.client('ec2')
snapshots = client.snapshots.filter(Description!='Created by CreateImage')
def lambda_handler(event, context):
for snapshot in snapshots:
start_time = snapshot.start_time
delete_time = datetime.now(tz=timezone.utc) - timedelta(days=790)
if delete_time > start_time:
snapshot.delete()
print('Snapshot with Id = {} is deleted '.format(snapshot.snapshot_id))
现在我有大约10张超过790天的快照,5张以“CreateImage创建”开头,5张没有。在测试这一点时,我想删除那些没有描述的快照
我得到的错误是:
模块初始化错误:“EC2”对象没有属性“snapshots”您需要使用
描述\u snapshots
并正确传入筛选器
此外,结果将是一个字典,而不是对快照类的引用,因此您需要更新提取属性和删除快照的方式
比如:
从datetime导入datetime、timedelta、时区
进口boto3
client=boto3.client('ec2')
快照=客户端。描述\u快照(筛选器=[
{
“名称”:“说明”,
“价值观”:[
'由CreateImage创建',
]
},
])[“快照”]
def lambda_处理程序(事件、上下文):
对于快照中的快照:
开始时间=快照['StartTime']
删除_time=datetime.now(tz=timezone.utc)-timedelta(天=790)
如果删除时间>开始时间:
client.delete_快照(SnapshotId=snapshot['SnapshotId'])
打印('已删除Id为{}的快照'。格式(快照['SnapshotId']))
参考:
这是一个有效的版本 注意使用了
OwnerIds=['self']
,这将结果限制为仅由AWS帐户创建的快照。否则,它将返回由任何AWS帐户创建的所有公共可用快照
from datetime import datetime, timedelta, timezone
import boto3
def lambda_handler(event, context):
delete_time = datetime.now(tz=timezone.utc) - timedelta(days=790)
ec2_resource = boto3.resource('ec2', region_name='ap-southeast-2')
snapshots = ec2_resource.snapshots.filter(OwnerIds=['self'])
for snapshot in snapshots:
if not snapshot.description.startswith('Created by CreateImage') and delete_time > snapshot.start_time:
snapshot.delete()
print('Snapshot with Id = {} is deleted '.format(snapshot.snapshot_id))
使用EC2客户机descripe_snapshots()方法。并对结果进行您自己的筛选-您不能根据“值”进行筛选使用boto3。感谢您的反馈,这很有帮助,但最后我使用了John Rotenstein的解决方案。非常感谢您的时间。只需进行一次小编辑,我想删除描述中没有“CreateImage创建”的所有快照。我将第13行编辑为:“if not snapshot.description.startswith('CreateImage创建')和delete_time>snapshot.start_time:”@John
snapshot.delete()
和client.delete_快照(SnapshotId=id)之间的区别是什么
用于boto3和python3Ah!这是资源与客户机的对比。基本上,客户机方法精确映射AWS API调用。资源方法是一种更具python风格的数据遍历方法,而不必解析JSON。有时资源方法更容易实现,但它是真实的这是个人喜好。@JohnRotenstein两者的工作方式相同吗?如果我在snapshot.delete()
中没有传递任何快照id,那么它将删除当前id快照?在这里我添加了删除代码,可以吗?:您并没有真正将快照id“传递”到snapshot.delete()
。相反,您可以在snapshot
变量中获取快照作为对象,然后对其调用.delete()
。