2017-05-30 75 views
0

我設置了一個Lambda函數,根據this script獲取RDS實例的每日快照。我正在運行python3解釋器。AWS Lambda:RDS快照 - KeyError

import boto3 
import datetime 


def lambda_handler(event, context): 
    print("Connecting to RDS") 
    client = boto3.client('rds') 

    # Instance to backup 
    dbInstances = ['testdb'] 

    for dbInstance in dbInstances: 
     print("RDS snapshot backups started at %s...\n" % datetime.datetime.now()) 

     client.create_db_snapshot(
      DBInstanceIdentifier=dbInstance, 
      DBSnapshotIdentifier=dbInstance+'{}'.format(datetime.datetime.now().strftime("%y-%m-%d-%H")), 
      Tags=[ 
       { 
        'Key': 'Name', 
        'Value': 'dbInstace' 

       }, 
      ] 
     ) 


     for snapshot in client.describe_db_snapshots(DBInstanceIdentifier=dbInstance, MaxRecords=50)['DBSnapshots']: 
      createTs = snapshot['SnapshotCreateTime'].replace(tzinfo=None) 
      if createTs < datetime.datetime.now() - datetime.timedelta(days=30): 
       print("Deleting snapshot id:", snapshot['DBSnapshotIdentifier']) 
       client.delete_db_snapshot(
        DBSnapshotIdentifier=snapshot['DBSnapshotIdentifier'] 
       ) 

該腳本可用於創建快照;但是每次運行時我都會得到這個錯誤,所以我不認爲它會正確刪除快照。

'SnapshotCreateTime': KeyError 
Traceback (most recent call last): 
    File "/var/task/lambda_function.py", line 29, in lambda_handler 
    createTs = snapshot['SnapshotCreateTime'].replace(tzinfo=None) 
KeyError: 'SnapshotCreateTime' 

Traceback (most recent call last): 
    File "/var/runtime/awslambda/bootstrap.py", line 226, in handle_event_request 
    result = request_handler(json_input, context) 
    File "/var/task/lambda_function.py", line 29, in lambda_handler 
    createTs = snapshot['SnapshotCreateTime'].replace(tzinfo=None) 
KeyError: 'SnapshotCreateTime' 

的問題似乎是這條線具體爲:

createTs = snapshot['SnapshotCreateTime'].replace(tzinfo=None) 

這究竟是爲什麼?

回答

1

我懷疑您看到KeyError,因爲快照仍在進行中,並且SnapshotCreateTime尚未填充到返回的字典中。

在這種情況下,PercentProgress將小於100

for snap in snapshots['DBSnapshots']: 
    if ('SnapshotCreateTime' in snap): 
     print snap['SnapshotCreateTime'] 
    else: 
     print 'No create time available' 

    if ('PercentProgress' in snap): 
     print snap['PercentProgress'] 
+0

這是問題。最好的解決辦法是在那裏放置一個「睡眠」?這似乎可能會增加成本。 – flyingcars34

+0

通過快速查看代碼,您試圖清除超過30天的快照,因此您可以安全地忽略沒有SnapshotCreateTime的快照,因爲它們明顯少於30天(它們甚至不存在)。 – jarmod