Skip to content

Commit 321141f

Browse files
committed
add examples and local write forwarding
1 parent 1dac83c commit 321141f

File tree

2 files changed

+183
-4
lines changed

2 files changed

+183
-4
lines changed
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
aws::vpc vpc
2+
cidr-block: "10.0.0.0/16"
3+
4+
tags: {
5+
Name: "vpc-example"
6+
}
7+
end
8+
9+
aws::subnet subnet-us-east-2a
10+
vpc: $(aws::vpc vpc)
11+
availability-zone: "us-east-2a"
12+
cidr-block: "10.0.0.0/24"
13+
tags: {
14+
Name: "subnet-us-east-2a-example"
15+
}
16+
end
17+
18+
aws::subnet subnet-us-east-2b
19+
vpc: $(aws::vpc vpc)
20+
availability-zone: "us-east-2b"
21+
cidr-block: "10.0.1.0/24"
22+
tags: {
23+
Name: "subnet-us-east-2b-example"
24+
}
25+
end
26+
27+
aws::subnet subnet-us-east-2c
28+
vpc: $(aws::vpc vpc)
29+
availability-zone: "us-east-2c"
30+
cidr-block: "10.0.2.0/24"
31+
tags: {
32+
Name: "subnet-us-east-2c-example"
33+
}
34+
end
35+
36+
aws::db-subnet-group db-subnet-group
37+
name: "db-subnet-group-example"
38+
description: "db subnet group description"
39+
subnets: [
40+
$(aws::subnet subnet-us-east-2a),
41+
$(aws::subnet subnet-us-east-2b),
42+
$(aws::subnet subnet-us-east-2c)
43+
]
44+
45+
tags: {
46+
Name: "db-subnet-group-example"
47+
}
48+
end
49+
50+
aws::security-group security-group-example
51+
name: "example-db-cluster-security-group"
52+
vpc: $(aws::vpc vpc)
53+
description: "Allow web traffic only"
54+
end
55+
56+
aws::security-group-rules security-group-example-rules
57+
security-group: $(aws::security-group security-group-example)
58+
keep-default-egress-rules: true
59+
60+
@for port, type -in [80, 'http', 443, 'https', 999, 'foo']
61+
ingress
62+
description: "allow inbound $(type) traffic, ipv4 only"
63+
cidr-block: "0.0.0.0/0"
64+
protocol: "TCP"
65+
from-port: $(port)
66+
to-port: $(port)
67+
end
68+
@end
69+
70+
egress
71+
description: "allow outbound http traffic, ipv6 only"
72+
ipv6-cidr-block: "::/0"
73+
protocol: "TCP"
74+
from-port: 80
75+
to-port: 80
76+
end
77+
end
78+
79+
aws::kms-key aurora-master-password-encryption
80+
description: "KMS key used to encrypt aurora database master password"
81+
82+
aliases: ["alias/example/aurora-master-password-encryption"]
83+
enabled: "true"
84+
end
85+
86+
aws::db-cluster db-cluster-example
87+
identifier: "aurora-mysql-cluster"
88+
engine: "aurora-mysql"
89+
engine-version: "8.0.mysql_aurora.3.06.0"
90+
availability-zones: ["us-east-2a", "us-east-2b", "us-east-2c"]
91+
db-name: "clusterexample"
92+
93+
master-username: "root"
94+
manage-master-user-password: true
95+
master-user-secret-kms-key: $(aws::kms-key aurora-master-password-encryption)
96+
97+
storage-type: "aurora"
98+
99+
engine-mode: "provisioned"
100+
serverless-v2-scaling-configuration
101+
min-capacity: 1
102+
max-capacity: 3
103+
end
104+
105+
db-subnet-group: $(aws::db-subnet-group db-subnet-group)
106+
vpc-security-groups: [
107+
$(aws::security-group security-group-example)
108+
]
109+
backup-retention-period: 5
110+
preferred-backup-window: "07:00-09:00"
111+
preferred-maintenance-window: "tue:15:00-tue:17:00"
112+
skip-final-snapshot: true
113+
enable-local-write-forwarding: false
114+
115+
tags: {
116+
Name: "aurora-mysql-cluster"
117+
}
118+
copy-tags-to-snapshot: true
119+
storage-encrypted: true
120+
kms-key: $(aws::kms-key aurora-master-password-encryption)
121+
back-track-window: 0
122+
auto-minor-version-upgrade: true
123+
deletion-protection: false
124+
end
125+
126+
aws::db-instance db-instance-example
127+
identifier: "aurora-mysql-cluster-instance"
128+
db-instance-class: "db.serverless"
129+
db-cluster: $(aws::db-cluster db-cluster-example)
130+
engine: "aurora-mysql"
131+
apply-immediately: true
132+
tags: {
133+
Name: "aurora-mysql-cluster-instance"
134+
}
135+
end

