Repository: cloud-custodian/cloud-custodian

Issue:
rds restore from snapshot

- needs support for adding tags for param groups/subnet group/etc when snapshotting.



Discussion:

Resolving patch:
diff --git a/c7n/resources/rds.py b/c7n/resources/rds.py
--- a/c7n/resources/rds.py
+++ b/c7n/resources/rds.py
@@ -59,6 +59,7 @@
     CrossAccountAccessFilter, FilterRegistry, Filter, AgeFilter, OPERATORS,
     FilterValidationError)
 
+from c7n.filters.offhours import OffHour, OnHour
 from c7n.filters.health import HealthEventFilter
 import c7n.filters.vpc as net_filters
 from c7n.manager import resources
@@ -261,6 +262,12 @@ def _get_available_engine_upgrades(client, major=False):
     return results
 
 
+@filters.register('offhour')
+class RDSOffHour(OffHour):
+    """Scheduled action on rds instance.
+    """
+
+
 @filters.register('default-vpc')
 class DefaultVpc(net_filters.DefaultVpcBase):
     """ Matches if an rds database is in the default vpc
@@ -571,18 +578,23 @@ class Delete(BaseAction):
                     skip-snapshot: true
     """
 
-    schema = {
-        'type': 'object',
-        'properties': {
-            'type': {'enum': ['delete'],
-                     'skip-snapshot': {'type': 'boolean'}}
-        }
-    }
+    schema = type_schema('delete', **{
+        'skip-snapshot': {'type': 'boolean'},
+        'copy-restore-info': {'type': 'boolean'}
+    })
 
-    permissions = ('rds:DeleteDBInstance',)
+    permissions = ('rds:DeleteDBInstance', 'rds:AddTagsToResource')
+
+    def validate(self):
+        if self.data.get('skip-snapshot', False) and self.data.get(
+                'copy-restore-info'):
+            raise FilterValidationError(
+                "skip-snapshot cannot be specified with copy-restore-info")
+        return self
 
     def process(self, dbs):
         skip = self.data.get('skip-snapshot', False)
+
         # Concurrency feels like overkill here.
         client = local_session(self.manager.session_factory).client('rds')
         for db in dbs:
@@ -593,18 +605,56 @@ def process(self, dbs):
             else:
                 params['FinalDBSnapshotIdentifier'] = snapshot_identifier(
                     'Final', db['DBInstanceIdentifier'])
+            if self.data.get('copy-restore-info', False):
+                self.copy_restore_info(client, db)
+                if not db['CopyTagsToSnapshot']:
+                    client.modify_db_instance(
+                        DBInstanceIdentifier=db['DBInstanceIdentifier'],
+                        CopyTagsToSnapshot=True)
             self.log.info(
                 "Deleting rds: %s snapshot: %s",
                 db['DBInstanceIdentifier'],
                 params.get('FinalDBSnapshotIdentifier', False))
+
             try:
                 client.delete_db_instance(**params)
             except ClientError as e:
                 if e.response['Error']['Code'] == "InvalidDBInstanceState":
                     continue
                 raise
+
         return dbs
 
+    def copy_restore_info(self, client, instance):
+        tags = []
+        tags.append({
+            'Key': 'VPCSecurityGroups',
+            'Value': ''.join([
+                g['VpcSecurityGroupId'] for g in instance['VpcSecurityGroups']
+            ])})
+        tags.append({
+            'Key': 'OptionGroupName',
+            'Value': instance['OptionGroupMemberships'][0]['OptionGroupName']})
+        tags.append({
+            'Key': 'ParameterGroupName',
+            'Value': instance['DBParameterGroups'][0]['DBParameterGroupName']})
+        tags.append({
+            'Key': 'InstanceClass',
+            'Value': instance['DBInstanceClass']})
+        tags.append({
+            'Key': 'StorageType',
+            'Value': instance['StorageType']})
+        tags.append({
+            'Key': 'MultiAZ',
+            'Value': str(instance['MultiAZ'])})
+        tags.append({
+            'Key': 'DBSubnetGroupName',
+            'Value': instance['DBSubnetGroup']['DBSubnetGroupName']})
+        client.add_tags_to_resource(
+            ResourceName=self.manager.generate_arn(
+                instance['DBInstanceIdentifier']),
+            Tags=tags)
+
 
 @actions.register('snapshot')
 class Snapshot(BaseAction):
@@ -645,7 +695,7 @@ def process_rds_snapshot(self, resource):
         c = local_session(self.manager.session_factory).client('rds')
         c.create_db_snapshot(
             DBSnapshotIdentifier=snapshot_identifier(
-                'Backup',
+                self.data.get('snapshot-prefix', 'Backup'),
                 resource['DBInstanceIdentifier']),
             DBInstanceIdentifier=resource['DBInstanceIdentifier'])
 
@@ -865,6 +915,11 @@ def process_tags(snap):
         return filter(None, (w.map(process_tags, snaps)))
 
 
+@RDSSnapshot.filter_registry.register('onhour')
+class RDSOnHour(OnHour):
+    """Scheduled action on rds snapshot."""
+
+
 @RDSSnapshot.filter_registry.register('latest')
 class LatestSnapshot(Filter):
     """Return the latest snapshot for each database.
@@ -910,6 +965,114 @@ class RDSSnapshotAge(AgeFilter):
     date_attribute = 'SnapshotCreateTime'
 
 
+@RDSSnapshot.action_registry.register('restore')
+class RestoreInstance(BaseAction):
+    """Restore an rds instance from a snapshot.
+
+    Note this requires the snapshot or db deletion be taken
+    with the `copy-restore-info` boolean flag set to true, as
+    various instance metadata is stored on the snapshot as tags.
+
+    additional parameters to restore db instance api call be overriden
+    via `restore_options` settings. various modify db instance parameters
+    can be specified via `modify_options` settings.
+    """
+
+    schema = type_schema(
+        'restore',
+        restore_options={'type': 'object'},
+        modify_options={'type': 'object'})
+
+    permissions = (
+        'rds:ModifyDBInstance',
+        'rds:ModifyDBParameterGroup',
+        'rds:ModifyOptionGroup',
+        'rds:RebootDBInstance',
+        'rds:RestoreDBInstanceFromDBSnapshot')
+
+    poll_period = 60
+    restore_keys = set((
+        'VPCSecurityGroups', 'MultiAZ', 'DBSubnetGroupName',
+        'InstanceClass', 'StorageType', 'ParameterGroupName',
+        'OptionGroupName'))
+
+    def validate(self):
+        found = False
+        for f in self.manager.filters:
+            if isinstance(f, LatestSnapshot):
+                found = True
+        if not found:
+            # do we really need this...
+            raise FilterValidationError(
+                "must filter by latest to use restore action")
+        return self
+
+    def process(self, resources):
+        client = local_session(self.manager.session_factory).client('rds')
+        # restore up to 10 in parallel, we have to wait on each.
+        with self.executor_factory(
+                max_workers=min(10, len(resources) or 1)) as w:
+            futures = {}
+            for r in resources:
+                tags = {t['Key']: t['Value'] for t in r['Tags']}
+                if not set(tags).issuperset(self.restore_keys):
+                    self.log.warning(
+                        "snapshot:%s missing restore tags",
+                        r['DBSnapshotIdentifier'])
+                    continue
+                futures[w.submit(self.process_instance, client, r)] = r
+            for f in as_completed(futures):
+                r = futures[f]
+                if f.exception():
+                    self.log.warning(
+                        "Error restoring db:%s from:%s error:\n%s",
+                        r['DBInstanceIdentifier'], r['DBSnapshotIdentifier'],
+                        f.exception())
+                    continue
+
+    def process_instance(self, client, r):
+        params, post_modify = self.get_restore_from_tags(r)
+        self.manager.retry(
+            client.restore_db_instance_from_db_snapshot, **params)
+        waiter = client.get_waiter('db_instance_available')
+        # wait up to 40m
+        waiter.config.delay = self.poll_period
+        waiter.wait(DBInstanceIdentifier=params['DBInstanceIdentifier'])
+        self.manager.retry(
+            client.modify_db_instance,
+            DBInstanceIdentifier=params['DBInstanceIdentifier'],
+            ApplyImmediately=True,
+            **post_modify)
+        self.manager.retry(
+            client.reboot_db_instance,
+            DBInstanceIdentifier=params['DBInstanceIdentifier'],
+            ForceFailover=False)
+
+    def get_restore_from_tags(self, snapshot):
+        params, post_modify = {}, {}
+        tags = {t['Key']: t['Value'] for t in snapshot['Tags']}
+
+        params['DBInstanceIdentifier'] = snapshot['DBInstanceIdentifier']
+        params['DBSnapshotIdentifier'] = snapshot['DBSnapshotIdentifier']
+        params['MultiAZ'] = tags['MultiAZ'] == 'True' and True or False
+        params['DBSubnetGroupName'] = tags['DBSubnetGroupName']
+        params['DBInstanceClass'] = tags['InstanceClass']
+        params['CopyTagsToSnapshot'] = True
+        params['StorageType'] = tags['StorageType']
+        params['OptionGroupName'] = tags['OptionGroupName']
+
+        post_modify['DBParameterGroupName'] = tags['ParameterGroupName']
+        post_modify['VpcSecurityGroupIds'] = tags['VPCSecurityGroups'].split(',')
+
+        params['Tags'] = [
+            {'Key': k, 'Value': v} for k, v in tags.items()
+            if k not in self.restore_keys]
+
+        params.update(self.data.get('restore_options', {}))
+        post_modify.update(self.data.get('modify_options', {}))
+        return params, post_modify
+
+
 @RDSSnapshot.action_registry.register('tag')
 class RDSSnapshotTag(tags.Tag):
     """Action to tag a RDS snapshot
