in packages/aws-cdk-lib/aws-rds/lib/aurora-cluster-instance.ts [497:604]
constructor(scope: Construct, id: string, props: AuroraClusterInstanceProps) {
super(
scope,
props.isFromLegacyInstanceProps ? `${id}Wrapper` : id,
{
physicalName: props.instanceIdentifier,
});
// Enhanced CDK Analytics Telemetry
addConstructMetadata(this, props);
this.tier = props.promotionTier ?? 2;
if (this.tier > 15) {
throw new ValidationError('promotionTier must be between 0-15', this);
}
const isOwnedResource = Resource.isOwnedResource(props.cluster);
let internetConnected;
let publiclyAccessible = props.publiclyAccessible;
if (isOwnedResource) {
const ownedCluster = props.cluster as DatabaseCluster;
internetConnected = ownedCluster.vpc.selectSubnets(ownedCluster.vpcSubnets).internetConnectivityEstablished;
const isInPublicSubnet = ownedCluster.vpcSubnets && ownedCluster.vpcSubnets.subnetType === ec2.SubnetType.PUBLIC;
publiclyAccessible = props.publiclyAccessible ?? isInPublicSubnet;
}
// Get the actual subnet objects so we can depend on internet connectivity.
const instanceType = (props.instanceType ?? ClusterInstanceType.serverlessV2());
this.type = instanceType.type;
this.instanceSize = this.type === InstanceType.PROVISIONED ? props.instanceType?.toString() : undefined;
// engine is never undefined on a managed resource, i.e. DatabaseCluster
const engine = props.cluster.engine!;
const enablePerformanceInsights = props.enablePerformanceInsights
|| props.performanceInsightRetention !== undefined || props.performanceInsightEncryptionKey !== undefined;
if (enablePerformanceInsights && props.enablePerformanceInsights === false) {
throw new ValidationError('`enablePerformanceInsights` disabled, but `performanceInsightRetention` or `performanceInsightEncryptionKey` was set', this);
}
this.performanceInsightsEnabled = enablePerformanceInsights;
this.performanceInsightRetention = enablePerformanceInsights
? (props.performanceInsightRetention || PerformanceInsightRetention.DEFAULT)
: undefined;
this.performanceInsightEncryptionKey = props.performanceInsightEncryptionKey;
const instanceParameterGroup = props.parameterGroup ?? (
props.parameters
? FeatureFlags.of(this).isEnabled(AURORA_CLUSTER_CHANGE_SCOPE_OF_INSTANCE_PARAMETER_GROUP_WITH_EACH_PARAMETERS)
? new ParameterGroup(this, 'InstanceParameterGroup', {
engine: engine,
parameters: props.parameters,
})
: new ParameterGroup(props.cluster, 'InstanceParameterGroup', {
engine: engine,
parameters: props.parameters,
})
: undefined
);
const instanceParameterGroupConfig = instanceParameterGroup?.bindToInstance({});
const instance = new CfnDBInstance(
props.isFromLegacyInstanceProps ? scope : this,
props.isFromLegacyInstanceProps ? id : 'Resource',
{
// Link to cluster
engine: engine.engineType,
dbClusterIdentifier: props.cluster.clusterIdentifier,
promotionTier: props.isFromLegacyInstanceProps ? undefined : this.tier,
dbInstanceIdentifier: this.physicalName,
// Instance properties
dbInstanceClass: props.instanceType ? databaseInstanceType(instanceType) : undefined,
publiclyAccessible,
availabilityZone: props.availabilityZone,
preferredMaintenanceWindow: props.preferredMaintenanceWindow,
enablePerformanceInsights: this.performanceInsightsEnabled || props.enablePerformanceInsights, // fall back to undefined if not set
performanceInsightsKmsKeyId: this.performanceInsightEncryptionKey?.keyArn,
performanceInsightsRetentionPeriod: this.performanceInsightRetention,
// only need to supply this when migrating from legacy method.
// this is not applicable for aurora instances, but if you do provide it and then
// change it it will cause an instance replacement
dbSubnetGroupName: props.isFromLegacyInstanceProps ? props.subnetGroup?.subnetGroupName : undefined,
dbParameterGroupName: instanceParameterGroupConfig?.parameterGroupName,
monitoringInterval: props.monitoringInterval && props.monitoringInterval.toSeconds(),
monitoringRoleArn: props.monitoringRole && props.monitoringRole.roleArn,
autoMinorVersionUpgrade: props.autoMinorVersionUpgrade,
allowMajorVersionUpgrade: props.allowMajorVersionUpgrade,
caCertificateIdentifier: props.caCertificate && props.caCertificate.toString(),
applyImmediately: props.applyImmediately,
});
// For instances that are part of a cluster:
//
// Cluster DESTROY or SNAPSHOT -> DESTROY (snapshot is good enough to recreate)
// Cluster RETAIN -> RETAIN (otherwise cluster state will disappear)
instance.applyRemovalPolicy(helperRemovalPolicy(props.removalPolicy));
// We must have a dependency on the NAT gateway provider here to create
// things in the right order.
if (internetConnected) {
instance.node.addDependency(internetConnected);
}
this.dbInstanceArn = this.getResourceArnAttribute(instance.attrDbInstanceArn, {
resource: 'db',
service: 'rds',
arnFormat: ArnFormat.COLON_RESOURCE_NAME,
resourceName: this.physicalName,
});
this.instanceIdentifier = this.getResourceNameAttribute(instance.ref);
this.dbiResourceId = instance.attrDbiResourceId;
this.dbInstanceEndpointAddress = instance.attrEndpointAddress;
}