UNPKG

@cloudcamp/aws-runtime

Version:

CloudCamp - Launch faster by building scalable infrastructure in few lines of code.

126 lines 15.2 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.Database = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const cdk = require("aws-cdk-lib/core"); const rds = require("aws-cdk-lib/aws-rds"); const ec2 = require("aws-cdk-lib/aws-ec2"); const core_1 = require("aws-cdk-lib/core"); const secretsmanager = require("aws-cdk-lib/aws-secretsmanager"); const app_1 = require("./app"); const aws_rds_1 = require("aws-cdk-lib/aws-rds"); const constructs_1 = require("constructs"); /** * @experimental * @order 5 */ class Database extends constructs_1.Construct { /** * @param scope the scope. * @param id the id. * @param props the props. * @experimental */ constructor(scope, id, props) { super(scope, id); let engine; let type; let port; props = props || {}; switch (props.engine) { case undefined: case "postgres": engine = rds.DatabaseClusterEngine.auroraPostgres({ version: aws_rds_1.AuroraPostgresEngineVersion.VER_10_14, }); type = "postgres"; port = 5432; break; case "mysql": engine = rds.DatabaseClusterEngine.auroraMysql({ version: aws_rds_1.AuroraMysqlEngineVersion.VER_5_7_12, }); type = "mysql"; port = 3306; break; } const username = props.username || "administrator"; const secret = new secretsmanager.Secret(this, "cluster-secret", { generateSecretString: { excludePunctuation: true, }, }); const password = secret.secretValue; const databaseName = props.databaseName || "maindb"; let vpc = ec2.Vpc.fromLookup(this, "vpc", { vpcId: app_1.App.instance.configuration.vpcId, }); const securityGroup = new ec2.SecurityGroup(this, "security-group", { vpc, allowAllOutbound: true, }); securityGroup.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(port)); this.cluster = new rds.ServerlessCluster(this, "cluster", { engine: engine, vpc, scaling: { autoPause: core_1.Duration.minutes(props.autoPause || 0), minCapacity: this.getCapacity(props.minCapacity), maxCapacity: this.getCapacity(props.maxCapacity), }, deletionProtection: true, removalPolicy: cdk.RemovalPolicy.RETAIN, defaultDatabaseName: databaseName, securityGroups: [securityGroup], credentials: { username: username, password: password, }, }); let host = this.cluster.clusterEndpoint.hostname; this.vars = { databaseUrl: `${type}://${username}:${password}@${host}:${port}/${databaseName}`, databaseName: databaseName, databaseUsername: username, databasePassword: password.toString(), databaseHost: host, databasePort: `${port}`, databaseType: type, }; } getCapacity(capacity) { switch (capacity) { case undefined: return rds.AuroraCapacityUnit.ACU_2; case 1: return rds.AuroraCapacityUnit.ACU_1; case 2: return rds.AuroraCapacityUnit.ACU_2; case 4: return rds.AuroraCapacityUnit.ACU_4; case 8: return rds.AuroraCapacityUnit.ACU_1; case 16: return rds.AuroraCapacityUnit.ACU_16; case 32: return rds.AuroraCapacityUnit.ACU_32; case 64: return rds.AuroraCapacityUnit.ACU_64; case 128: return rds.AuroraCapacityUnit.ACU_128; case 192: return rds.AuroraCapacityUnit.ACU_192; case 256: return rds.AuroraCapacityUnit.ACU_256; case 384: return rds.AuroraCapacityUnit.ACU_384; default: throw new Error(`Unsupported database capacity: ${capacity}`); } } } exports.Database = Database; _a = JSII_RTTI_SYMBOL_1; Database[_a] = { fqn: "@cloudcamp/aws-runtime.Database", version: "0.0.1" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx3Q0FBd0M7QUFDeEMsMkNBQTJDO0FBQzNDLDJDQUEyQztBQUMzQywyQ0FBNEM7QUFDNUMsaUVBQWlFO0FBQ2pFLCtCQUE0QjtBQUM1QixpREFHNkI7QUFDN0IsMkNBQXVDOzs7OztBQWlDdkMsTUFBYSxRQUFTLFNBQVEsc0JBQVM7Ozs7Ozs7SUFNckMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFxQjtRQUM3RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksTUFBMEIsQ0FBQztRQUMvQixJQUFJLElBQVksQ0FBQztRQUNqQixJQUFJLElBQVksQ0FBQztRQUVqQixLQUFLLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUVwQixRQUFRLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDcEIsS0FBSyxTQUFTLENBQUM7WUFDZixLQUFLLFVBQVU7Z0JBQ2IsTUFBTSxHQUFHLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUM7b0JBQ2hELE9BQU8sRUFBRSxxQ0FBMkIsQ0FBQyxTQUFTO2lCQUMvQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxHQUFHLFVBQVUsQ0FBQztnQkFDbEIsSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDWixNQUFNO1lBQ1IsS0FBSyxPQUFPO2dCQUNWLE1BQU0sR0FBRyxHQUFHLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDO29CQUM3QyxPQUFPLEVBQUUsa0NBQXdCLENBQUMsVUFBVTtpQkFDN0MsQ0FBQyxDQUFDO2dCQUNILElBQUksR0FBRyxPQUFPLENBQUM7Z0JBQ2YsSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDWixNQUFNO1NBQ1Q7UUFFRCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxJQUFJLGVBQWUsQ0FBQztRQUVuRCxN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QWtCLENBQUMsTUFBTSxDQUFDO1lBQ3ZDLEtBQUssRUFBRTtnQkFDTCxPQUFPLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7WUFDdkMsS0FBSyxFQUFFO2dCQUNMLE9BQU8sR0FBRyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQztZQUN2QyxLQUFLLEdBQUc7Z0JBQ04sT0FBTyxHQUFHLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDO1lBQ3hDLEtBQUssR0FBRztnQkFDTixPQUFPLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUM7WUFDeEMsS0FBSyxHQUFHO2dCQUNOLE9BQU8sR0FBRyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQztZQUN4QyxLQUFLLEdBQUc7Z0JBQ04sT0FBTyxHQUFHLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDO1lBQ3hDO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDakU7SUFDSCxDQUFDOztBQWxISCw0QkFtSEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZGsgZnJvbSBcImF3cy1jZGstbGliL2NvcmVcIjtcbmltcG9ydCAqIGFzIHJkcyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJkc1wiO1xuaW1wb3J0ICogYXMgZWMyIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYi9jb3JlXCI7XG5pbXBvcnQgKiBhcyBzZWNyZXRzbWFuYWdlciBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyXCI7XG5pbXBvcnQgeyBBcHAgfSBmcm9tIFwiLi9hcHBcIjtcbmltcG9ydCB7XG4gIEF1cm9yYU15c3FsRW5naW5lVmVyc2lvbixcbiAgQXVyb3JhUG9zdGdyZXNFbmdpbmVWZXJzaW9uLFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJkc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuLy8gVE9ETyBsb2dzXG4vLyBUT0RPIGFsZXJ0c1xuLy8gVE9ETyBob3cgdG8gY2hhbmdlIHBhc3N3b3JkP1xuLy8gVE9ETyBob3cgdG8gcnVuIHNjcmlwdHMgdG8gY3JlYXRlIGRhdGFiYXNlc1xuXG4vLyBOZWVkcyBhIHByaXZhdGUgc3VibmV0XG4vLyBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzLzcwNjJcblxudHlwZSBEYXRhYmFzZUNhcGFjaXR5ID0gMSB8IDIgfCA0IHwgOCB8IDE2IHwgMzIgfCA2NCB8IDEyOCB8IDE5MiB8IDI1NiB8IDM4NDtcblxuZXhwb3J0IGludGVyZmFjZSBEYXRhYmFzZVByb3BzIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBlbmdpbmU/OiBcIm15c3FsXCIgfCBcInBvc3RncmVzXCI7XG4gIHJlYWRvbmx5IGRhdGFiYXNlTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgdXNlcm5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGF1dG9QYXVzZT86IG51bWJlcjtcbiAgcmVhZG9ubHkgbWluQ2FwYWNpdHk/OiBEYXRhYmFzZUNhcGFjaXR5O1xuICByZWFkb25seSBtYXhDYXBhY2l0eT86IERhdGFiYXNlQ2FwYWNpdHk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJhc2VWYXJpYWJsZXMge1xuICByZWFkb25seSBkYXRhYmFzZVVybDogc3RyaW5nO1xuICByZWFkb25seSBkYXRhYmFzZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZGF0YWJhc2VVc2VybmFtZTogc3RyaW5nO1xuICByZWFkb25seSBkYXRhYmFzZVBhc3N3b3JkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRhdGFiYXNlSG9zdDogc3RyaW5nO1xuICByZWFkb25seSBkYXRhYmFzZVBvcnQ6IHN0cmluZztcbiAgcmVhZG9ubHkgZGF0YWJhc2VUeXBlOiBzdHJpbmc7XG59XG5cbiAgICAgICAgICAgICAgICAgICBcbmV4cG9ydCBjbGFzcyBEYXRhYmFzZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNsdXN0ZXI6IHJkcy5JU2VydmVybGVzc0NsdXN0ZXI7XG5cbiAgdmFyczogRGF0YWJhc2VWYXJpYWJsZXM7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogRGF0YWJhc2VQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBsZXQgZW5naW5lOiByZHMuSUNsdXN0ZXJFbmdpbmU7XG4gICAgbGV0IHR5cGU6IHN0cmluZztcbiAgICBsZXQgcG9ydDogbnVtYmVyO1xuXG4gICAgcHJvcHMgPSBwcm9wcyB8fCB7fTtcblxuICAgIHN3aXRjaCAocHJvcHMuZW5naW5lKSB7XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIGNhc2UgXCJwb3N0Z3Jlc1wiOlxuICAgICAgICBlbmdpbmUgPSByZHMuRGF0YWJhc2VDbHVzdGVyRW5naW5lLmF1cm9yYVBvc3RncmVzKHtcbiAgICAgICAgICB2ZXJzaW9uOiBBdXJvcmFQb3N0Z3Jlc0VuZ2luZVZlcnNpb24uVkVSXzEwXzE0LFxuICAgICAgICB9KTtcbiAgICAgICAgdHlwZSA9IFwicG9zdGdyZXNcIjtcbiAgICAgICAgcG9ydCA9IDU0MzI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIm15c3FsXCI6XG4gICAgICAgIGVuZ2luZSA9IHJkcy5EYXRhYmFzZUNsdXN0ZXJFbmdpbmUuYXVyb3JhTXlzcWwoe1xuICAgICAgICAgIHZlcnNpb246IEF1cm9yYU15c3FsRW5naW5lVmVyc2lvbi5WRVJfNV83XzEyLFxuICAgICAgICB9KTtcbiAgICAgICAgdHlwZSA9IFwibXlzcWxcIjtcbiAgICAgICAgcG9ydCA9IDMzMDY7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJuYW1lID0gcHJvcHMudXNlcm5hbWUgfHwgXCJhZG1pbmlzdHJhdG9yXCI7XG5cbiAgICBjb25zdCBzZWNyZXQgPSBuZXcgc2VjcmV0c21hbmFnZXIuU2VjcmV0KHRoaXMsIFwiY2x1c3Rlci1zZWNyZXRcIiwge1xuICAgICAgZ2VuZXJhdGVTZWNyZXRTdHJpbmc6IHtcbiAgICAgICAgZXhjbHVkZVB1bmN0dWF0aW9uOiB0cnVlLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHBhc3N3b3JkID0gc2VjcmV0LnNlY3JldFZhbHVlO1xuICAgIGNvbnN0IGRhdGFiYXNlTmFtZSA9IHByb3BzLmRhdGFiYXNlTmFtZSB8fCBcIm1haW5kYlwiO1xuXG4gICAgbGV0IHZwYyA9IGVjMi5WcGMuZnJvbUxvb2t1cCh0aGlzLCBcInZwY1wiLCB7XG4gICAgICB2cGNJZDogQXBwLmluc3RhbmNlLmNvbmZpZ3VyYXRpb24udnBjSWQsXG4gICAgfSk7XG5cbiAgICBjb25zdCBzZWN1cml0eUdyb3VwID0gbmV3IGVjMi5TZWN1cml0eUdyb3VwKHRoaXMsIFwic2VjdXJpdHktZ3JvdXBcIiwge1xuICAgICAgdnBjLFxuICAgICAgYWxsb3dBbGxPdXRib3VuZDogdHJ1ZSxcbiAgICB9KTtcbiAgICBzZWN1cml0eUdyb3VwLmFkZEluZ3Jlc3NSdWxlKGVjMi5QZWVyLmFueUlwdjQoKSwgZWMyLlBvcnQudGNwKHBvcnQpKTtcblxuICAgIHRoaXMuY2x1c3RlciA9IG5ldyByZHMuU2VydmVybGVzc0NsdXN0ZXIodGhpcywgXCJjbHVzdGVyXCIsIHtcbiAgICAgIGVuZ2luZTogZW5naW5lLFxuICAgICAgdnBjLFxuICAgICAgc2NhbGluZzoge1xuICAgICAgICBhdXRvUGF1c2U6IER1cmF0aW9uLm1pbnV0ZXMocHJvcHMuYXV0b1BhdXNlIHx8IDApLFxuICAgICAgICBtaW5DYXBhY2l0eTogdGhpcy5nZXRDYXBhY2l0eShwcm9wcy5taW5DYXBhY2l0eSksXG4gICAgICAgIG1heENhcGFjaXR5OiB0aGlzLmdldENhcGFjaXR5KHByb3BzLm1heENhcGFjaXR5KSxcbiAgICAgIH0sXG4gICAgICBkZWxldGlvblByb3RlY3Rpb246IHRydWUsXG4gICAgICByZW1vdmFsUG9saWN5OiBjZGsuUmVtb3ZhbFBvbGljeS5SRVRBSU4sXG4gICAgICBkZWZhdWx0RGF0YWJhc2VOYW1lOiBkYXRhYmFzZU5hbWUsXG4gICAgICBzZWN1cml0eUdyb3VwczogW3NlY3VyaXR5R3JvdXBdLFxuICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxuICAgICAgICBwYXNzd29yZDogcGFzc3dvcmQsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgbGV0IGhvc3QgPSB0aGlzLmNsdXN0ZXIuY2x1c3RlckVuZHBvaW50Lmhvc3RuYW1lO1xuXG4gICAgdGhpcy52YXJzID0ge1xuICAgICAgZGF0YWJhc2VVcmw6IGAke3R5cGV9Oi8vJHt1c2VybmFtZX06JHtwYXNzd29yZH1AJHtob3N0fToke3BvcnR9LyR7ZGF0YWJhc2VOYW1lfWAsXG4gICAgICBkYXRhYmFzZU5hbWU6IGRhdGFiYXNlTmFtZSxcbiAgICAgIGRhdGFiYXNlVXNlcm5hbWU6IHVzZXJuYW1lLFxuICAgICAgZGF0YWJhc2VQYXNzd29yZDogcGFzc3dvcmQudG9TdHJpbmcoKSxcbiAgICAgIGRhdGFiYXNlSG9zdDogaG9zdCxcbiAgICAgIGRhdGFiYXNlUG9ydDogYCR7cG9ydH1gLFxuICAgICAgZGF0YWJhc2VUeXBlOiB0eXBlLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldENhcGFjaXR5KGNhcGFjaXR5PzogRGF0YWJhc2VDYXBhY2l0eSkge1xuICAgIHN3aXRjaCAoY2FwYWNpdHkpIHtcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gcmRzLkF1cm9yYUNhcGFjaXR5VW5pdC5BQ1VfMjtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIHJkcy5BdXJvcmFDYXBhY2l0eVVuaXQuQUNVXzE7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHJldHVybiByZHMuQXVyb3JhQ2FwYWNpdHlVbml0LkFDVV8yO1xuICAgICAgY2FzZSA0OlxuICAgICAgICByZXR1cm4gcmRzLkF1cm9yYUNhcGFjaXR5VW5pdC5BQ1VfNDtcbiAgICAgIGNhc2UgODpcbiAgICAgICAgcmV0dXJuIHJkcy5BdXJvcmFDYXBhY2l0eVVuaXQuQUNVXzE7XG4gICAgICBjYXNlIDE2OlxuICAgICAgICByZXR1cm4gcmRzLkF1cm9yYUNhcGFjaXR5VW5pdC5BQ1VfMTY7XG4gICAgICBjYXNlIDMyOlxuICAgICAgICByZXR1cm4gcmRzLkF1cm9yYUNhcGFjaXR5VW5pdC5BQ1VfMzI7XG4gICAgICBjYXNlIDY0OlxuICAgICAgICByZXR1cm4gcmRzLkF1cm9yYUNhcGFjaXR5VW5pdC5BQ1VfNjQ7XG4gICAgICBjYXNlIDEyODpcbiAgICAgICAgcmV0dXJuIHJkcy5BdXJvcmFDYXBhY2l0eVVuaXQuQUNVXzEyODtcbiAgICAgIGNhc2UgMTkyOlxuICAgICAgICByZXR1cm4gcmRzLkF1cm9yYUNhcGFjaXR5VW5pdC5BQ1VfMTkyO1xuICAgICAgY2FzZSAyNTY6XG4gICAgICAgIHJldHVybiByZHMuQXVyb3JhQ2FwYWNpdHlVbml0LkFDVV8yNTY7XG4gICAgICBjYXNlIDM4NDpcbiAgICAgICAgcmV0dXJuIHJkcy5BdXJvcmFDYXBhY2l0eVVuaXQuQUNVXzM4NDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZGF0YWJhc2UgY2FwYWNpdHk6ICR7Y2FwYWNpdHl9YCk7XG4gICAgfVxuICB9XG59XG4iXX0=