我目前正在使用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']
)
答案 0 :(得分:2)
代码看起来很完美,you are following the documentation
我只想添加
print(i['SnapshotCreateTime'], retentionDate)
在for循环中,日志会快速告诉你每个月初的情况。
顺便问一下,您使用的是AWS的RDS吗? RDS支持自动快照创建,您还可以定义保留期。无需创建自定义lambda脚本。
答案 1 :(得分:1)
由于CloudWatch Events和目标服务的分布式特性,触发预定规则的时间与目标服务执行目标资源的时间之间的延迟可能是几秒钟。您的预定规则将在该分钟内触发,但不会在准确的第0秒触发。
在这种情况下,你的utc现在可能会在执行期间错过几秒钟,保留日期也可能会错过几秒钟。这应该是非常小的,但仍然有可能错过删除。除此之外,后续运行应该删除早期运行中遗漏的那些。