Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.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 Boto3和AWS Lambda-删除早于的快照_Python_Aws Lambda_Boto3 - Fatal编程技术网

Python Boto3和AWS Lambda-删除早于的快照

Python Boto3和AWS Lambda-删除早于的快照,python,aws-lambda,boto3,Python,Aws Lambda,Boto3,我目前正在使用AWS Lambda创建数据库的快照,并删除超过6天的快照。我正在使用Boto3库与AWS API接口。我每天都在使用CloudWatch规则来触发删除代码 正常情况下,这工作正常,但我遇到了一个问题,即在月初(前6天),删除脚本似乎不会删除任何快照,即使存在早于6天的快照 代码如下: import json import boto3 from datetime import datetime, timedelta, tzinfo class Zone(tzinfo):

我目前正在使用AWS Lambda创建数据库的快照,并删除超过6天的快照。我正在使用Boto3库与AWS API接口。我每天都在使用CloudWatch规则来触发删除代码

正常情况下,这工作正常,但我遇到了一个问题,即在月初(前6天),删除脚本似乎不会删除任何快照,即使存在早于6天的快照

代码如下:

import json
import boto3
from datetime import datetime, timedelta, tzinfo

class Zone(tzinfo):
    def __init__(self,offset,isdst,name):
        self.offset = offset
        self.isdst = isdst
        self.name = name
    def utcoffset(self, dt):
        return timedelta(hours=self.offset) + self.dst(dt)
    def dst(self, dt):
        return timedelta(hours=1) if self.isdst else timedelta(0)
    def tzname(self,dt):
        return self.name

UTC = Zone(10,False,'UTC')

# Setting retention period of 6 days
retentionDate = datetime.now(UTC) - timedelta(days=6)

def lambda_handler(event, context):
    print("Connecting to RDS")
    rds = boto3.setup_default_session(region_name='ap-southeast-2')
    client = boto3.client('rds')
    snapshots = client.describe_db_snapshots(SnapshotType='manual')
    print('Deleting all DB Snapshots older than %s' % retentionDate)

    for i in snapshots['DBSnapshots']:
        if i['SnapshotCreateTime'] < retentionDate:
            print ('Deleting snapshot %s' % i['DBSnapshotIdentifier'])
              client.delete_db_snapshot(DBSnapshotIdentifier=i['DBSnapshotIdentifier']
        )
导入json
进口boto3
从datetime导入datetime、timedelta、tzinfo
类别区域(tzinfo):
定义初始化(自身、偏移、isdst、名称):
self.offset=偏移量
self.isdst=isdst
self.name=名称
def utcoffset(自身,dt):
返回时间增量(小时=自偏移量)+自dst(dt)
def dst(自身,dt):
如果self.isdst else timedelta(0),则返回timedelta(小时=1)
def tzname(自身,dt):
返回self.name
UTC=区域(10,假,'UTC')
#设置保留期为6天
retentionDate=datetime.now(UTC)-timedelta(天数=6)
def lambda_处理程序(事件、上下文):
打印(“连接到RDS”)
rds=boto3.设置\默认\会话(区域\名称='ap-Southast-2')
client=bot3.client('rds')
快照=客户端。描述\u db\u快照(SnapshotType='manual')
打印('删除所有早于%s“%retentionDate”的数据库快照)
对于快照中的i['DBSnapshots']:
如果我['SnapshotCreateTime']
代码看起来非常好而且

我只想补充一点

    print(i['SnapshotCreateTime'], retentionDate)
在for循环中,日志将快速告诉您每个月初发生了什么


顺便问一下,您是否使用AWS的RDS?RDS支持自动创建快照,您还可以定义保留期。无需创建自定义lambda脚本。

由于CloudWatch事件和目标服务的分布式性质,触发计划规则与目标服务执行目标资源之间的延迟可能为几秒钟。您的计划规则将在该分钟内触发,但不会在精确的第0秒触发


在这种情况下,您的utc现在可能会在执行过程中错过几秒钟,而保留日期也可能错过几秒钟。这应该是非常小的,但仍然有机会错过删除。这样,后续运行应该会删除先前运行中丢失的部分。

是的,我正在使用RDS中的AWS。使用lambda脚本的原因是我希望每小时拍摄数据库快照。我相信自动rds快照每天都会出现,因此我希望为此进行一些额外的备份。