diff --git a/packages/@aws-cdk/aws-rds/lib/cluster.ts b/packages/@aws-cdk/aws-rds/lib/cluster.ts index 617729064db42..351919e6ece62 100644 --- a/packages/@aws-cdk/aws-rds/lib/cluster.ts +++ b/packages/@aws-cdk/aws-rds/lib/cluster.ts @@ -102,6 +102,14 @@ export interface DatabaseClusterProps { * @default No parameter group */ parameterGroup?: IClusterParameterGroup; + + /** + * The CloudFormation policy to apply when the cluster and its instances + * are removed from the stack or replaced during an update. + * + * @default Retain + */ + deleteReplacePolicy?: cdk.DeletionPolicy } /** @@ -276,6 +284,10 @@ export class DatabaseCluster extends DatabaseClusterBase implements IDatabaseClu storageEncrypted: props.kmsKey ? true : props.storageEncrypted }); + const deleteUpdatePolicy = props.deleteReplacePolicy || cdk.DeletionPolicy.Retain; + cluster.options.deletionPolicy = deleteUpdatePolicy; + cluster.options.updateReplacePolicy = deleteUpdatePolicy; + this.clusterIdentifier = cluster.ref; this.clusterEndpoint = new Endpoint(cluster.dbClusterEndpointAddress, cluster.dbClusterEndpointPort); this.readerEndpoint = new Endpoint(cluster.dbClusterReadEndpointAddress, cluster.dbClusterEndpointPort); @@ -314,6 +326,9 @@ export class DatabaseCluster extends DatabaseClusterBase implements IDatabaseClu dbSubnetGroupName: subnetGroup.ref, }); + instance.options.deletionPolicy = deleteUpdatePolicy; + instance.options.updateReplacePolicy = deleteUpdatePolicy; + // We must have a dependency on the NAT gateway provider here to create // things in the right order. instance.node.addDependency(internetConnected); diff --git a/packages/@aws-cdk/aws-rds/test/integ.cluster-rotation.lit.expected.json b/packages/@aws-cdk/aws-rds/test/integ.cluster-rotation.lit.expected.json index 778bcbeb859d7..774d57074bb82 100644 --- a/packages/@aws-cdk/aws-rds/test/integ.cluster-rotation.lit.expected.json +++ b/packages/@aws-cdk/aws-rds/test/integ.cluster-rotation.lit.expected.json @@ -658,7 +658,9 @@ ] } ] - } + }, + "DeletionPolicy": "Retain", + "UpdateReplacePolicy": "Retain" }, "DatabaseInstance1844F58FD": { "Type": "AWS::RDS::DBInstance", @@ -676,7 +678,9 @@ "VPCPrivateSubnet1DefaultRouteAE1D6490", "VPCPrivateSubnet2DefaultRouteF4F5CFD2", "VPCPrivateSubnet3DefaultRoute27F311AE" - ] + ], + "DeletionPolicy": "Retain", + "UpdateReplacePolicy": "Retain" }, "DatabaseInstance2AA380DEE": { "Type": "AWS::RDS::DBInstance", @@ -694,7 +698,9 @@ "VPCPrivateSubnet1DefaultRouteAE1D6490", "VPCPrivateSubnet2DefaultRouteF4F5CFD2", "VPCPrivateSubnet3DefaultRoute27F311AE" - ] + ], + "DeletionPolicy": "Retain", + "UpdateReplacePolicy": "Retain" }, "DatabaseRotationSecurityGroup17736B63": { "Type": "AWS::EC2::SecurityGroup", diff --git a/packages/@aws-cdk/aws-rds/test/integ.cluster.expected.json b/packages/@aws-cdk/aws-rds/test/integ.cluster.expected.json index d8bb54664a09b..6f09d047317fe 100644 --- a/packages/@aws-cdk/aws-rds/test/integ.cluster.expected.json +++ b/packages/@aws-cdk/aws-rds/test/integ.cluster.expected.json @@ -484,7 +484,9 @@ ] } ] - } + }, + "DeletionPolicy": "Retain", + "UpdateReplacePolicy": "Retain" }, "DatabaseInstance1844F58FD": { "Type": "AWS::RDS::DBInstance", @@ -502,7 +504,9 @@ "DependsOn": [ "VPCPublicSubnet1DefaultRoute91CEF279", "VPCPublicSubnet2DefaultRouteB7481BBA" - ] + ], + "DeletionPolicy": "Retain", + "UpdateReplacePolicy": "Retain" }, "DatabaseInstance2AA380DEE": { "Type": "AWS::RDS::DBInstance", @@ -520,7 +524,9 @@ "DependsOn": [ "VPCPublicSubnet1DefaultRoute91CEF279", "VPCPublicSubnet2DefaultRouteB7481BBA" - ] + ], + "DeletionPolicy": "Retain", + "UpdateReplacePolicy": "Retain" } } -} +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-rds/test/test.cluster.ts b/packages/@aws-cdk/aws-rds/test/test.cluster.ts index b402ccda35e7d..ce5d39e104573 100644 --- a/packages/@aws-cdk/aws-rds/test/test.cluster.ts +++ b/packages/@aws-cdk/aws-rds/test/test.cluster.ts @@ -1,4 +1,4 @@ -import { expect, haveResource } from '@aws-cdk/assert'; +import { expect, haveResource, ResourcePart } from '@aws-cdk/assert'; import ec2 = require('@aws-cdk/aws-ec2'); import kms = require('@aws-cdk/aws-kms'); import cdk = require('@aws-cdk/cdk'); @@ -26,12 +26,21 @@ export = { // THEN expect(stack).to(haveResource('AWS::RDS::DBCluster', { - Engine: "aurora", - DBSubnetGroupName: { Ref: "DatabaseSubnets56F17B9A" }, - MasterUsername: "admin", - MasterUserPassword: "tooshort", - VpcSecurityGroupIds: [ {"Fn::GetAtt": ["DatabaseSecurityGroup5C91FDCB", "GroupId"]}] - })); + Properties: { + Engine: "aurora", + DBSubnetGroupName: { Ref: "DatabaseSubnets56F17B9A" }, + MasterUsername: "admin", + MasterUserPassword: "tooshort", + VpcSecurityGroupIds: [ {"Fn::GetAtt": ["DatabaseSecurityGroup5C91FDCB", "GroupId"]}] + }, + DeletionPolicy: 'Retain', + UpdateReplacePolicy: 'Retain' + }, ResourcePart.CompleteDefinition)); + + expect(stack).to(haveResource('AWS::RDS::DBInstance', { + DeletionPolicy: 'Retain', + UpdateReplacePolicy: 'Retain' + }, ResourcePart.CompleteDefinition)); test.done(); },