Skip to content

Commit 74b7cc7

Browse files
authored
Merge pull request #18 from theonestack/feature/aurora-serverless
aurora serverless v2
2 parents 01546e1 + 20e9abb commit 74b7cc7

28 files changed

+1039
-81
lines changed

.github/workflows/rspec.yaml

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,6 @@ name: cftest
33
on: [push, pull_request]
44

55
jobs:
6-
test:
7-
name: test
8-
runs-on: ubuntu-latest
9-
10-
steps:
11-
- uses: actions/checkout@v2
12-
- name: set up ruby 2.7
13-
uses: actions/setup-ruby@v1
14-
with:
15-
ruby-version: 2.7.x
16-
- name: install gems
17-
run: gem install cfhighlander rspec
18-
- name: set cfndsl spec
19-
run: cfndsl -u
20-
- name: cftest
21-
run: rspec
22-
env:
23-
AWS_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY }}
24-
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
25-
AWS_REGION: ap-southeast-2
6+
rspec:
7+
uses: theonestack/shared-workflows/.github/workflows/rspec.yaml@main
8+
secrets: inherit

aurora-postgres.cfhighlander.rb

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,22 @@
77
Parameters do
88
ComponentParam 'EnvironmentName', 'dev', isGlobal: true
99
ComponentParam 'EnvironmentType', 'development', isGlobal: true, allowedValues: ['development', 'production']
10-
ComponentParam 'WriterInstanceType'
11-
ComponentParam 'ReaderInstanceType'
1210
ComponentParam 'DnsDomain'
1311
ComponentParam 'SnapshotID'
14-
ComponentParam 'EnableReader', 'false', allowedValues: ['true', 'false']
1512
ComponentParam 'VPCId', type: 'AWS::EC2::VPC::Id'
1613
ComponentParam 'SubnetIds', type: 'CommaDelimitedList'
1714
ComponentParam 'KmsKeyId' if (defined? kms) && (kms)
1815

16+
if defined?(engine_mode) && engine_mode == 'serverless'
17+
ComponentParam 'MaxCapacity', '2'
18+
ComponentParam 'MinCapacity', '0.5'
19+
ComponentParam 'EnableHttpEndpoint', 'false', allowedValues: ['true', 'false']
20+
else
21+
ComponentParam 'WriterInstanceType'
22+
ComponentParam 'ReaderInstanceType'
23+
ComponentParam 'EnableReader', 'false', allowedValues: ['true', 'false']
24+
end
25+
1926
ComponentParam 'NamespaceId' if defined? service_discovery
2027
end
2128

aurora-postgres.cfndsl.rb

Lines changed: 58 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
CloudFormation do
22

3-
Condition("EnableReader", FnEquals(Ref("EnableReader"), 'true'))
43
Condition("UseUsernameAndPassword", FnEquals(Ref(:SnapshotID), ''))
54
Condition("UseSnapshotID", FnNot(FnEquals(Ref(:SnapshotID), '')))
65
Condition("CreateHostRecord", FnNot(FnEquals(Ref(:DnsDomain), '')))
7-
Condition("CreateReaderRecord", FnAnd([FnEquals(Ref("EnableReader"), 'true'), Condition('CreateHostRecord')]))
86

97
aurora_tags = []
108
tags = external_parameters.fetch(:tags, {})
@@ -163,19 +161,22 @@
163161
end
164162

165163
engine_version = external_parameters.fetch(:engine_version, nil)
164+
engine_mode = external_parameters.fetch(:engine_mode, nil)
166165
database_name = external_parameters.fetch(:database_name, nil)
167166
storage_encrypted = external_parameters.fetch(:storage_encrypted, nil)
168167
kms = external_parameters.fetch(:kms, false)
169168
cluster_maintenance_window = external_parameters.fetch(:cluster_maintenance_window, nil)
170169
cloudwatch_log_exports = external_parameters.fetch(:cloudwatch_log_exports, [])
171170

