2016-09-26 72 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現在可能會在執行期間錯過幾秒鐘,保留日期也可能會錯過幾秒鐘。這應該是非常小的,但仍然有機會錯過刪除。以此爲依據,隨後的運行應該刪除之前運行中的錯過的部分。