diff --git a/src/server/lib/jsonschema/schemas/1.0.0.json b/src/server/lib/jsonschema/schemas/1.0.0.json index 02a67a4f..1751be9f 100644 --- a/src/server/lib/jsonschema/schemas/1.0.0.json +++ b/src/server/lib/jsonschema/schemas/1.0.0.json @@ -44,9 +44,7 @@ "type": "number" } }, - "required": [ - "name" - ] + "required": ["name"] } }, "optionalServices": { @@ -69,9 +67,7 @@ "type": "number" } }, - "required": [ - "name" - ] + "required": ["name"] } }, "webhooks": { @@ -124,9 +120,7 @@ "type": "number" } }, - "required": [ - "image" - ] + "required": ["image"] }, "command": { "type": "object", @@ -142,20 +136,13 @@ "type": "number" } }, - "required": [ - "image", - "script" - ] + "required": ["image", "script"] }, "env": { "type": "object" } }, - "required": [ - "state", - "type", - "env" - ] + "required": ["state", "type", "env"] } } } @@ -187,9 +174,7 @@ "type": "string" } }, - "required": [ - "name" - ] + "required": ["name"] } }, "deploymentDependsOn": { @@ -307,9 +292,7 @@ } } }, - "required": [ - "name" - ] + "required": ["name"] }, "envLens": { "type": "boolean" @@ -381,9 +364,7 @@ "minItems": 1 } }, - "required": [ - "dockerfilePath" - ] + "required": ["dockerfilePath"] }, "init": { "type": "object", @@ -402,15 +383,10 @@ "type": "object" } }, - "required": [ - "dockerfilePath" - ] + "required": ["dockerfilePath"] } }, - "required": [ - "defaultTag", - "app" - ] + "required": ["defaultTag", "app"] } } }, @@ -654,11 +630,7 @@ "type": "string" } }, - "required": [ - "name", - "mountPath", - "storageSize" - ] + "required": ["name", "mountPath", "storageSize"] } }, "node_selector": { @@ -674,10 +646,7 @@ } } }, - "required": [ - "repository", - "branchName" - ] + "required": ["repository", "branchName"] }, "github": { "type": "object", @@ -747,9 +716,7 @@ "minItems": 1 } }, - "required": [ - "dockerfilePath" - ] + "required": ["dockerfilePath"] }, "init": { "type": "object", @@ -768,15 +735,10 @@ "type": "object" } }, - "required": [ - "dockerfilePath" - ] + "required": ["dockerfilePath"] } }, - "required": [ - "defaultTag", - "app" - ] + "required": ["defaultTag", "app"] }, "deployment": { "type": "object", @@ -981,11 +943,7 @@ "type": "string" } }, - "required": [ - "name", - "mountPath", - "storageSize" - ] + "required": ["name", "mountPath", "storageSize"] } }, "node_selector": { @@ -1001,11 +959,7 @@ } } }, - "required": [ - "repository", - "branchName", - "docker" - ] + "required": ["repository", "branchName", "docker"] }, "docker": { "type": "object", @@ -1232,11 +1186,7 @@ "type": "string" } }, - "required": [ - "name", - "mountPath", - "storageSize" - ] + "required": ["name", "mountPath", "storageSize"] } }, "node_selector": { @@ -1252,10 +1202,7 @@ } } }, - "required": [ - "dockerImage", - "defaultTag" - ] + "required": ["dockerImage", "defaultTag"] }, "externalHttp": { "type": "object", @@ -1268,10 +1215,7 @@ "type": "string" } }, - "required": [ - "defaultInternalHostname", - "defaultPublicUrl" - ] + "required": ["defaultInternalHostname", "defaultPublicUrl"] }, "auroraRestore": { "type": "object", @@ -1284,10 +1228,7 @@ "type": "string" } }, - "required": [ - "command", - "arguments" - ] + "required": ["command", "arguments"] }, "configuration": { "type": "object", @@ -1300,16 +1241,11 @@ "type": "string" } }, - "required": [ - "defaultTag", - "branchName" - ] + "required": ["defaultTag", "branchName"] } }, - "required": [ - "name" - ] + "required": ["name"] } } } -} \ No newline at end of file +} diff --git a/src/server/services/deploy.ts b/src/server/services/deploy.ts index b1703748..1f67de84 100644 --- a/src/server/services/deploy.ts +++ b/src/server/services/deploy.ts @@ -319,7 +319,7 @@ export default class DeployService extends BaseService { * Helper function to check if an Aurora database already exists in AWS * @param buildUuid The build UUID to search for * @param serviceName The service name to search for - * @returns The database endpoint address if found, null otherwise + * @returns The database cluster endpoint address if found (or instance endpoint if not clustered), null otherwise */ private async findExistingAuroraDatabase(buildUuid: string, serviceName: string): Promise { try { @@ -341,21 +341,36 @@ export default class DeployService extends BaseService { }) .promise(); - if (results.ResourceTagMappingList && results.ResourceTagMappingList.length > 0) { - const dbArn = results.ResourceTagMappingList[0].ResourceARN; - const params = { - Filters: [ - { - Name: 'db-instance-id' /* required */, - Values: [dbArn], - }, - ], - }; - const instances = await rds.describeDBInstances(params, null).promise(); - - if (instances.DBInstances.length === 1) { - const database = instances.DBInstances[0]; - return database.Endpoint?.Address || null; + const instanceArn = results.ResourceTagMappingList?.find((mapping) => + mapping.ResourceARN?.includes(':db:') + )?.ResourceARN; + + if (instanceArn) { + const instanceIdentifier = instanceArn.split(':').pop(); + if (instanceIdentifier) { + const instances = await rds + .describeDBInstances({ + DBInstanceIdentifier: instanceIdentifier, + }) + .promise(); + const database = instances.DBInstances?.[0]; + if (database) { + let databaseAddress = database.Endpoint?.Address; + // If this instance is part of a cluster, use the cluster endpoint instead + // for better resilience during instance failures and replacements + if (database.DBClusterIdentifier) { + const clusters = await rds + .describeDBClusters({ + DBClusterIdentifier: database.DBClusterIdentifier, + }) + .promise(); + const clusterEndpoint = clusters.DBClusters?.[0]?.Endpoint; + if (clusterEndpoint) { + databaseAddress = clusterEndpoint; + } + } + return databaseAddress || null; + } } } return null;