src/main/java/gyro/aws/rds/DbClusterResource.java

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,14 @@
4141
import gyro.core.validation.Required;
4242
import gyro.core.validation.ValidStrings;
4343
import software.amazon.awssdk.services.rds.RdsClient;
44+
import software.amazon.awssdk.services.rds.model.CreateDbClusterRequest;
4445
import software.amazon.awssdk.services.rds.model.CreateDbClusterResponse;
4546
import software.amazon.awssdk.services.rds.model.DBCluster;
4647
import software.amazon.awssdk.services.rds.model.DbClusterNotFoundException;
4748
import software.amazon.awssdk.services.rds.model.DescribeDbClustersResponse;
4849
import software.amazon.awssdk.services.rds.model.InvalidDbClusterStateException;
50+
import software.amazon.awssdk.services.rds.model.LocalWriteForwardingStatus;
51+
import software.amazon.awssdk.services.rds.model.ModifyDbClusterRequest;
4952
import software.amazon.awssdk.services.rds.model.RestoreDbClusterFromS3Response;
5053
import software.amazon.awssdk.services.rds.model.RestoreDbClusterFromSnapshotResponse;
5154

@@ -145,6 +148,7 @@ public class DbClusterResource extends RdsTaggableResource implements Copyable<D
145148
private Integer allocatedStorage;
146149
private Boolean autoMinorVersionUpgrade;
147150
private Boolean copyTagsToSnapshot;
151+
private Boolean enableLocalWriteForwarding;
148152

149153
// Read-only
150154
private String endpointAddress;
@@ -186,6 +190,10 @@ public void setAvailabilityZones(List<String> availabilityZones) {
186190
*/
187191
@Updatable
188192
public Long getBackTrackWindow() {
193+
if (backTrackWindow == null) {
194+
backTrackWindow = 0L;
195+
}
196+
189197
return backTrackWindow;
190198
}
191199

@@ -659,6 +667,23 @@ public void setCopyTagsToSnapshot(Boolean copyTagsToSnapshot) {
659667
this.copyTagsToSnapshot = copyTagsToSnapshot;
660668
}
661669

670+
/**
671+
* When set to ``true``, read replicas can forward write operations to the writer DB instance in the DB cluster.
672+
* By default, write operations aren't allowed on reader DB instances.
673+
*/
674+
@Updatable
675+
public Boolean getEnableLocalWriteForwarding() {
676+
if (enableGlobalWriteForwarding == null) {
677+
enableGlobalWriteForwarding = false;
678+
}
679+
680+
return enableLocalWriteForwarding;
681+
}
682+
683+
public void setEnableLocalWriteForwarding(Boolean enableLocalWriteForwarding) {
684+
this.enableLocalWriteForwarding = enableLocalWriteForwarding;
685+
}
686+
662687
/**
663688
* DNS hostname to access the primary instance of the cluster.
664689
*/
@@ -753,6 +778,12 @@ public void copyFrom(DBCluster cluster) {
753778
config.copyFrom(cluster.serverlessV2ScalingConfiguration());
754779
setServerlessV2ScalingConfiguration(config);
755780
}
781+
782+
setEnableLocalWriteForwarding(
783+
LocalWriteForwardingStatus.REQUESTED.equals(cluster.localWriteForwardingStatus()) ||
784+
LocalWriteForwardingStatus.ENABLING.equals(cluster.localWriteForwardingStatus()) ||
785+
LocalWriteForwardingStatus.ENABLED.equals(cluster.localWriteForwardingStatus())
786+
);
756787
}
757788

