Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 删除快照(具有特定说明的快照除外)_Python 3.x_Amazon Web Services_Aws Lambda_Boto3 - Fatal编程技术网

Python 3.x 删除快照(具有特定说明的快照除外)

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')

我试图删除旧的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')

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()