Skip to content

Commit b606a23

Browse files
authoredDec 3, 2021
feat(rds): parameter group for replica instances (#17822)
Move `parameterGroup` from `DatabaseInstanceSourceProps` to `DatabaseInstanceNewProps` since the parameter group of a replica instance can be customized. Closes #17580 ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license*
1 parent b60dc63 commit b606a23

File tree

4 files changed

+57
-9
lines changed

4 files changed

+57
-9
lines changed
 

‎packages/@aws-cdk/aws-rds/lib/instance.ts

+9-9
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,13 @@ export interface DatabaseInstanceNewProps {
359359
*/
360360
readonly port?: number;
361361

362+
/**
363+
* The DB parameter group to associate with the instance.
364+
*
365+
* @default - no parameter group
366+
*/
367+
readonly parameterGroup?: IParameterGroup;
368+
362369
/**
363370
* The option group to associate with the instance.
364371
*
@@ -709,6 +716,7 @@ abstract class DatabaseInstanceNew extends DatabaseInstanceBase implements IData
709716
? props.instanceIdentifier?.toLowerCase()
710717
: props.instanceIdentifier;
711718

719+
const instanceParameterGroupConfig = props.parameterGroup?.bindToInstance({});
712720
this.newCfnProps = {
713721
autoMinorVersionUpgrade: props.autoMinorVersionUpgrade,
714722
availabilityZone: props.multiAz ? undefined : props.availabilityZone,
@@ -732,6 +740,7 @@ abstract class DatabaseInstanceNew extends DatabaseInstanceBase implements IData
732740
monitoringInterval: props.monitoringInterval?.toSeconds(),
733741
monitoringRoleArn: monitoringRole?.roleArn,
734742
multiAz: props.multiAz,
743+
dbParameterGroupName: instanceParameterGroupConfig?.parameterGroupName,
735744
optionGroupName: props.optionGroup?.optionGroupName,
736745
performanceInsightsKmsKeyId: props.performanceInsightEncryptionKey?.keyArn,
737746
performanceInsightsRetentionPeriod: enablePerformanceInsights
@@ -813,13 +822,6 @@ export interface DatabaseInstanceSourceProps extends DatabaseInstanceNewProps {
813822
* @default - no name
814823
*/
815824
readonly databaseName?: string;
816-
817-
/**
818-
* The DB parameter group to associate with the instance.
819-
*
820-
* @default - no parameter group
821-
*/
822-
readonly parameterGroup?: IParameterGroup;
823825
}
824826

825827
/**
@@ -875,15 +877,13 @@ abstract class DatabaseInstanceSource extends DatabaseInstanceNew implements IDa
875877

876878
this.instanceType = props.instanceType ?? ec2.InstanceType.of(ec2.InstanceClass.M5, ec2.InstanceSize.LARGE);
877879

878-
const instanceParameterGroupConfig = props.parameterGroup?.bindToInstance({});
879880
this.sourceCfnProps = {
880881
...this.newCfnProps,
881882
associatedRoles: instanceAssociatedRoles.length > 0 ? instanceAssociatedRoles : undefined,
882883
optionGroupName: engineConfig.optionGroup?.optionGroupName,
883884
allocatedStorage: props.allocatedStorage?.toString() ?? '100',
884885
allowMajorVersionUpgrade: props.allowMajorVersionUpgrade,
885886
dbName: props.databaseName,
886-
dbParameterGroupName: instanceParameterGroupConfig?.parameterGroupName,
887887
engine: engineType,
888888
engineVersion: props.engine.engineVersion?.fullVersion,
889889
licenseModel: props.licenseModel,

‎packages/@aws-cdk/aws-rds/test/instance.test.ts

+27
Original file line numberDiff line numberDiff line change
@@ -1603,6 +1603,33 @@ describe('instance', () => {
16031603
});
16041604
}).toThrow(/Cannot set 'backupRetention', as engine 'postgres-13' does not support automatic backups for read replicas/);
16051605
});
1606+
1607+
test('can set parameter group on read replica', () => {
1608+
// GIVEN
1609+
const instanceType = ec2.InstanceType.of(ec2.InstanceClass.T3, ec2.InstanceSize.SMALL);
1610+
const engine = rds.DatabaseInstanceEngine.postgres({ version: rds.PostgresEngineVersion.VER_13 });
1611+
const parameterGroup = new rds.ParameterGroup(stack, 'ParameterGroup', { engine });
1612+
const source = new rds.DatabaseInstance(stack, 'Source', {
1613+
engine,
1614+
instanceType,
1615+
vpc,
1616+
});
1617+
1618+
// WHEN
1619+
new rds.DatabaseInstanceReadReplica(stack, 'Replica', {
1620+
sourceDatabaseInstance: source,
1621+
parameterGroup,
1622+
instanceType,
1623+
vpc,
1624+
});
1625+
1626+
// THEN
1627+
expect(stack).toHaveResource('AWS::RDS::DBInstance', {
1628+
DBParameterGroupName: {
1629+
Ref: 'ParameterGroup5E32DECB',
1630+
},
1631+
});
1632+
});
16061633
});
16071634

16081635
test.each([

‎packages/@aws-cdk/aws-rds/test/integ.read-replica.expected.json

+13
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,16 @@
422422
"UpdateReplacePolicy": "Snapshot",
423423
"DeletionPolicy": "Snapshot"
424424
},
425+
"ReplicaParameterGroup4BE5EE70": {
426+
"Type": "AWS::RDS::DBParameterGroup",
427+
"Properties": {
428+
"Description": "Parameter group for mysql8.0",
429+
"Family": "mysql8.0",
430+
"Parameters": {
431+
"wait_timeout": "86400"
432+
}
433+
}
434+
},
425435
"MysqlReplicaSubnetGroup79E1F72A": {
426436
"Type": "AWS::RDS::DBSubnetGroup",
427437
"Properties": {
@@ -458,6 +468,9 @@
458468
"DBInstanceClass": "db.t3.small",
459469
"BackupRetentionPeriod": 3,
460470
"CopyTagsToSnapshot": true,
471+
"DBParameterGroupName": {
472+
"Ref": "ReplicaParameterGroup4BE5EE70"
473+
},
461474
"DBSubnetGroupName": {
462475
"Ref": "MysqlReplicaSubnetGroup79E1F72A"
463476
},

‎packages/@aws-cdk/aws-rds/test/integ.read-replica.ts

+8
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,20 @@ class TestStack extends Stack {
4444
vpcSubnets,
4545
});
4646

47+
const parameterGroup = new rds.ParameterGroup(this, 'ReplicaParameterGroup', {
48+
engine: rds.DatabaseInstanceEngine.mysql({ version: rds.MysqlEngineVersion.VER_8_0 }),
49+
parameters: {
50+
wait_timeout: '86400',
51+
},
52+
});
53+
4754
new rds.DatabaseInstanceReadReplica(this, 'MysqlReplica', {
4855
sourceDatabaseInstance: mysqlSource,
4956
backupRetention: Duration.days(3),
5057
instanceType,
5158
vpc,
5259
vpcSubnets,
60+
parameterGroup,
5361
});
5462
}
5563
}

0 commit comments

Comments
 (0)
Please sign in to comment.