171+
# for serverless v2 the EngineMode property in the DBCluster is to be left unset
172+
172173
RDS_DBCluster(:DBCluster) {
173174
Engine 'aurora-postgresql'
174175
EngineVersion engine_version unless engine_version.nil?
175176
DBClusterParameterGroupName Ref(:DBClusterParameterGroup)
176177
EnableCloudwatchLogsExports cloudwatch_log_exports if cloudwatch_log_exports.any?
177178
PreferredMaintenanceWindow cluster_maintenance_window unless cluster_maintenance_window.nil?
178-
SnapshotIdentifier FnIf('UseSnapshotID',Ref(:SnapshotID), Ref('AWS::NoValue'))
179+
SnapshotIdentifier FnIf('UseSnapshotID', Ref(:SnapshotID), Ref('AWS::NoValue'))
179180
MasterUsername FnIf('UseUsernameAndPassword', instance_username, Ref('AWS::NoValue'))
180181
MasterUserPassword FnIf('UseUsernameAndPassword', instance_password, Ref('AWS::NoValue'))
181182
DBSubnetGroupName Ref(:DBClusterSubnetGroup)
@@ -186,6 +187,14 @@
186187
Port external_parameters[:cluster_port]
187188
Tags aurora_tags
188189
AssociatedRoles cluster_roles if cluster_roles.any?
190+
191+
if engine_mode == 'serverless'
192+
EnableHttpEndpoint Ref(:EnableHttpEndpoint)
193+
ServerlessV2ScalingConfiguration({
194+
MinCapacity: Ref('MinCapacity'),
195+
MaxCapacity: Ref('MaxCapacity')
196+
})
197+
end
189198
}
190199

191200
instance_parameters = external_parameters.fetch(:instance_parameters, nil)
@@ -201,43 +210,55 @@
201210
maint_window = external_parameters.fetch(:maint_window, nil) # key kept for backwards compatibility
202211
writer_maintenance_window = external_parameters.fetch(:writer_maintenance_window, maint_window)
203212

204-
RDS_DBInstance(:DBClusterInstanceWriter) {
205-
DBSubnetGroupName Ref(:DBClusterSubnetGroup)
206-
DBParameterGroupName Ref(:DBInstanceParameterGroup)
207-
DBClusterIdentifier Ref(:DBCluster)
208-
Engine 'aurora-postgresql'
209-
EngineVersion engine_version unless engine_version.nil?
210-
AutoMinorVersionUpgrade minor_upgrade unless minor_upgrade.nil?
211-
PreferredMaintenanceWindow writer_maintenance_window unless writer_maintenance_window.nil?
212-
PubliclyAccessible 'false'
213-
DBInstanceClass Ref(:WriterInstanceType)
214-
Tags aurora_tags
215-
}
213+
if engine_mode == 'serverless'
214+
RDS_DBInstance(:ServerlessDBInstance) {
215+
Engine 'aurora-postgresql'
216+
DBInstanceClass 'db.serverless'
217+
DBClusterIdentifier Ref(:DBCluster)
218+
}
216219

217-
reader_maintenance_window = external_parameters.fetch(:reader_maintenance_window, nil)
220+
else
221+
Condition("CreateReaderRecord", FnAnd([FnEquals(Ref("EnableReader"), 'true'), Condition('CreateHostRecord')]))
222+
Condition("EnableReader", FnEquals(Ref("EnableReader"), 'true'))
223+
224+
RDS_DBInstance(:DBClusterInstanceWriter) {
225+
DBSubnetGroupName Ref(:DBClusterSubnetGroup)
226+
DBParameterGroupName Ref(:DBInstanceParameterGroup)
227+
DBClusterIdentifier Ref(:DBCluster)
228+
Engine 'aurora-postgresql'
229+
EngineVersion engine_version unless engine_version.nil?
230+
AutoMinorVersionUpgrade minor_upgrade unless minor_upgrade.nil?
231+
PreferredMaintenanceWindow writer_maintenance_window unless writer_maintenance_window.nil?
232+
PubliclyAccessible 'false'
233+
DBInstanceClass Ref(:WriterInstanceType)
234+
Tags aurora_tags
235+
}
218236

219-
RDS_DBInstance(:DBClusterInstanceReader) {
220-
Condition(:EnableReader)
221-
DBSubnetGroupName Ref(:DBClusterSubnetGroup)
222-
DBParameterGroupName Ref(:DBInstanceParameterGroup)
223-
DBClusterIdentifier Ref(:DBCluster)
224-
Engine 'aurora-postgresql'
225-
EngineVersion engine_version unless engine_version.nil?
226-
AutoMinorVersionUpgrade minor_upgrade unless minor_upgrade.nil?
227-
PreferredMaintenanceWindow reader_maintenance_window unless reader_maintenance_window.nil?
228-
PubliclyAccessible 'false'
229-
DBInstanceClass Ref(:ReaderInstanceType)
230-
Tags aurora_tags
231-
}
237+
reader_maintenance_window = external_parameters.fetch(:reader_maintenance_window, nil)
238+
239+
RDS_DBInstance(:DBClusterInstanceReader) {
240+
Condition(:EnableReader)
241+
DBSubnetGroupName Ref(:DBClusterSubnetGroup)
242+
DBParameterGroupName Ref(:DBInstanceParameterGroup)
243+
DBClusterIdentifier Ref(:DBCluster)
244+
Engine 'aurora-postgresql'
245+
EngineVersion engine_version unless engine_version.nil?
246+
AutoMinorVersionUpgrade minor_upgrade unless minor_upgrade.nil?
247+
PreferredMaintenanceWindow reader_maintenance_window unless reader_maintenance_window.nil?
248+
PubliclyAccessible 'false'
249+
DBInstanceClass Ref(:ReaderInstanceType)
250+
Tags aurora_tags
251+
}
232252

