Skip to content

Instantly share code, notes, and snippets.

@mzupan
Last active June 8, 2021 05:19
Show Gist options
  • Save mzupan/41d01bfb3b4c292fdac0 to your computer and use it in GitHub Desktop.
Save mzupan/41d01bfb3b4c292fdac0 to your computer and use it in GitHub Desktop.
AWS Lambda job to backup RDS instances
import boto3
import datetime
def lambda_handler(event, context):
print("Connecting to RDS")
client = boto3.client('rds')
print("RDS snapshot backups stated at %s...\n" % datetime.datetime.now())
client.create_db_snapshot(
DBInstanceIdentifier='web-platform-slave',
DBSnapshotIdentifier='web-platform-%s' % datetime.datetime.now().strftime("%y-%m-%d-%H"),
Tags=[
{
'Key': 'CostCenter',
'Value': 'web'
},
]
)
for snapshot in client.describe_db_snapshots(DBInstanceIdentifier='web-platform-slave', MaxRecords=50)['DBSnapshots']:
if create_ts < datetime.datetime.now() - datetime.timedelta(days=7):
print "Deleting snapshot id:", snapshot['DBSnapshotIdentifier']
client.delete_db_snapshot(
DBSnapshotIdentifier=snapshot['DBSnapshotIdentifier']
)
@prashantohol
Copy link

prashantohol commented Jun 13, 2017

Hi Mike,

Good morning and hope you are doing good.

Got below error. Could you please help?

{
"errorMessage": "module initialization error"
}

import boto3
import datetime

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

print("RDS snapshot backups stated at %s...\n" % datetime.datetime.now())
client.create_db_snapshot(
DBInstanceIdentifier='service-rds',
DBSnapshotIdentifier='rds-test-%s' % datetime.datetime.now().strftime("%y-%m-%d-%H"),
Tags=[
{
'Key': 'Service',
'Value': 'db'
},
]
)
for snapshot in client.describe_db_snapshots(DBInstanceIdentifier='service-rds', MaxRecords=50)['DBSnapshots']:
create_ts = snapshot['SnapshotCreateTime'].replace(tzinfo=None)
if create_ts < datetime.datetime.now() - datetime.timedelta(days=7):
print "Deleting snapshot id:", snapshot['DBSnapshotIdentifier']
client.delete_db_snapshot(
DBSnapshotIdentifier=snapshot['DBSnapshotIdentifier']
)

Thx
Prashant

@repudi8or
Copy link

repudi8or commented Jun 22, 2017

There is no snapshot['SnapshotCreateTime'] for snapshots in progress, so if you iterate over an in-progress snapshot this code will break with "errorType": "KeyError", "errorMessage": "'SnapshotCreateTime'"

I suggest skipping any without a CreateTime : -

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

@songautam
Copy link

I am using the same code but getting below error -

{ "errorMessage": "An error occurred (InvalidParameterValue) when calling the CreateDBSnapshot operation: The specified instance is a member of a cluster and a snapshot cannot be created directly. Please use the CreateDBClusterSnapshot API instead.", "errorType": "ClientError", "stackTrace": [ [ "/var/task/lambda_function.py", 19, "lambda_handler", "'Value': 'NIRDS'" ], [ "/var/runtime/botocore/client.py", 312, "_api_call", "return self._make_api_call(operation_name, kwargs)" ], [ "/var/runtime/botocore/client.py", 605, "_make_api_call", "raise error_class(parsed_response, operation_name)" ] ] }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment