2016-09-26 74 views
1
的快照

我目前正在利用AWS Lambda创建我的数据库快照并删除6天以前的快照。我正在使用Boto3库来连接AWS API。我正在使用CloudWatch规则每天触发删除代码。Boto3和AWS Lambda - 删除早于

通常这工作正常,但我遇到了一个问题,在本月初(前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'] 
     ) 

回答

1

代码看起来完全正常和you are following the documentation

我只想在添加

print(i['SnapshotCreateTime'], retentionDate) 

for循环,日志会告诉你很快发生了什么在每个月的开始。

顺便说一句,你使用AWS的RDS? RDS支持自动创建快照,您也可以定义保留期限。没有必要创建自定义的lambda脚本。

+0

是的我从RDS使用AWS。 lambda脚本的原因是我想每小时拍摄一次数据库的快照。我相信自动RDS快照只能每天发生,因此需要一些额外的备份。 – user2067803

0

由于CloudWatch Events和目标服务的分布式特性,触发预定规则的时间与目标服务承诺执行目标资源的时间之间的延迟可能是几秒钟。您的预定规则将在那一分钟内触发,但不会在精确的第0秒触发。

在这种情况下,您的utc现在可能会在执行期间错过几秒钟,保留日期也可能会错过几秒钟。这应该是非常小的,但仍然有机会错过删除。以此为依据,随后的运行应该删除之前运行中的错过的部分。