758789
@Override
@@ -892,8 +923,13 @@ protected void doCreate(GyroUI ui, State state) {
892923
}
893924

894925
} else {
926+
CreateDbClusterRequest.Builder builder = CreateDbClusterRequest.builder();
927+
if (Boolean.TRUE.equals(getEnableGlobalWriteForwarding())) {
928+
builder.enableGlobalWriteForwarding(getEnableGlobalWriteForwarding());
929+
}
930+
895931
CreateDbClusterResponse response = client.createDBCluster(
896-
r -> r.availabilityZones(getAvailabilityZones())
932+
builder.availabilityZones(getAvailabilityZones())
897933
.backtrackWindow(getBackTrackWindow())
898934
.backupRetentionPeriod(getBackupRetentionPeriod())
899935
.characterSetName(getCharacterSetName())
@@ -925,7 +961,6 @@ protected void doCreate(GyroUI ui, State state) {
925961
.map(SecurityGroupResource::getId)
926962
.collect(Collectors.toList()) : null)
927963
.dbClusterInstanceClass(getDbClusterInstanceClass())
928-
.enableGlobalWriteForwarding(getEnableGlobalWriteForwarding())
929964
.iops(getIops())
930965
.manageMasterUserPassword(getManageMasterUserPassword())
931966
.masterUserSecretKmsKeyId(getMasterUserSecretKmsKey().getId())
@@ -935,6 +970,8 @@ protected void doCreate(GyroUI ui, State state) {
935970
.allocatedStorage(getAllocatedStorage())
936971
.autoMinorVersionUpgrade(getAutoMinorVersionUpgrade())
937972
.copyTagsToSnapshot(getCopyTagsToSnapshot())
973+
.enableLocalWriteForwarding(getEnableLocalWriteForwarding())
974+
.build()
938975
);
939976

940977
setArn(response.dbCluster().dbClusterArn());
@@ -981,8 +1018,13 @@ protected void doUpdate(Resource config, Set<String> changedProperties) {
9811018
.collect(Collectors.toList()) : null;
9821019

9831020
try {
1021+
ModifyDbClusterRequest.Builder builder = ModifyDbClusterRequest.builder();
1022+
if (!Objects.equals(getEnableGlobalWriteForwarding(), current.getEnableGlobalWriteForwarding())) {
1023+
builder.enableGlobalWriteForwarding(getEnableGlobalWriteForwarding());
1024+
}
1025+
9841026
client.modifyDBCluster(
985-
r -> r.applyImmediately(getApplyImmediately())
1027+
builder.applyImmediately(getApplyImmediately())
9861028
.backtrackWindow(Objects.equals(getBackTrackWindow(), current.getBackTrackWindow())
9871029
? null : getBackTrackWindow())
9881030
.backupRetentionPeriod(Objects.equals(
@@ -1015,7 +1057,6 @@ protected void doUpdate(Resource config, Set<String> changedProperties) {
10151057
.vpcSecurityGroupIds(Objects.equals(getVpcSecurityGroups(), current.getVpcSecurityGroups())
10161058
? null : vpcSecurityGroupIds)
10171059
.dbClusterInstanceClass(getDbClusterInstanceClass())
1018-
.enableGlobalWriteForwarding(getEnableGlobalWriteForwarding())
10191060
.iops(getIops())
10201061
.manageMasterUserPassword(getManageMasterUserPassword())
10211062
.masterUserSecretKmsKeyId(getMasterUserSecretKmsKey().getId())
@@ -1025,6 +1066,9 @@ protected void doUpdate(Resource config, Set<String> changedProperties) {
10251066
.allocatedStorage(getAllocatedStorage())
10261067
.autoMinorVersionUpgrade(getAutoMinorVersionUpgrade())
10271068
.copyTagsToSnapshot(getCopyTagsToSnapshot())
1069+
.enableLocalWriteForwarding(Objects.equals(getEnableLocalWriteForwarding(),
1070+
current.getEnableLocalWriteForwarding()) ? null : getEnableLocalWriteForwarding())
1071+
.build()
10281072
);
10291073
} catch (InvalidDbClusterStateException ex) {
10301074
throw new GyroException(ex.getLocalizedMessage());

0 commit comments

Comments
 (0)