233-
Route53_RecordSet(:DBClusterReaderRecord) {
234-
Condition(:CreateReaderRecord)
235-
HostedZoneName FnSub("#{external_parameters[:dns_format]}.")
236-
Name FnSub("#{external_parameters[:hostname_read_endpoint]}.#{external_parameters[:dns_format]}.")
237-
Type 'CNAME'
238-
TTL '60'
239-
ResourceRecords [ FnGetAtt('DBCluster','ReadEndpoint.Address') ]
240-
}
253+
Route53_RecordSet(:DBClusterReaderRecord) {
254+
Condition(:CreateReaderRecord)
255+
HostedZoneName FnSub("#{external_parameters[:dns_format]}.")
256+
Name FnSub("#{external_parameters[:hostname_read_endpoint]}.#{external_parameters[:dns_format]}.")
257+
Type 'CNAME'
258+
TTL '60'
259+
ResourceRecords [ FnGetAtt('DBCluster','ReadEndpoint.Address') ]
260+
}
261+
end
241262

242263
Route53_RecordSet(:DBHostRecord) {
243264
Condition(:CreateHostRecord)

spec/cloudwatch_log_exports_spec.rb

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,10 @@
9595
expect(resource["Properties"]["Engine"]).to eq("aurora-postgresql")
9696
end
9797

98+
it "to have property EngineVersion" do
99+
expect(resource["Properties"]["EngineVersion"]).to eq(12.1)
100+
end
101+
98102
it "to have property DBClusterParameterGroupName" do
99103
expect(resource["Properties"]["DBClusterParameterGroupName"]).to eq({"Ref"=>"DBClusterParameterGroup"})
100104
end
@@ -177,6 +181,10 @@
177181
expect(resource["Properties"]["Engine"]).to eq("aurora-postgresql")
178182
end
179183

184+
it "to have property EngineVersion" do
185+
expect(resource["Properties"]["EngineVersion"]).to eq(12.1)
186+
end
187+
180188
it "to have property PubliclyAccessible" do
181189
expect(resource["Properties"]["PubliclyAccessible"]).to eq("false")
182190
end
@@ -214,6 +222,10 @@
214222
expect(resource["Properties"]["Engine"]).to eq("aurora-postgresql")
215223
end
216224

225+
it "to have property EngineVersion" do
226+
expect(resource["Properties"]["EngineVersion"]).to eq(12.1)
227+
end
228+
217229
it "to have property PubliclyAccessible" do
218230
expect(resource["Properties"]["PubliclyAccessible"]).to eq("false")
219231
end
@@ -236,11 +248,11 @@
236248
end
237249

238250
it "to have property HostedZoneName" do
239-
expect(resource["Properties"]["HostedZoneName"]).to eq({"Fn::Join"=>["", [{"Ref"=>"EnvironmentName"}, ".", {"Ref"=>"DnsDomain"}, "."]]})
251+
expect(resource["Properties"]["HostedZoneName"]).to eq({"Fn::Sub"=>"${EnvironmentName}.${DnsDomain}."})
240252
end
241253

242254
it "to have property Name" do
243-
expect(resource["Properties"]["Name"]).to eq({"Fn::Join"=>["", ["aurora2pg-read", ".", {"Ref"=>"EnvironmentName"}, ".", {"Ref"=>"DnsDomain"}, "."]]})
255+
expect(resource["Properties"]["Name"]).to eq({"Fn::Sub"=>"aurora2pg-read.${EnvironmentName}.${DnsDomain}."})
244256
end
245257

246258
it "to have property Type" do
@@ -265,11 +277,11 @@
265277
end
266278

267279
it "to have property HostedZoneName" do
268-
expect(resource["Properties"]["HostedZoneName"]).to eq({"Fn::Join"=>["", [{"Ref"=>"EnvironmentName"}, ".", {"Ref"=>"DnsDomain"}, "."]]})
280+
expect(resource["Properties"]["HostedZoneName"]).to eq({"Fn::Sub"=>"${EnvironmentName}.${DnsDomain}."})
269281
end
270282

271283
it "to have property Name" do
272-
expect(resource["Properties"]["Name"]).to eq({"Fn::Join"=>["", ["aurora2pg", ".", {"Ref"=>"EnvironmentName"}, ".", {"Ref"=>"DnsDomain"}, "."]]})
284+
expect(resource["Properties"]["Name"]).to eq({"Fn::Sub"=>"aurora2pg.${EnvironmentName}.${DnsDomain}."})
273285
end
274286

275287
it "to have property Type" do

spec/database_name_parameter_spec.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,10 @@
9595
expect(resource["Properties"]["Engine"]).to eq("aurora-postgresql")
9696
end
9797

98+
it "to have property EngineVersion" do
99+
expect(resource["Properties"]["EngineVersion"]).to eq(12.1)
100+
end
101+
98102
it "to have property DBClusterParameterGroupName" do
99103
expect(resource["Properties"]["DBClusterParameterGroupName"]).to eq({"Ref"=>"DBClusterParameterGroup"})
100104
end
@@ -181,6 +185,10 @@
181185
expect(resource["Properties"]["Engine"]).to eq("aurora-postgresql")
182186
end
183187

188+
it "to have property EngineVersion" do
189+
expect(resource["Properties"]["EngineVersion"]).to eq(12.1)
190+
end
191+
184192
it "to have property PubliclyAccessible" do
185193
expect(resource["Properties"]["PubliclyAccessible"]).to eq("false")
186194
end
@@ -218,6 +226,10 @@
218226
expect(resource["Properties"]["Engine"]).to eq("aurora-postgresql")
219227
end
220228

229+
it "to have property EngineVersion" do
230+
expect(resource["Properties"]["EngineVersion"]).to eq(12.1)
231+
end
232+
221233
it "to have property PubliclyAccessible" do
222234
expect(resource["Properties"]["PubliclyAccessible"]).to eq("false")
223235
end

spec/database_parameters_spec.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,10 @@
9595
expect(resource["Properties"]["Engine"]).to eq("aurora-postgresql")
9696
end
9797

98+
it "to have property EngineVersion" do
99+
expect(resource["Properties"]["EngineVersion"]).to eq(12.1)
100+
end
101+
98102
it "to have property DBClusterParameterGroupName" do
99103
expect(resource["Properties"]["DBClusterParameterGroupName"]).to eq({"Ref"=>"DBClusterParameterGroup"})
100104
end
@@ -177,6 +181,10 @@
177181
expect(resource["Properties"]["Engine"]).to eq("aurora-postgresql")
178182
end
179183

184+
it "to have property EngineVersion" do
185+
expect(resource["Properties"]["EngineVersion"]).to eq(12.1)
186+
end
187+
180188
it "to have property PubliclyAccessible" do
181189
expect(resource["Properties"]["PubliclyAccessible"]).to eq("false")
182190
end
@@ -214,6 +222,10 @@
214222
expect(resource["Properties"]["Engine"]).to eq("aurora-postgresql")
215223
end
216224

225+
it "to have property EngineVersion" do
226+
expect(resource["Properties"]["EngineVersion"]).to eq(12.1)
227+
end
228+
217229
it "to have property PubliclyAccessible" do
218230
expect(resource["Properties"]["PubliclyAccessible"]).to eq("false")
219231
end

spec/default_spec.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,10 @@
9595
expect(resource["Properties"]["Engine"]).to eq("aurora-postgresql")
9696
end
9797

98+
it "to have property EngineVersion" do
99+
expect(resource["Properties"]["EngineVersion"]).to eq("9.6.12")
100+
end
101+
98102
it "to have property DBClusterParameterGroupName" do
99103
expect(resource["Properties"]["DBClusterParameterGroupName"]).to eq({"Ref"=>"DBClusterParameterGroup"})
100104
end
@@ -177,6 +181,10 @@
177181
expect(resource["Properties"]["Engine"]).to eq("aurora-postgresql")
178182
end
179183

184+
it "to have property EngineVersion" do
185+
expect(resource["Properties"]["EngineVersion"]).to eq("9.6.12")
186+
end
187+
180188
it "to have property PubliclyAccessible" do
181189
expect(resource["Properties"]["PubliclyAccessible"]).to eq("false")
182190
end
@@ -214,6 +222,10 @@
214222
expect(resource["Properties"]["Engine"]).to eq("aurora-postgresql")
215223
end
216224

225+
it "to have property EngineVersion" do
226+
expect(resource["Properties"]["EngineVersion"]).to eq("9.6.12")
227+
end
228+
217229
it "to have property PubliclyAccessible" do
218230
expect(resource["Properties"]["PubliclyAccessible"]).to eq("false")
219231
end

0 commit comments

Comments
 (0)