@cloudcamp/aws-runtime
Version:
CloudCamp - Launch faster by building scalable infrastructure in few lines of code.
126 lines • 15.2 kB
JavaScript
;
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=