diff --git a/c7n/schema.py b/c7n/schema.py
--- a/c7n/schema.py
+++ b/c7n/schema.py
@@ -360,3 +360,7 @@ def summary(vocabulary):
 def json_dump(resource=None):
     load_resources()
     print(json.dumps(generate(resource), indent=2))
+
+
+if __name__ == '__main__':
+    json_dump()


Test patch:
diff --git a/tests/data/placebo/test_rds_delete_copy_restore/rds.AddTagsToResource_1.json b/tests/data/placebo/test_rds_delete_copy_restore/rds.AddTagsToResource_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_rds_delete_copy_restore/rds.AddTagsToResource_1.json
@@ -0,0 +1,16 @@
+{
+    "status_code": 200, 
+    "data": {
+        "ResponseMetadata": {
+            "RetryAttempts": 0, 
+            "HTTPStatusCode": 200, 
+            "RequestId": "c804dbb7-419a-11e7-a484-21a0b0ef9e55", 
+            "HTTPHeaders": {
+                "x-amzn-requestid": "c804dbb7-419a-11e7-a484-21a0b0ef9e55", 
+                "date": "Thu, 25 May 2017 22:37:49 GMT", 
+                "content-length": "213", 
+                "content-type": "text/xml"
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_rds_delete_copy_restore/rds.DeleteDBInstance_1.json b/tests/data/placebo/test_rds_delete_copy_restore/rds.DeleteDBInstance_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_rds_delete_copy_restore/rds.DeleteDBInstance_1.json
@@ -0,0 +1,121 @@
+{
+    "status_code": 200, 
+    "data": {
+        "DBInstance": {
+            "PubliclyAccessible": true, 
+            "MasterUsername": "mxtester", 
+            "MonitoringInterval": 0, 
+            "LicenseModel": "postgresql-license", 
+            "VpcSecurityGroups": [
+                {
+                    "Status": "active", 
+                    "VpcSecurityGroupId": "sg-aa6c90c3"
+                }
+            ], 
+            "InstanceCreateTime": {
+                "hour": 22, 
+                "__class__": "datetime", 
+                "month": 5, 
+                "second": 4, 
+                "microsecond": 473000, 
+                "year": 2017, 
+                "day": 25, 
+                "minute": 23
+            }, 
+            "CopyTagsToSnapshot": true, 
+            "OptionGroupMemberships": [
+                {
+                    "Status": "in-sync", 
+                    "OptionGroupName": "default:postgres-9-5"
+                }
+            ], 
+            "PendingModifiedValues": {}, 
+            "Engine": "postgres", 
+            "MultiAZ": false, 
+            "LatestRestorableTime": {
+                "hour": 22, 
+                "__class__": "datetime", 
+                "month": 5, 
+                "second": 38, 
+                "microsecond": 0, 
+                "year": 2017, 
+                "day": 25, 
+                "minute": 32
+            }, 
+            "DBSecurityGroups": [], 
+            "DBParameterGroups": [
+                {
+                    "DBParameterGroupName": "default.postgres9.5", 
+                    "ParameterApplyStatus": "in-sync"
+                }
+            ], 
+            "AutoMinorVersionUpgrade": true, 
+            "PreferredBackupWindow": "04:35-05:05", 
+            "DBSubnetGroup": {
+                "Subnets": [
+                    {
+                        "SubnetStatus": "Active", 
+                        "SubnetIdentifier": "subnet-db9f62b2", 
+                        "SubnetAvailabilityZone": {
+                            "Name": "us-east-2a"
+                        }
+                    }, 
+                    {
+                        "SubnetStatus": "Active", 
+                        "SubnetIdentifier": "subnet-65dbce1d", 
+                        "SubnetAvailabilityZone": {
+                            "Name": "us-east-2b"
+                        }
+                    }, 
+                    {
+                        "SubnetStatus": "Active", 
+                        "SubnetIdentifier": "subnet-b77a4ffd", 
+                        "SubnetAvailabilityZone": {
+                            "Name": "us-east-2c"
+                        }
+                    }
+                ], 
+                "DBSubnetGroupName": "default", 
+                "VpcId": "vpc-5f6c9936", 
+                "DBSubnetGroupDescription": "default", 
+                "SubnetGroupStatus": "Complete"
+            }, 
+            "ReadReplicaDBInstanceIdentifiers": [], 
+            "AllocatedStorage": 5, 
+            "DBInstanceArn": "arn:aws:rds:us-east-2:644160558196:db:mxtest", 
+            "BackupRetentionPeriod": 7, 
+            "DBName": "mxtest", 
+            "PreferredMaintenanceWindow": "mon:09:26-mon:09:56", 
+            "Endpoint": {
+                "HostedZoneId": "Z2XHWR1WZ565X2", 
+                "Port": 5432, 
+                "Address": "mxtest.cxqrthndxfft.us-east-2.rds.amazonaws.com"
+            }, 
+            "DBInstanceStatus": "deleting", 
+            "IAMDatabaseAuthenticationEnabled": false, 
+            "EngineVersion": "9.5.4", 
+            "AvailabilityZone": "us-east-2b", 
+            "DomainMemberships": [], 
+            "StorageType": "gp2", 
+            "DbiResourceId": "db-XRNEW4BQPRFIJHGN6RHL324ZSM", 
+            "CACertificateIdentifier": "rds-ca-2015", 
+            "KmsKeyId": "arn:aws:kms:us-east-2:644160558196:key/38343899-6a22-4365-8777-3224dc078cab", 
+            "StorageEncrypted": true, 
+            "DBInstanceClass": "db.m4.large", 
+            "DbInstancePort": 0, 
+            "DBInstanceIdentifier": "mxtest"
+        }, 
+        "ResponseMetadata": {
+            "RetryAttempts": 0, 
+            "HTTPStatusCode": 200, 
+            "RequestId": "c821b291-419a-11e7-a484-21a0b0ef9e55", 
+            "HTTPHeaders": {
+                "x-amzn-requestid": "c821b291-419a-11e7-a484-21a0b0ef9e55", 
+                "vary": "Accept-Encoding", 
+                "content-length": "4067", 
+                "content-type": "text/xml", 
+                "date": "Thu, 25 May 2017 22:37:49 GMT"
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_rds_delete_copy_restore/rds.DescribeDBInstances_1.json b/tests/data/placebo/test_rds_delete_copy_restore/rds.DescribeDBInstances_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_rds_delete_copy_restore/rds.DescribeDBInstances_1.json
@@ -0,0 +1,123 @@
+{
+    "status_code": 200, 
+    "data": {
+        "DBInstances": [
+            {
+                "PubliclyAccessible": true, 
+                "MasterUsername": "mxtester", 
+                "MonitoringInterval": 0, 
+                "LicenseModel": "postgresql-license", 
+                "VpcSecurityGroups": [
+                    {
+                        "Status": "active", 
+                        "VpcSecurityGroupId": "sg-aa6c90c3"
+                    }
+                ], 
+                "InstanceCreateTime": {
+                    "hour": 22, 
+                    "__class__": "datetime", 
+                    "month": 5, 
+                    "second": 4, 
+                    "microsecond": 473000, 
+                    "year": 2017, 
+                    "day": 25, 
+                    "minute": 23
+                }, 
+                "CopyTagsToSnapshot": false, 
+                "OptionGroupMemberships": [
+                    {
+                        "Status": "in-sync", 
+                        "OptionGroupName": "default:postgres-9-5"
+                    }
+                ], 
+                "PendingModifiedValues": {}, 
+                "Engine": "postgres", 
+                "MultiAZ": false, 
+                "LatestRestorableTime": {
+                    "hour": 22, 
+                    "__class__": "datetime", 
+                    "month": 5, 
+                    "second": 38, 
+                    "microsecond": 0, 
+                    "year": 2017, 
+                    "day": 25, 
+                    "minute": 32
+                }, 
+                "DBSecurityGroups": [], 
+                "DBParameterGroups": [
+                    {
+                        "DBParameterGroupName": "default.postgres9.5", 
+                        "ParameterApplyStatus": "in-sync"
+                    }
+                ], 
+                "AutoMinorVersionUpgrade": true, 
+                "PreferredBackupWindow": "04:35-05:05", 
+                "DBSubnetGroup": {
+                    "Subnets": [
+                        {
+                            "SubnetStatus": "Active", 
+                            "SubnetIdentifier": "subnet-db9f62b2", 
+                            "SubnetAvailabilityZone": {
+                                "Name": "us-east-2a"
+                            }
+                        }, 
+                        {
+                            "SubnetStatus": "Active", 
+                            "SubnetIdentifier": "subnet-65dbce1d", 
+                            "SubnetAvailabilityZone": {
+                                "Name": "us-east-2b"
+                            }
+                        }, 
+                        {
+                            "SubnetStatus": "Active", 
+                            "SubnetIdentifier": "subnet-b77a4ffd", 
+                            "SubnetAvailabilityZone": {
+                                "Name": "us-east-2c"
+                            }
+                        }
+                    ], 
+                    "DBSubnetGroupName": "default", 
+                    "VpcId": "vpc-5f6c9936", 
+                    "DBSubnetGroupDescription": "default", 
+                    "SubnetGroupStatus": "Complete"
+                }, 
+                "ReadReplicaDBInstanceIdentifiers": [], 
+                "AllocatedStorage": 5, 
+                "DBInstanceArn": "arn:aws:rds:us-east-2:644160558196:db:mxtest", 
+                "BackupRetentionPeriod": 7, 
+                "DBName": "mxtest", 
+                "PreferredMaintenanceWindow": "mon:09:26-mon:09:56", 
+                "Endpoint": {
+                    "HostedZoneId": "Z2XHWR1WZ565X2", 
+                    "Port": 5432, 
+                    "Address": "mxtest.cxqrthndxfft.us-east-2.rds.amazonaws.com"
+                }, 
+                "DBInstanceStatus": "available", 
+                "IAMDatabaseAuthenticationEnabled": false, 
+                "EngineVersion": "9.5.4", 
+                "AvailabilityZone": "us-east-2b", 
+                "DomainMemberships": [], 
+                "StorageType": "gp2", 
+                "DbiResourceId": "db-XRNEW4BQPRFIJHGN6RHL324ZSM", 
+                "CACertificateIdentifier": "rds-ca-2015", 
+                "KmsKeyId": "arn:aws:kms:us-east-2:644160558196:key/38343899-6a22-4365-8777-3224dc078cab", 
+                "StorageEncrypted": true, 
+                "DBInstanceClass": "db.m4.large", 
+                "DbInstancePort": 0, 
+                "DBInstanceIdentifier": "mxtest"
+            }
+        ], 
+        "ResponseMetadata": {
+            "RetryAttempts": 0, 
+            "HTTPStatusCode": 200, 
+            "RequestId": "c7a6dd07-419a-11e7-811d-93628242f98a", 
+            "HTTPHeaders": {
+                "x-amzn-requestid": "c7a6dd07-419a-11e7-811d-93628242f98a", 
+                "vary": "Accept-Encoding", 
+                "content-length": "4292", 
+                "content-type": "text/xml", 
+                "date": "Thu, 25 May 2017 22:37:48 GMT"
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_rds_delete_copy_restore/rds.DescribeDBInstances_2.json b/tests/data/placebo/test_rds_delete_copy_restore/rds.DescribeDBInstances_2.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_rds_delete_copy_restore/rds.DescribeDBInstances_2.json
@@ -0,0 +1,123 @@
+{
+    "status_code": 200, 
+    "data": {
+        "DBInstances": [
+            {
+                "PubliclyAccessible": true, 
+                "MasterUsername": "mxtester", 
+                "MonitoringInterval": 0, 
+                "LicenseModel": "postgresql-license", 
+                "VpcSecurityGroups": [
+                    {
+                        "Status": "active", 
+                        "VpcSecurityGroupId": "sg-aa6c90c3"
+                    }
+                ], 
+                "InstanceCreateTime": {
+                    "hour": 22, 
+                    "__class__": "datetime", 
+                    "month": 5, 
+                    "second": 4, 
+                    "microsecond": 473000, 
+                    "year": 2017, 
+                    "day": 25, 
+                    "minute": 23
+                }, 
+                "CopyTagsToSnapshot": false, 
+                "OptionGroupMemberships": [
+                    {
+                        "Status": "in-sync", 
+                        "OptionGroupName": "default:postgres-9-5"
+                    }
+                ], 
+                "PendingModifiedValues": {}, 
+                "Engine": "postgres", 
+                "MultiAZ": false, 
+                "LatestRestorableTime": {
+                    "hour": 22, 
+                    "__class__": "datetime", 
+                    "month": 5, 
+                    "second": 38, 
+                    "microsecond": 0, 
+                    "year": 2017, 
+                    "day": 25, 
+                    "minute": 32
+                }, 
+                "DBSecurityGroups": [], 
+                "DBParameterGroups": [
+                    {
+                        "DBParameterGroupName": "default.postgres9.5", 
+                        "ParameterApplyStatus": "in-sync"
+                    }
+                ], 
+                "AutoMinorVersionUpgrade": true, 
+                "PreferredBackupWindow": "04:35-05:05", 
+                "DBSubnetGroup": {
+                    "Subnets": [
+                        {
+                            "SubnetStatus": "Active", 
+                            "SubnetIdentifier": "subnet-db9f62b2", 
+                            "SubnetAvailabilityZone": {
+                                "Name": "us-east-2a"
+                            }
+                        }, 
+                        {
+                            "SubnetStatus": "Active", 
+                            "SubnetIdentifier": "subnet-65dbce1d", 
+                            "SubnetAvailabilityZone": {
+                                "Name": "us-east-2b"
+                            }
+                        }, 
+                        {
+                            "SubnetStatus": "Active", 
+                            "SubnetIdentifier": "subnet-b77a4ffd", 
+                            "SubnetAvailabilityZone": {
+                                "Name": "us-east-2c"
+                            }
+                        }
+                    ], 
+                    "DBSubnetGroupName": "default", 
+                    "VpcId": "vpc-5f6c9936", 
+                    "DBSubnetGroupDescription": "default", 
+                    "SubnetGroupStatus": "Complete"
+                }, 
+                "ReadReplicaDBInstanceIdentifiers": [], 
+                "AllocatedStorage": 5, 
+                "DBInstanceArn": "arn:aws:rds:us-east-2:644160558196:db:mxtest", 
+                "BackupRetentionPeriod": 7, 
+                "DBName": "mxtest", 
+                "PreferredMaintenanceWindow": "mon:09:26-mon:09:56", 
+                "Endpoint": {
+                    "HostedZoneId": "Z2XHWR1WZ565X2", 
+                    "Port": 5432, 
+                    "Address": "mxtest.cxqrthndxfft.us-east-2.rds.amazonaws.com"
+                }, 
+                "DBInstanceStatus": "available", 
+                "IAMDatabaseAuthenticationEnabled": false, 
+                "EngineVersion": "9.5.4", 
+                "AvailabilityZone": "us-east-2b", 
+                "DomainMemberships": [], 
+                "StorageType": "gp2", 
+                "DbiResourceId": "db-XRNEW4BQPRFIJHGN6RHL324ZSM", 
+                "CACertificateIdentifier": "rds-ca-2015", 
+                "KmsKeyId": "arn:aws:kms:us-east-2:644160558196:key/38343899-6a22-4365-8777-3224dc078cab", 
+                "StorageEncrypted": true, 
+                "DBInstanceClass": "db.m4.large", 
+                "DbInstancePort": 0, 
+                "DBInstanceIdentifier": "mxtest"
+            }
+        ], 
+        "ResponseMetadata": {
+            "RetryAttempts": 0, 
+            "HTTPStatusCode": 200, 
+            "RequestId": "c7cc1835-419a-11e7-97eb-498709e28eb5", 
+            "HTTPHeaders": {
+                "x-amzn-requestid": "c7cc1835-419a-11e7-97eb-498709e28eb5", 
+                "vary": "Accept-Encoding", 
+                "content-length": "4292", 
+                "content-type": "text/xml", 
+                "date": "Thu, 25 May 2017 22:37:48 GMT"
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_rds_delete_copy_restore/rds.DescribeDBInstances_3.json b/tests/data/placebo/test_rds_delete_copy_restore/rds.DescribeDBInstances_3.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_rds_delete_copy_restore/rds.DescribeDBInstances_3.json
@@ -0,0 +1,123 @@
+{
+    "status_code": 200, 
+    "data": {
+        "DBInstances": [
+            {
+                "PubliclyAccessible": true, 
+                "MasterUsername": "mxtester", 
+                "MonitoringInterval": 0, 
+                "LicenseModel": "postgresql-license", 
+                "VpcSecurityGroups": [
+                    {
+                        "Status": "active", 
+                        "VpcSecurityGroupId": "sg-aa6c90c3"
+                    }
+                ], 
+                "InstanceCreateTime": {
+                    "hour": 22, 
+                    "__class__": "datetime", 
+                    "month": 5, 
+                    "second": 4, 
+                    "microsecond": 473000, 
+                    "year": 2017, 
+                    "day": 25, 
+                    "minute": 23
+                }, 
+                "CopyTagsToSnapshot": true, 
+                "OptionGroupMemberships": [
+                    {
+                        "Status": "in-sync", 
+                        "OptionGroupName": "default:postgres-9-5"
+                    }
+                ], 
+                "PendingModifiedValues": {}, 
+                "Engine": "postgres", 
+                "MultiAZ": false, 
+                "LatestRestorableTime": {
+                    "hour": 22, 
+                    "__class__": "datetime", 
+                    "month": 5, 
+                    "second": 38, 
+                    "microsecond": 0, 
+                    "year": 2017, 
+                    "day": 25, 
+                    "minute": 32
+                }, 
+                "DBSecurityGroups": [], 
+                "DBParameterGroups": [
+                    {
+                        "DBParameterGroupName": "default.postgres9.5", 
+                        "ParameterApplyStatus": "in-sync"
+                    }
+                ], 
+                "AutoMinorVersionUpgrade": true, 
+                "PreferredBackupWindow": "04:35-05:05", 
+                "DBSubnetGroup": {
+                    "Subnets": [
+                        {
+                            "SubnetStatus": "Active", 
+                            "SubnetIdentifier": "subnet-db9f62b2", 
+                            "SubnetAvailabilityZone": {
+                                "Name": "us-east-2a"
+                            }
+                        }, 
+                        {
+                            "SubnetStatus": "Active", 
+                            "SubnetIdentifier": "subnet-65dbce1d", 
+                            "SubnetAvailabilityZone": {
+                                "Name": "us-east-2b"
+                            }
+                        }, 
+                        {
+                            "SubnetStatus": "Active", 
+                            "SubnetIdentifier": "subnet-b77a4ffd", 
+                            "SubnetAvailabilityZone": {
+                                "Name": "us-east-2c"
+                            }
+                        }
+                    ], 
+                    "DBSubnetGroupName": "default", 
+                    "VpcId": "vpc-5f6c9936", 
+                    "DBSubnetGroupDescription": "default", 
+                    "SubnetGroupStatus": "Complete"
+                }, 
+                "ReadReplicaDBInstanceIdentifiers": [], 
+                "AllocatedStorage": 5, 
+                "DBInstanceArn": "arn:aws:rds:us-east-2:644160558196:db:mxtest", 
+                "BackupRetentionPeriod": 7, 
+                "DBName": "mxtest", 
+                "PreferredMaintenanceWindow": "mon:09:26-mon:09:56", 
+                "Endpoint": {
+                    "HostedZoneId": "Z2XHWR1WZ565X2", 
+                    "Port": 5432, 
+                    "Address": "mxtest.cxqrthndxfft.us-east-2.rds.amazonaws.com"
+                }, 
+                "DBInstanceStatus": "deleting", 
+                "IAMDatabaseAuthenticationEnabled": false, 
+                "EngineVersion": "9.5.4", 
+                "AvailabilityZone": "us-east-2b", 
+                "DomainMemberships": [], 
+                "StorageType": "gp2", 
+                "DbiResourceId": "db-XRNEW4BQPRFIJHGN6RHL324ZSM", 
+                "CACertificateIdentifier": "rds-ca-2015", 
+                "KmsKeyId": "arn:aws:kms:us-east-2:644160558196:key/38343899-6a22-4365-8777-3224dc078cab", 
+                "StorageEncrypted": true, 
+                "DBInstanceClass": "db.m4.large", 
+                "DbInstancePort": 0, 
+                "DBInstanceIdentifier": "mxtest"
+            }
+        ], 
+        "ResponseMetadata": {
+            "RetryAttempts": 0, 
+            "HTTPStatusCode": 200, 
+            "RequestId": "c83fe8d5-419a-11e7-811d-93628242f98a", 
+            "HTTPHeaders": {
+                "x-amzn-requestid": "c83fe8d5-419a-11e7-811d-93628242f98a", 
+                "vary": "Accept-Encoding", 
+                "content-length": "4290", 
+                "content-type": "text/xml", 
+                "date": "Thu, 25 May 2017 22:37:49 GMT"
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_rds_delete_copy_restore/rds.DescribeDBSnapshots_1.json b/tests/data/placebo/test_rds_delete_copy_restore/rds.DescribeDBSnapshots_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_rds_delete_copy_restore/rds.DescribeDBSnapshots_1.json
@@ -0,0 +1,50 @@
+{
+    "status_code": 200, 
+    "data": {
+        "ResponseMetadata": {
+            "RetryAttempts": 0, 
+            "HTTPStatusCode": 200, 
+            "RequestId": "a4de7d01-419b-11e7-a106-f3916c46eff4", 
+            "HTTPHeaders": {
+                "x-amzn-requestid": "a4de7d01-419b-11e7-a106-f3916c46eff4", 
+                "vary": "Accept-Encoding", 
+                "content-length": "2717", 
+                "content-type": "text/xml", 
+                "date": "Thu, 25 May 2017 22:43:59 GMT"
+            }
+        }, 
+        "DBSnapshots": [
+            {
+                "Engine": "postgres", 
+                "Status": "creating", 
+                "AvailabilityZone": "us-east-2b", 
+                "DBSnapshotArn": "arn:aws:rds:us-east-2:644160558196:snapshot:final-mxtest-2017-05-25", 
+                "PercentProgress": 4, 
+                "MasterUsername": "mxtester", 
+                "Encrypted": true, 
+                "LicenseModel": "postgresql-license", 
+                "StorageType": "gp2", 
+                "KmsKeyId": "arn:aws:kms:us-east-2:644160558196:key/38343899-6a22-4365-8777-3224dc078cab", 
+                "VpcId": "vpc-5f6c9936", 
+                "DBSnapshotIdentifier": "final-mxtest-2017-05-25", 
+                "InstanceCreateTime": {
+                    "hour": 22, 
+                    "__class__": "datetime", 
+                    "month": 5, 
+                    "second": 4, 
+                    "microsecond": 473000, 
+                    "year": 2017, 
+                    "day": 25, 
+                    "minute": 23
+                }, 
+                "OptionGroupName": "default:postgres-9-5", 
+                "AllocatedStorage": 5, 
+                "EngineVersion": "9.5.4", 
+                "SnapshotType": "manual", 
+                "IAMDatabaseAuthenticationEnabled": false, 
+                "Port": 5432, 
+                "DBInstanceIdentifier": "mxtest"
+            }
+        ]
+    }
+}
diff --git a/tests/data/placebo/test_rds_delete_copy_restore/rds.ListTagsForResource_1.json b/tests/data/placebo/test_rds_delete_copy_restore/rds.ListTagsForResource_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_rds_delete_copy_restore/rds.ListTagsForResource_1.json
@@ -0,0 +1,54 @@
+{
+    "status_code": 200, 
+    "data": {
+        "ResponseMetadata": {
+            "RetryAttempts": 0, 
+            "HTTPStatusCode": 200, 
+            "RequestId": "c7ea4e98-419a-11e7-97eb-498709e28eb5", 
+            "HTTPHeaders": {
+                "x-amzn-requestid": "c7ea4e98-419a-11e7-97eb-498709e28eb5", 
+                "date": "Thu, 25 May 2017 22:37:48 GMT", 
+                "content-length": "1134", 
+                "content-type": "text/xml"
+            }
+        }, 
+        "TagList": [
+            {
+                "Value": "gp2", 
+                "Key": "StorageType"
+            }, 
+            {
+                "Value": "default.postgres9.5", 
+                "Key": "ParameterGroupName"
+            }, 
+            {
+                "Value": "sg-aa6c90c3", 
+                "Key": "VPCSecurityGroups"
+            }, 
+            {
+                "Value": "default:postgres-9-5", 
+                "Key": "OptionGroupName"
+            }, 
+            {
+                "Value": "db.m4.large", 
+                "Key": "InstanceClass"
+            }, 
+            {
+                "Value": "default", 
+                "Key": "DBSubnetGroupName"
+            }, 
+            {
+                "Value": "other", 
+                "Key": "workload-type"
+            }, 
+            {
+                "Value": "False", 
+                "Key": "MultiAZ"
+            }, 
+            {
+                "Value": "Testing", 
+                "Key": "AppName"
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_rds_delete_copy_restore/rds.ListTagsForResource_2.json b/tests/data/placebo/test_rds_delete_copy_restore/rds.ListTagsForResource_2.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_rds_delete_copy_restore/rds.ListTagsForResource_2.json
@@ -0,0 +1,54 @@
+{
+    "status_code": 200, 
+    "data": {
+        "ResponseMetadata": {
+            "RetryAttempts": 0, 
+            "HTTPStatusCode": 200, 
+            "RequestId": "a4fd019e-419b-11e7-8576-5ff23101941f", 
+            "HTTPHeaders": {
+                "x-amzn-requestid": "a4fd019e-419b-11e7-8576-5ff23101941f", 
+                "date": "Thu, 25 May 2017 22:43:59 GMT", 
+                "content-length": "1134", 
+                "content-type": "text/xml"
+            }
+        }, 
+        "TagList": [
+            {
+                "Value": "gp2", 
+                "Key": "StorageType"
+            }, 
+            {
+                "Value": "default.postgres9.5", 
+                "Key": "ParameterGroupName"
+            }, 
+            {
+                "Value": "sg-aa6c90c3", 
+                "Key": "VPCSecurityGroups"
+            }, 
+            {
+                "Value": "default:postgres-9-5", 
+                "Key": "OptionGroupName"
+            }, 
+            {
+                "Value": "db.m4.large", 
+                "Key": "InstanceClass"
+            }, 
+            {
+                "Value": "default", 
+                "Key": "DBSubnetGroupName"
+            }, 
+            {
+                "Value": "other", 
+                "Key": "workload-type"
+            }, 
+            {
+                "Value": "False", 
+                "Key": "MultiAZ"
+            }, 
+            {
+                "Value": "Testing", 
+                "Key": "AppName"
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_rds_delete_copy_restore/rds.ModifyDBInstance_1.json b/tests/data/placebo/test_rds_delete_copy_restore/rds.ModifyDBInstance_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_rds_delete_copy_restore/rds.ModifyDBInstance_1.json
@@ -0,0 +1,121 @@
+{
+    "status_code": 200, 
+    "data": {
+        "DBInstance": {
+            "PubliclyAccessible": true, 
+            "MasterUsername": "mxtester", 
+            "MonitoringInterval": 0, 
+            "LicenseModel": "postgresql-license", 
+            "VpcSecurityGroups": [
+                {
+                    "Status": "active", 
+                    "VpcSecurityGroupId": "sg-aa6c90c3"
+                }
+            ], 
+            "InstanceCreateTime": {
+                "hour": 22, 
+                "__class__": "datetime", 
+                "month": 5, 
+                "second": 4, 
+                "microsecond": 473000, 
+                "year": 2017, 
+                "day": 25, 
+                "minute": 23
+            }, 
+            "CopyTagsToSnapshot": true, 
+            "OptionGroupMemberships": [
+                {
+                    "Status": "in-sync", 
+                    "OptionGroupName": "default:postgres-9-5"
+                }
+            ], 
+            "PendingModifiedValues": {}, 
+            "Engine": "postgres", 
+            "MultiAZ": false, 
+            "LatestRestorableTime": {
+                "hour": 22, 
+                "__class__": "datetime", 
+                "month": 5, 
+                "second": 38, 
+                "microsecond": 0, 
+                "year": 2017, 
+                "day": 25, 
+                "minute": 32
+            }, 
+            "DBSecurityGroups": [], 
+            "DBParameterGroups": [
+                {
+                    "DBParameterGroupName": "default.postgres9.5", 
+                    "ParameterApplyStatus": "in-sync"
+                }
+            ], 
+            "AutoMinorVersionUpgrade": true, 
+            "PreferredBackupWindow": "04:35-05:05", 
+            "DBSubnetGroup": {
+                "Subnets": [
+                    {
+                        "SubnetStatus": "Active", 
+                        "SubnetIdentifier": "subnet-db9f62b2", 
+                        "SubnetAvailabilityZone": {
+                            "Name": "us-east-2a"
+                        }
+                    }, 
+                    {
+                        "SubnetStatus": "Active", 
+                        "SubnetIdentifier": "subnet-65dbce1d", 
+                        "SubnetAvailabilityZone": {
+                            "Name": "us-east-2b"
+                        }
+                    }, 
+                    {
+                        "SubnetStatus": "Active", 
+                        "SubnetIdentifier": "subnet-b77a4ffd", 
+                        "SubnetAvailabilityZone": {
+                            "Name": "us-east-2c"
+                        }
+                    }
+                ], 
+                "DBSubnetGroupName": "default", 
+                "VpcId": "vpc-5f6c9936", 
+                "DBSubnetGroupDescription": "default", 
+                "SubnetGroupStatus": "Complete"
+            }, 
+            "ReadReplicaDBInstanceIdentifiers": [], 
+            "AllocatedStorage": 5, 
+            "DBInstanceArn": "arn:aws:rds:us-east-2:644160558196:db:mxtest", 
+            "BackupRetentionPeriod": 7, 
+            "DBName": "mxtest", 
+            "PreferredMaintenanceWindow": "mon:09:26-mon:09:56", 
+            "Endpoint": {
+                "HostedZoneId": "Z2XHWR1WZ565X2", 
+                "Port": 5432, 
+                "Address": "mxtest.cxqrthndxfft.us-east-2.rds.amazonaws.com"
+            }, 
+            "DBInstanceStatus": "available", 
+            "IAMDatabaseAuthenticationEnabled": false, 
+            "EngineVersion": "9.5.4", 
+            "AvailabilityZone": "us-east-2b", 
+            "DomainMemberships": [], 
+            "StorageType": "gp2", 
+            "DbiResourceId": "db-XRNEW4BQPRFIJHGN6RHL324ZSM", 
+            "CACertificateIdentifier": "rds-ca-2015", 
+            "KmsKeyId": "arn:aws:kms:us-east-2:644160558196:key/38343899-6a22-4365-8777-3224dc078cab", 
+            "StorageEncrypted": true, 
+            "DBInstanceClass": "db.m4.large", 
+            "DbInstancePort": 0, 
+            "DBInstanceIdentifier": "mxtest"
+        }, 
+        "ResponseMetadata": {
+            "RetryAttempts": 0, 
+            "HTTPStatusCode": 200, 
+            "RequestId": "c814ba3e-419a-11e7-a484-21a0b0ef9e55", 
+            "HTTPHeaders": {
+                "x-amzn-requestid": "c814ba3e-419a-11e7-a484-21a0b0ef9e55", 
+                "vary": "Accept-Encoding", 
+                "content-length": "4068", 
+                "content-type": "text/xml", 
+                "date": "Thu, 25 May 2017 22:37:49 GMT"
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_rds_restore/rds.DescribeDBInstances_1.json b/tests/data/placebo/test_rds_restore/rds.DescribeDBInstances_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_rds_restore/rds.DescribeDBInstances_1.json
@@ -0,0 +1,21 @@
+{
+    "status_code": 404, 
+    "data": {
+        "ResponseMetadata": {
+            "RetryAttempts": 0, 
+            "HTTPStatusCode": 404, 
+            "RequestId": "fcadee8c-4191-11e7-a9aa-7fc487dc866d", 
+            "HTTPHeaders": {
+                "x-amzn-requestid": "fcadee8c-4191-11e7-a9aa-7fc487dc866d", 
+                "date": "Thu, 25 May 2017 21:34:51 GMT", 
+                "content-length": "277", 
+                "content-type": "text/xml"
+            }
+        }, 
+        "Error": {
+            "Message": "DBInstance mxtest not found.", 
+            "Code": "DBInstanceNotFound", 
+            "Type": "Sender"
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_rds_restore/rds.DescribeDBInstances_2.json b/tests/data/placebo/test_rds_restore/rds.DescribeDBInstances_2.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_rds_restore/rds.DescribeDBInstances_2.json
@@ -0,0 +1,123 @@
+{
+    "status_code": 200, 
+    "data": {
+        "DBInstances": [
+            {
+                "PubliclyAccessible": true, 
+                "MasterUsername": "mxtester", 
+                "MonitoringInterval": 0, 
+                "LicenseModel": "postgresql-license", 
+                "VpcSecurityGroups": [
+                    {
+                        "Status": "active", 
+                        "VpcSecurityGroupId": "sg-aa6c90c3"
+                    }
+                ], 
+                "InstanceCreateTime": {
+                    "hour": 21, 
+                    "__class__": "datetime", 
+                    "month": 5, 
+                    "second": 21, 
+                    "microsecond": 56000, 
+                    "year": 2017, 
+                    "day": 25, 
+                    "minute": 39
+                }, 
+                "CopyTagsToSnapshot": true, 
+                "OptionGroupMemberships": [
+                    {
+                        "Status": "in-sync", 
+                        "OptionGroupName": "default:postgres-9-5"
+                    }
+                ], 
+                "PendingModifiedValues": {}, 
+                "Engine": "postgres", 
+                "MultiAZ": false, 
+                "LatestRestorableTime": {
+                    "hour": 21, 
+                    "__class__": "datetime", 
+                    "month": 5, 
+                    "second": 35, 
+                    "microsecond": 0, 
+                    "year": 2017, 
+                    "day": 25, 
+                    "minute": 40
+                }, 
+                "DBSecurityGroups": [], 
+                "DBParameterGroups": [
+                    {
+                        "DBParameterGroupName": "default.postgres9.5", 
+                        "ParameterApplyStatus": "in-sync"
+                    }
+                ], 
+                "AutoMinorVersionUpgrade": true, 
+                "PreferredBackupWindow": "04:35-05:05", 
+                "DBSubnetGroup": {
+                    "Subnets": [
+                        {
+                            "SubnetStatus": "Active", 
+                            "SubnetIdentifier": "subnet-db9f62b2", 
+                            "SubnetAvailabilityZone": {
+                                "Name": "us-east-2a"
+                            }
+                        }, 
+                        {
+                            "SubnetStatus": "Active", 
+                            "SubnetIdentifier": "subnet-65dbce1d", 
+                            "SubnetAvailabilityZone": {
+                                "Name": "us-east-2b"
+                            }
+                        }, 
+                        {
+                            "SubnetStatus": "Active", 
+                            "SubnetIdentifier": "subnet-b77a4ffd", 
+                            "SubnetAvailabilityZone": {
+                                "Name": "us-east-2c"
+                            }
+                        }
+                    ], 
+                    "DBSubnetGroupName": "default", 
+                    "VpcId": "vpc-5f6c9936", 
+                    "DBSubnetGroupDescription": "default", 
+                    "SubnetGroupStatus": "Complete"
+                }, 
+                "ReadReplicaDBInstanceIdentifiers": [], 
+                "AllocatedStorage": 5, 
+                "DBInstanceArn": "arn:aws:rds:us-east-2:644160558196:db:mxtest4", 
+                "BackupRetentionPeriod": 7, 
+                "DBName": "mxtest", 
+                "PreferredMaintenanceWindow": "mon:09:26-mon:09:56", 
+                "Endpoint": {
+                    "HostedZoneId": "Z2XHWR1WZ565X2", 
+                    "Port": 5432, 
+                    "Address": "mxtest4.cxqrthndxfft.us-east-2.rds.amazonaws.com"
+                }, 
+                "DBInstanceStatus": "available", 
+                "IAMDatabaseAuthenticationEnabled": false, 
+                "EngineVersion": "9.5.4", 
+                "AvailabilityZone": "us-east-2c", 
+                "DomainMemberships": [], 
+                "StorageType": "gp2", 
+                "DbiResourceId": "db-HJC7IKBO2ACTLNNZCM7EX66IHE", 
+                "CACertificateIdentifier": "rds-ca-2015", 
+                "KmsKeyId": "arn:aws:kms:us-east-2:644160558196:key/38343899-6a22-4365-8777-3224dc078cab", 
+                "StorageEncrypted": true, 
+                "DBInstanceClass": "db.m4.large", 
+                "DbInstancePort": 0, 
+                "DBInstanceIdentifier": "mxtest4"
+            }
+        ], 
+        "ResponseMetadata": {
+            "RetryAttempts": 0, 
+            "HTTPStatusCode": 200, 
+            "RequestId": "41ba5d7e-4193-11e7-97eb-498709e28eb5", 
+            "HTTPHeaders": {
+                "x-amzn-requestid": "41ba5d7e-4193-11e7-97eb-498709e28eb5", 
+                "vary": "Accept-Encoding", 
+                "content-length": "4294", 
+                "content-type": "text/xml", 
+                "date": "Thu, 25 May 2017 21:43:57 GMT"
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_rds_restore/rds.DescribeDBInstances_3.json b/tests/data/placebo/test_rds_restore/rds.DescribeDBInstances_3.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_rds_restore/rds.DescribeDBInstances_3.json
@@ -0,0 +1,123 @@
+{
+    "status_code": 200, 
+    "data": {
+        "DBInstances": [
+            {
+                "PubliclyAccessible": true, 
+                "MasterUsername": "mxtester", 
+                "MonitoringInterval": 0, 
+                "LicenseModel": "postgresql-license", 
+                "VpcSecurityGroups": [
+                    {
+                        "Status": "active", 
+                        "VpcSecurityGroupId": "sg-aa6c90c3"
+                    }
+                ], 
+                "InstanceCreateTime": {
+                    "hour": 21, 
+                    "__class__": "datetime", 
+                    "month": 5, 
+                    "second": 21, 
+                    "microsecond": 56000, 
+                    "year": 2017, 
+                    "day": 25, 
+                    "minute": 39
+                }, 
+                "CopyTagsToSnapshot": true, 
+                "OptionGroupMemberships": [
+                    {
+                        "Status": "in-sync", 
+                        "OptionGroupName": "default:postgres-9-5"
+                    }
+                ], 
+                "PendingModifiedValues": {}, 
+                "Engine": "postgres", 
+                "MultiAZ": false, 
+                "LatestRestorableTime": {
+                    "hour": 21, 
+                    "__class__": "datetime", 
+                    "month": 5, 
+                    "second": 16, 
+                    "microsecond": 0, 
+                    "year": 2017, 
+                    "day": 25, 
+                    "minute": 44
+                }, 
+                "DBSecurityGroups": [], 
+                "DBParameterGroups": [
+                    {
+                        "DBParameterGroupName": "default.postgres9.5", 
+                        "ParameterApplyStatus": "in-sync"
+                    }
+                ], 
+                "AutoMinorVersionUpgrade": true, 
+                "PreferredBackupWindow": "04:35-05:05", 
+                "DBSubnetGroup": {
+                    "Subnets": [
+                        {
+                            "SubnetStatus": "Active", 
+                            "SubnetIdentifier": "subnet-db9f62b2", 
+                            "SubnetAvailabilityZone": {
+                                "Name": "us-east-2a"
+                            }
+                        }, 
+                        {
+                            "SubnetStatus": "Active", 
+                            "SubnetIdentifier": "subnet-65dbce1d", 
+                            "SubnetAvailabilityZone": {
+                                "Name": "us-east-2b"
+                            }
+                        }, 
+                        {
+                            "SubnetStatus": "Active", 
+                            "SubnetIdentifier": "subnet-b77a4ffd", 
+                            "SubnetAvailabilityZone": {
+                                "Name": "us-east-2c"
+                            }
+                        }
+                    ], 
+                    "DBSubnetGroupName": "default", 
+                    "VpcId": "vpc-5f6c9936", 
+                    "DBSubnetGroupDescription": "default", 
+                    "SubnetGroupStatus": "Complete"
+                }, 
+                "ReadReplicaDBInstanceIdentifiers": [], 
+                "AllocatedStorage": 5, 
+                "DBInstanceArn": "arn:aws:rds:us-east-2:644160558196:db:mxtest4", 
+                "BackupRetentionPeriod": 7, 
+                "DBName": "mxtest", 
+                "PreferredMaintenanceWindow": "mon:09:26-mon:09:56", 
+                "Endpoint": {
+                    "HostedZoneId": "Z2XHWR1WZ565X2", 
+                    "Port": 5432, 
+                    "Address": "mxtest4.cxqrthndxfft.us-east-2.rds.amazonaws.com"
+                }, 
+                "DBInstanceStatus": "available", 
+                "IAMDatabaseAuthenticationEnabled": false, 
+                "EngineVersion": "9.5.4", 
+                "AvailabilityZone": "us-east-2c", 
+                "DomainMemberships": [], 
+                "StorageType": "gp2", 
+                "DbiResourceId": "db-HJC7IKBO2ACTLNNZCM7EX66IHE", 
+                "CACertificateIdentifier": "rds-ca-2015", 
+                "KmsKeyId": "arn:aws:kms:us-east-2:644160558196:key/38343899-6a22-4365-8777-3224dc078cab", 
+                "StorageEncrypted": true, 
+                "DBInstanceClass": "db.m4.large", 
+                "DbInstancePort": 0, 
+                "DBInstanceIdentifier": "mxtest4"
+            }
+        ], 
+        "ResponseMetadata": {
+            "RetryAttempts": 0, 
+            "HTTPStatusCode": 200, 
+            "RequestId": "d270dff9-4193-11e7-95c3-3d91b56acfa1", 
+            "HTTPHeaders": {
+                "x-amzn-requestid": "d270dff9-4193-11e7-95c3-3d91b56acfa1", 
+                "vary": "Accept-Encoding", 
+                "content-length": "4294", 
+                "content-type": "text/xml", 
+                "date": "Thu, 25 May 2017 21:48:00 GMT"
+            }
+        }
+    }
+}
diff --git a/tests/data/placebo/test_rds_restore/rds.DescribeDBSnapshots_1.json b/tests/data/placebo/test_rds_restore/rds.DescribeDBSnapshots_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_rds_restore/rds.DescribeDBSnapshots_1.json
@@ -0,0 +1,59 @@
+{
+    "status_code": 200, 
+    "data": {
+        "ResponseMetadata": {
+            "RetryAttempts": 0, 
+            "HTTPStatusCode": 200, 
+            "RequestId": "fce4dcf6-4191-11e7-94f6-2369bd255e2c", 
+            "HTTPHeaders": {
+                "x-amzn-requestid": "fce4dcf6-4191-11e7-94f6-2369bd255e2c", 
+                "date": "Thu, 25 May 2017 21:34:52 GMT", 
+                "content-length": "1549", 
+                "content-type": "text/xml"
+            }
+        }, 
+        "DBSnapshots": [
+            {
+                "Engine": "postgres", 
+                "SnapshotCreateTime": {
+                    "hour": 15, 
+                    "__class__": "datetime", 
+                    "month": 5, 
+                    "second": 18, 
+                    "microsecond": 478000, 
+                    "year": 2017, 
+                    "day": 25, 
+                    "minute": 52
+                }, 
+                "AvailabilityZone": "us-east-2b", 
+                "DBSnapshotArn": "arn:aws:rds:us-east-2:644160558196:snapshot:final-mxtest-2017-05-25", 
+                "PercentProgress": 100, 
+                "MasterUsername": "mxtester", 
+                "Encrypted": true, 
+                "LicenseModel": "postgresql-license", 
+                "StorageType": "gp2", 
+                "Status": "available", 
+                "VpcId": "vpc-5f6c9936", 
+                "DBSnapshotIdentifier": "final-mxtest-2017-05-25", 
+                "InstanceCreateTime": {
+                    "hour": 17, 
+                    "__class__": "datetime", 
+                    "month": 12, 
+                    "second": 52, 
+                    "microsecond": 162000, 
+                    "year": 2016, 
+                    "day": 22, 
+                    "minute": 14
+                }, 
+                "OptionGroupName": "default:postgres-9-5", 
+                "AllocatedStorage": 5, 
+                "EngineVersion": "9.5.4", 
+                "SnapshotType": "manual", 
+                "KmsKeyId": "arn:aws:kms:us-east-2:644160558196:key/38343899-6a22-4365-8777-3224dc078cab", 
+                "IAMDatabaseAuthenticationEnabled": false, 
+                "Port": 5432, 
+                "DBInstanceIdentifier": "mxtest"
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_rds_restore/rds.ListTagsForResource_1.json b/tests/data/placebo/test_rds_restore/rds.ListTagsForResource_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_rds_restore/rds.ListTagsForResource_1.json
@@ -0,0 +1,54 @@
+{
+    "status_code": 200, 
+    "data": {
+        "ResponseMetadata": {
+            "RetryAttempts": 0, 
+            "HTTPStatusCode": 200, 
+            "RequestId": "fd029e2b-4191-11e7-94f6-2369bd255e2c", 
+            "HTTPHeaders": {
+                "x-amzn-requestid": "fd029e2b-4191-11e7-94f6-2369bd255e2c", 
+                "date": "Thu, 25 May 2017 21:34:52 GMT", 
+                "content-length": "1134", 
+                "content-type": "text/xml"
+            }
+        }, 
+        "TagList": [
+            {
+                "Value": "gp2", 
+                "Key": "StorageType"
+            }, 
+            {
+                "Value": "default.postgres9.5", 
+                "Key": "ParameterGroupName"
+            }, 
+            {
+                "Value": "sg-aa6c90c3", 
+                "Key": "VPCSecurityGroups"
+            }, 
+            {
+                "Value": "default:postgres-9-5", 
+                "Key": "OptionGroupName"
+            }, 
+            {
+                "Value": "db.m4.large", 
+                "Key": "InstanceClass"
+            }, 
+            {
+                "Value": "default", 
+                "Key": "DBSubnetGroupName"
+            }, 
+            {
+                "Value": "other", 
+                "Key": "workload-type"
+            }, 
+            {
+                "Value": "False", 
+                "Key": "MultiAZ"
+            }, 
+            {
+                "Value": "Testing", 
+                "Key": "AppName"
+            }
+        ]
+    }
+}
diff --git a/tests/data/placebo/test_rds_restore/rds.ModifyDBInstance_1.json b/tests/data/placebo/test_rds_restore/rds.ModifyDBInstance_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_rds_restore/rds.ModifyDBInstance_1.json
@@ -0,0 +1,121 @@
+{
+    "status_code": 200, 
+    "data": {
+        "DBInstance": {
+            "PubliclyAccessible": true, 
+            "MasterUsername": "mxtester", 
+            "MonitoringInterval": 0, 
+            "LicenseModel": "postgresql-license", 
+            "VpcSecurityGroups": [
+                {
+                    "Status": "active", 
+                    "VpcSecurityGroupId": "sg-aa6c90c3"
+                }
+            ], 
+            "InstanceCreateTime": {
+                "hour": 21, 
+                "__class__": "datetime", 
+                "month": 5, 
+                "second": 21, 
+                "microsecond": 56000, 
+                "year": 2017, 
+                "day": 25, 
+                "minute": 39
+            }, 
+            "CopyTagsToSnapshot": true, 
+            "OptionGroupMemberships": [
+                {
+                    "Status": "in-sync", 
+                    "OptionGroupName": "default:postgres-9-5"
+                }
+            ], 
+            "PendingModifiedValues": {}, 
+            "Engine": "postgres", 
+            "MultiAZ": false, 
+            "LatestRestorableTime": {
+                "hour": 21, 
+                "__class__": "datetime", 
+                "month": 5, 
+                "second": 35, 
+                "microsecond": 0, 
+                "year": 2017, 
+                "day": 25, 
+                "minute": 40
+            }, 
+            "DBSecurityGroups": [], 
+            "DBParameterGroups": [
+                {
+                    "DBParameterGroupName": "default.postgres9.5", 
+                    "ParameterApplyStatus": "in-sync"
+                }
+            ], 
+            "AutoMinorVersionUpgrade": true, 
+            "PreferredBackupWindow": "04:35-05:05", 
+            "DBSubnetGroup": {
+                "Subnets": [
+                    {
+                        "SubnetStatus": "Active", 
+                        "SubnetIdentifier": "subnet-db9f62b2", 
+                        "SubnetAvailabilityZone": {
+                            "Name": "us-east-2a"
+                        }
+                    }, 
+                    {
+                        "SubnetStatus": "Active", 
+                        "SubnetIdentifier": "subnet-65dbce1d", 
+                        "SubnetAvailabilityZone": {
+                            "Name": "us-east-2b"
+                        }
+                    }, 
+                    {
+                        "SubnetStatus": "Active", 
+                        "SubnetIdentifier": "subnet-b77a4ffd", 
+                        "SubnetAvailabilityZone": {
+                            "Name": "us-east-2c"
+                        }
+                    }
+                ], 
+                "DBSubnetGroupName": "default", 
+                "VpcId": "vpc-5f6c9936", 
+                "DBSubnetGroupDescription": "default", 
+                "SubnetGroupStatus": "Complete"
+            }, 
+            "ReadReplicaDBInstanceIdentifiers": [], 
+            "AllocatedStorage": 5, 
+            "DBInstanceArn": "arn:aws:rds:us-east-2:644160558196:db:mxtest4", 
+            "BackupRetentionPeriod": 7, 
+            "DBName": "mxtest", 
+            "PreferredMaintenanceWindow": "mon:09:26-mon:09:56", 
+            "Endpoint": {
+                "HostedZoneId": "Z2XHWR1WZ565X2", 
+                "Port": 5432, 
+                "Address": "mxtest4.cxqrthndxfft.us-east-2.rds.amazonaws.com"
+            }, 
+            "DBInstanceStatus": "available", 
+            "IAMDatabaseAuthenticationEnabled": false, 
+            "EngineVersion": "9.5.4", 
+            "AvailabilityZone": "us-east-2c", 
+            "DomainMemberships": [], 
+            "StorageType": "gp2", 
+            "DbiResourceId": "db-HJC7IKBO2ACTLNNZCM7EX66IHE", 
+            "CACertificateIdentifier": "rds-ca-2015", 
+            "KmsKeyId": "arn:aws:kms:us-east-2:644160558196:key/38343899-6a22-4365-8777-3224dc078cab", 
+            "StorageEncrypted": true, 
+            "DBInstanceClass": "db.m4.large", 
+            "DbInstancePort": 0, 
+            "DBInstanceIdentifier": "mxtest4"
+        }, 
+        "ResponseMetadata": {
+            "RetryAttempts": 0, 
+            "HTTPStatusCode": 200, 
+            "RequestId": "41c8191f-4193-11e7-97eb-498709e28eb5", 
+            "HTTPHeaders": {
+                "x-amzn-requestid": "41c8191f-4193-11e7-97eb-498709e28eb5", 
+                "vary": "Accept-Encoding", 
+                "content-length": "4071", 
+                "content-type": "text/xml", 
+                "date": "Thu, 25 May 2017 21:43:57 GMT"
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_rds_restore/rds.RebootDBInstance_1.json b/tests/data/placebo/test_rds_restore/rds.RebootDBInstance_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_rds_restore/rds.RebootDBInstance_1.json
@@ -0,0 +1,121 @@
+{
+    "status_code": 200, 
+    "data": {
+        "DBInstance": {
+            "PubliclyAccessible": true, 
+            "MasterUsername": "mxtester", 
+            "MonitoringInterval": 0, 
+            "LicenseModel": "postgresql-license", 
+            "VpcSecurityGroups": [
+                {
+                    "Status": "active", 
+                    "VpcSecurityGroupId": "sg-aa6c90c3"
+                }
+            ], 
+            "InstanceCreateTime": {
+                "hour": 21, 
+                "__class__": "datetime", 
+                "month": 5, 
+                "second": 21, 
+                "microsecond": 56000, 
+                "year": 2017, 
+                "day": 25, 
+                "minute": 39
+            }, 
+            "CopyTagsToSnapshot": true, 
+            "OptionGroupMemberships": [
+                {
+                    "Status": "in-sync", 
+                    "OptionGroupName": "default:postgres-9-5"
+                }
+            ], 
+            "PendingModifiedValues": {}, 
+            "Engine": "postgres", 
+            "MultiAZ": false, 
+            "LatestRestorableTime": {
+                "hour": 21, 
+                "__class__": "datetime", 
+                "month": 5, 
+                "second": 35, 
+                "microsecond": 0, 
+                "year": 2017, 
+                "day": 25, 
+                "minute": 40
+            }, 
+            "DBSecurityGroups": [], 
+            "DBParameterGroups": [
+                {
+                    "DBParameterGroupName": "default.postgres9.5", 
+                    "ParameterApplyStatus": "in-sync"
+                }
+            ], 
+            "AutoMinorVersionUpgrade": true, 
+            "PreferredBackupWindow": "04:35-05:05", 
+            "DBSubnetGroup": {
+                "Subnets": [
+                    {
+                        "SubnetStatus": "Active", 
+                        "SubnetIdentifier": "subnet-db9f62b2", 
+                        "SubnetAvailabilityZone": {
+                            "Name": "us-east-2a"
+                        }
+                    }, 
+                    {
+                        "SubnetStatus": "Active", 
+                        "SubnetIdentifier": "subnet-65dbce1d", 
+                        "SubnetAvailabilityZone": {
+                            "Name": "us-east-2b"
+                        }
+                    }, 
+                    {
+                        "SubnetStatus": "Active", 
+                        "SubnetIdentifier": "subnet-b77a4ffd", 
+                        "SubnetAvailabilityZone": {
+                            "Name": "us-east-2c"
+                        }
+                    }
+                ], 
+                "DBSubnetGroupName": "default", 
+                "VpcId": "vpc-5f6c9936", 
+                "DBSubnetGroupDescription": "default", 
+                "SubnetGroupStatus": "Complete"
+            }, 
+            "ReadReplicaDBInstanceIdentifiers": [], 
+            "AllocatedStorage": 5, 
+            "DBInstanceArn": "arn:aws:rds:us-east-2:644160558196:db:mxtest4", 
+            "BackupRetentionPeriod": 7, 
+            "DBName": "mxtest", 
+            "PreferredMaintenanceWindow": "mon:09:26-mon:09:56", 
+            "Endpoint": {
+                "HostedZoneId": "Z2XHWR1WZ565X2", 
+                "Port": 5432, 
+                "Address": "mxtest4.cxqrthndxfft.us-east-2.rds.amazonaws.com"
+            }, 
+            "DBInstanceStatus": "rebooting", 
+            "IAMDatabaseAuthenticationEnabled": false, 
+            "EngineVersion": "9.5.4", 
+            "AvailabilityZone": "us-east-2c", 
+            "DomainMemberships": [], 
+            "StorageType": "gp2", 
+            "DbiResourceId": "db-HJC7IKBO2ACTLNNZCM7EX66IHE", 
+            "CACertificateIdentifier": "rds-ca-2015", 
+            "KmsKeyId": "arn:aws:kms:us-east-2:644160558196:key/38343899-6a22-4365-8777-3224dc078cab", 
+            "StorageEncrypted": true, 
+            "DBInstanceClass": "db.m4.large", 
+            "DbInstancePort": 0, 
+            "DBInstanceIdentifier": "mxtest4"
+        }, 
+        "ResponseMetadata": {
+            "RetryAttempts": 0, 
+            "HTTPStatusCode": 200, 
+            "RequestId": "41f62e03-4193-11e7-97eb-498709e28eb5", 
+            "HTTPHeaders": {
+                "x-amzn-requestid": "41f62e03-4193-11e7-97eb-498709e28eb5", 
+                "vary": "Accept-Encoding", 
+                "content-length": "4071", 
+                "content-type": "text/xml", 
+                "date": "Thu, 25 May 2017 21:43:57 GMT"
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_rds_restore/rds.RestoreDBInstanceFromDBSnapshot_1.json b/tests/data/placebo/test_rds_restore/rds.RestoreDBInstanceFromDBSnapshot_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_rds_restore/rds.RestoreDBInstanceFromDBSnapshot_1.json
@@ -0,0 +1,95 @@
+{
+    "status_code": 200, 
+    "data": {
+        "DBInstance": {
+            "PubliclyAccessible": true, 
+            "MasterUsername": "mxtester", 
+            "MonitoringInterval": 0, 
+            "LicenseModel": "postgresql-license", 
+            "VpcSecurityGroups": [
+                {
+                    "Status": "active", 
+                    "VpcSecurityGroupId": "sg-aa6c90c3"
+                }
+            ], 
+            "CopyTagsToSnapshot": true, 
+            "OptionGroupMemberships": [
+                {
+                    "Status": "pending-apply", 
+                    "OptionGroupName": "default:postgres-9-5"
+                }
+            ], 
+            "PendingModifiedValues": {}, 
+            "Engine": "postgres", 
+            "MultiAZ": false, 
+            "DBSecurityGroups": [], 
+            "DBParameterGroups": [
+                {
+                    "DBParameterGroupName": "default.postgres9.5", 
+                    "ParameterApplyStatus": "in-sync"
+                }
+            ], 
+            "AutoMinorVersionUpgrade": true, 
+            "PreferredBackupWindow": "04:35-05:05", 
+            "DBSubnetGroup": {
+                "Subnets": [
+                    {
+                        "SubnetStatus": "Active", 
+                        "SubnetIdentifier": "subnet-db9f62b2", 
+                        "SubnetAvailabilityZone": {
+                            "Name": "us-east-2a"
+                        }
+                    }, 
+                    {
+                        "SubnetStatus": "Active", 
+                        "SubnetIdentifier": "subnet-65dbce1d", 
+                        "SubnetAvailabilityZone": {
+                            "Name": "us-east-2b"
+                        }
+                    }, 
+                    {
+                        "SubnetStatus": "Active", 
+                        "SubnetIdentifier": "subnet-b77a4ffd", 
+                        "SubnetAvailabilityZone": {
+                            "Name": "us-east-2c"
+                        }
+                    }
+                ], 
+                "DBSubnetGroupName": "default", 
+                "VpcId": "vpc-5f6c9936", 
+                "DBSubnetGroupDescription": "default", 
+                "SubnetGroupStatus": "Complete"
+            }, 
+            "ReadReplicaDBInstanceIdentifiers": [], 
+            "AllocatedStorage": 5, 
+            "DBInstanceArn": "arn:aws:rds:us-east-2:644160558196:db:mxtest4", 
+            "BackupRetentionPeriod": 7, 
+            "DBName": "mxtest", 
+            "PreferredMaintenanceWindow": "mon:09:26-mon:09:56", 
+            "DBInstanceStatus": "creating", 
+            "IAMDatabaseAuthenticationEnabled": false, 
+            "EngineVersion": "9.5.4", 
+            "DomainMemberships": [], 
+            "StorageType": "gp2", 
+            "DbiResourceId": "db-HJC7IKBO2ACTLNNZCM7EX66IHE", 
+            "CACertificateIdentifier": "rds-ca-2015", 
+            "KmsKeyId": "arn:aws:kms:us-east-2:644160558196:key/38343899-6a22-4365-8777-3224dc078cab", 
+            "StorageEncrypted": true, 
+            "DBInstanceClass": "db.m4.large", 
+            "DbInstancePort": 0, 
+            "DBInstanceIdentifier": "mxtest4"
+        }, 
+        "ResponseMetadata": {
+            "RetryAttempts": 0, 
+            "HTTPStatusCode": 200, 
+            "RequestId": "fd1e3c83-4191-11e7-94f6-2369bd255e2c", 
+            "HTTPHeaders": {
+                "x-amzn-requestid": "fd1e3c83-4191-11e7-94f6-2369bd255e2c", 
+                "vary": "Accept-Encoding", 
+                "content-length": "3749", 
+                "content-type": "text/xml", 
+                "date": "Thu, 25 May 2017 21:34:54 GMT"
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/test_rds.py b/tests/test_rds.py
--- a/tests/test_rds.py
+++ b/tests/test_rds.py
@@ -20,6 +20,7 @@
 import uuid
 from collections import OrderedDict
 
+from botocore.exceptions import ClientError
 import boto3
 from common import BaseTest
 
@@ -221,6 +222,59 @@ def test_rds_retention_copy_tags(self):
         resources = p.run()
         self.assertEqual(len(resources), 6)
 
+    def test_rds_restore(self):
+        self.patch(rds.RestoreInstance, 'executor_factory', MainThreadExecutor)
+        session_factory = self.replay_flight_data('test_rds_restore')
+        client = session_factory().client('rds')
+        instance_id = 'mxtest'
+        self.assertRaises(
+            ClientError,
+            client.describe_db_instances,
+            DBInstanceIdentifier=instance_id)
+
+        p = self.load_policy({
+            'name': 'rds-restore',
+            'resource': 'rds-snapshot',
+            'filters': [
+                {'MasterUsername': 'mxtester'},
+                'latest'],
+            'actions': [
+                {'type': 'restore',
+                 'restore_options': {'DBInstanceIdentifier': instance_id}}]
+                }, session_factory=session_factory)
+        resources = p.run()
+
+        self.assertEqual(len(resources), 1)
+        try:
+            client.describe_db_instances(
+                DBInstanceIdentifier=instance_id)
+        except ClientError:
+            self.fail("DB Not found")
+
+    def test_rds_delete_copy(self):
+        session_factory = self.replay_flight_data('test_rds_delete_copy_restore')
+        client = session_factory().client('rds')
+        instance_id = 'mxtest'
+        db_info = client.describe_db_instances(DBInstanceIdentifier=instance_id)
+        self.assertFalse(db_info['DBInstances'][0]['CopyTagsToSnapshot'])
+        p = self.load_policy(
+            {'name': 'rds-delete',
+             'resource': 'rds',
+             'filters': [
+                 {'DBInstanceIdentifier': instance_id}],
+             'actions': [
+                 {'type': 'delete',
+                  'copy-restore-info': True}]},
+            config={'region': 'us-east-2'},
+            session_factory=session_factory)
+        resources = p.run()
+        db_info = client.describe_db_instances(DBInstanceIdentifier=instance_id)
+        self.assertTrue(db_info['DBInstances'][0]['CopyTagsToSnapshot'])
+        snaps = p.resource_manager.get_resource_manager(
+            'rds-snapshot').get_resources(('final-mxtest-2017-05-25',))
+        snap_keys = {t['Key'] for t in snaps[0]['Tags']}
+        self.assertTrue(snap_keys.issuperset(rds.RestoreInstance.restore_keys))
+
     def test_rds_delete(self):
         session_factory = self.replay_flight_data('test_rds_delete')
         p = self.load_policy(