Skip to content

Commit 0ce590c

Browse files
nickh8vigneshrajsb
andauthored
Use rds cluster endpoint instead of instance endpoint (#50)
* Use rds cluster endpoint instead of instance endpoint * Get cluster endpoint from instance --------- Co-authored-by: Vigneshraj Sekar Babu <[email protected]>
1 parent 288192a commit 0ce590c

File tree

2 files changed

+55
-104
lines changed

2 files changed

+55
-104
lines changed

src/server/lib/jsonschema/schemas/1.0.0.json

Lines changed: 24 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,7 @@
4444
"type": "number"
4545
}
4646
},
47-
"required": [
48-
"name"
49-
]
47+
"required": ["name"]
5048
}
5149
},
5250
"optionalServices": {
@@ -69,9 +67,7 @@
6967
"type": "number"
7068
}
7169
},
72-
"required": [
73-
"name"
74-
]
70+
"required": ["name"]
7571
}
7672
},
7773
"webhooks": {
@@ -124,9 +120,7 @@
124120
"type": "number"
125121
}
126122
},
127-
"required": [
128-
"image"
129-
]
123+
"required": ["image"]
130124
},
131125
"command": {
132126
"type": "object",
@@ -142,20 +136,13 @@
142136
"type": "number"
143137
}
144138
},
145-
"required": [
146-
"image",
147-
"script"
148-
]
139+
"required": ["image", "script"]
149140
},
150141
"env": {
151142
"type": "object"
152143
}
153144
},
154-
"required": [
155-
"state",
156-
"type",
157-
"env"
158-
]
145+
"required": ["state", "type", "env"]
159146
}
160147
}
161148
}
@@ -187,9 +174,7 @@
187174
"type": "string"
188175
}
189176
},
190-
"required": [
191-
"name"
192-
]
177+
"required": ["name"]
193178
}
194179
},
195180
"deploymentDependsOn": {
@@ -307,9 +292,7 @@
307292
}
308293
}
309294
},
310-
"required": [
311-
"name"
312-
]
295+
"required": ["name"]
313296
},
314297
"envLens": {
315298
"type": "boolean"
@@ -381,9 +364,7 @@
381364
"minItems": 1
382365
}
383366
},
384-
"required": [
385-
"dockerfilePath"
386-
]
367+
"required": ["dockerfilePath"]
387368
},
388369
"init": {
389370
"type": "object",
@@ -402,15 +383,10 @@
402383
"type": "object"
403384
}
404385
},
405-
"required": [
406-
"dockerfilePath"
407-
]
386+
"required": ["dockerfilePath"]
408387
}
409388
},
410-
"required": [
411-
"defaultTag",
412-
"app"
413-
]
389+
"required": ["defaultTag", "app"]
414390
}
415391
}
416392
},
@@ -654,11 +630,7 @@
654630
"type": "string"
655631
}
656632
},
657-
"required": [
658-
"name",
659-
"mountPath",
660-
"storageSize"
661-
]
633+
"required": ["name", "mountPath", "storageSize"]
662634
}
663635
},
664636
"node_selector": {
@@ -674,10 +646,7 @@
674646
}
675647
}
676648
},
677-
"required": [
678-
"repository",
679-
"branchName"
680-
]
649+
"required": ["repository", "branchName"]
681650
},
682651
"github": {
683652
"type": "object",
@@ -747,9 +716,7 @@
747716
"minItems": 1
748717
}
749718
},
750-
"required": [
751-
"dockerfilePath"
752-
]
719+
"required": ["dockerfilePath"]
753720
},
754721
"init": {
755722
"type": "object",
@@ -768,15 +735,10 @@
768735
"type": "object"
769736
}
770737
},
771-
"required": [
772-
"dockerfilePath"
773-
]
738+
"required": ["dockerfilePath"]
774739
}
775740
},
776-
"required": [
777-
"defaultTag",
778-
"app"
779-
]
741+
"required": ["defaultTag", "app"]
780742
},
781743
"deployment": {
782744
"type": "object",
@@ -981,11 +943,7 @@
981943
"type": "string"
982944
}
983945
},
984-
"required": [
985-
"name",
986-
"mountPath",
987-
"storageSize"
988-
]
946+
"required": ["name", "mountPath", "storageSize"]
989947
}
990948
},
991949
"node_selector": {
@@ -1001,11 +959,7 @@
1001959
}
1002960
}
1003961
},
1004-
"required": [
1005-
"repository",
1006-
"branchName",
1007-
"docker"
1008-
]
962+
"required": ["repository", "branchName", "docker"]
1009963
},
1010964
"docker": {
1011965
"type": "object",
@@ -1232,11 +1186,7 @@
12321186
"type": "string"
12331187
}
12341188
},
1235-
"required": [
1236-
"name",
1237-
"mountPath",
1238-
"storageSize"
1239-
]
1189+
"required": ["name", "mountPath", "storageSize"]
12401190
}
12411191
},
12421192
"node_selector": {
@@ -1252,10 +1202,7 @@
12521202
}
12531203
}
12541204
},
1255-
"required": [
1256-
"dockerImage",
1257-
"defaultTag"
1258-
]
1205+
"required": ["dockerImage", "defaultTag"]
12591206
},
12601207
"externalHttp": {
12611208
"type": "object",
@@ -1268,10 +1215,7 @@
12681215
"type": "string"
12691216
}
12701217
},
1271-
"required": [
1272-
"defaultInternalHostname",
1273-
"defaultPublicUrl"
1274-
]
1218+
"required": ["defaultInternalHostname", "defaultPublicUrl"]
12751219
},
12761220
"auroraRestore": {
12771221
"type": "object",
@@ -1284,10 +1228,7 @@
12841228
"type": "string"
12851229
}
12861230
},
1287-
"required": [
1288-
"command",
1289-
"arguments"
1290-
]
1231+
"required": ["command", "arguments"]
12911232
},
12921233
"configuration": {
12931234
"type": "object",
@@ -1300,16 +1241,11 @@
13001241
"type": "string"
13011242
}
13021243
},
1303-
"required": [
1304-
"defaultTag",
1305-
"branchName"
1306-
]
1244+
"required": ["defaultTag", "branchName"]
13071245
}
13081246
},
1309-
"required": [
1310-
"name"
1311-
]
1247+
"required": ["name"]
13121248
}
13131249
}
13141250
}
1315-
}
1251+
}

src/server/services/deploy.ts

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ export default class DeployService extends BaseService {
319319
* Helper function to check if an Aurora database already exists in AWS
320320
* @param buildUuid The build UUID to search for
321321
* @param serviceName The service name to search for
322-
* @returns The database endpoint address if found, null otherwise
322+
* @returns The database cluster endpoint address if found (or instance endpoint if not clustered), null otherwise
323323
*/
324324
private async findExistingAuroraDatabase(buildUuid: string, serviceName: string): Promise<string | null> {
325325
try {
@@ -341,21 +341,36 @@ export default class DeployService extends BaseService {
341341
})
342342
.promise();
343343

344-
if (results.ResourceTagMappingList && results.ResourceTagMappingList.length > 0) {
345-
const dbArn = results.ResourceTagMappingList[0].ResourceARN;
346-
const params = {
347-
Filters: [
348-
{
349-
Name: 'db-instance-id' /* required */,
350-
Values: [dbArn],
351-
},
352-
],
353-
};
354-
const instances = await rds.describeDBInstances(params, null).promise();
355-
356-
if (instances.DBInstances.length === 1) {
357-
const database = instances.DBInstances[0];
358-
return database.Endpoint?.Address || null;
344+
const instanceArn = results.ResourceTagMappingList?.find((mapping) =>
345+
mapping.ResourceARN?.includes(':db:')
346+
)?.ResourceARN;
347+
348+
if (instanceArn) {
349+
const instanceIdentifier = instanceArn.split(':').pop();
350+
if (instanceIdentifier) {
351+
const instances = await rds
352+
.describeDBInstances({
353+
DBInstanceIdentifier: instanceIdentifier,
354+
})
355+
.promise();
356+
const database = instances.DBInstances?.[0];
357+
if (database) {
358+
let databaseAddress = database.Endpoint?.Address;
359+
// If this instance is part of a cluster, use the cluster endpoint instead
360+
// for better resilience during instance failures and replacements
361+
if (database.DBClusterIdentifier) {
362+
const clusters = await rds
363+
.describeDBClusters({
364+
DBClusterIdentifier: database.DBClusterIdentifier,
365+
})
366+
.promise();
367+
const clusterEndpoint = clusters.DBClusters?.[0]?.Endpoint;
368+
if (clusterEndpoint) {
369+
databaseAddress = clusterEndpoint;
370+
}
371+
}
372+
return databaseAddress || null;
373+
}
359374
}
360375
}
361376
return null;

0 commit comments

Comments
 (0)