@fjall/components-infrastructure 0.1.29 → 0.1.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/app.js +1 -1
- package/dist/lib/config/aws/accountId.js +3 -3
- package/dist/lib/config/aws/identityCenter.js +1 -1
- package/dist/lib/config/aws/identityCenterGroupMembership.js +1 -1
- package/dist/lib/config/aws/ipam.js +1 -1
- package/dist/lib/config/aws/ipamDelegateAdmin.js +3 -3
- package/dist/lib/config/aws/organisation.js +1 -1
- package/dist/lib/config/aws/organisationId.js +3 -3
- package/dist/lib/config/aws/organisationsAccess.js +2 -2
- package/dist/lib/config/aws/ramSharing.js +2 -2
- package/dist/lib/patterns/aws/basicApp.js +1 -1
- package/dist/lib/patterns/aws/buildkite.js +1 -1
- package/dist/lib/patterns/aws/database.js +1 -1
- package/dist/lib/patterns/aws/ec2.js +1 -1
- package/dist/lib/patterns/aws/fivetranProxy.d.ts +1 -1
- package/dist/lib/patterns/aws/fivetranProxy.js +1 -1
- package/dist/lib/patterns/aws/freeTierApp.js +1 -1
- package/dist/lib/patterns/aws/hostedZone.js +1 -1
- package/dist/lib/patterns/aws/managedAccount.js +1 -1
- package/dist/lib/patterns/aws/managedOrganisation.js +1 -1
- package/dist/lib/patterns/aws/spotInstanceApp.js +1 -1
- package/dist/lib/resources/aws/awsStack.js +1 -1
- package/dist/lib/resources/aws/compute/ecs.js +3 -3
- package/dist/lib/resources/aws/compute/ecsFreeTier.js +2 -2
- package/dist/lib/resources/aws/compute/ecsSpot.js +2 -2
- package/dist/lib/resources/aws/database/rdsInstance.js +1 -1
- package/dist/lib/resources/aws/iam/identityCenter/assignment.js +4 -4
- package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.js +3 -3
- package/dist/lib/resources/aws/iam/identityCenter/group.js +4 -4
- package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +4 -4
- package/dist/lib/resources/aws/networking/ipam.js +2 -2
- package/dist/lib/resources/aws/networking/ipamPool.js +1 -1
- package/dist/lib/resources/aws/networking/vpc.js +1 -1
- package/dist/lib/resources/aws/secrets/parameter.js +1 -1
- package/dist/lib/resources/aws/utilities/awsCustomResource.js +2 -2
- package/dist/lib/resources/aws/utilities/customResourceProvider.js +2 -2
- package/dist/lib/utils/addSuffixToEmail.js +2 -2
- package/dist/lib/utils/capitalizeString.js +2 -3
- package/dist/lib/utils/getAccountId.js +2 -2
- package/dist/lib/utils/getCidr.js +1 -1
- package/dist/lib/utils/getConfig.js +15 -3
- package/dist/lib/utils/getStackOutput.js +2 -2
- package/dist/lib/utils/stripAndCamelCase.js +2 -3
- package/dist/lib/utils/tagResource.js +2 -2
- package/package.json +13 -11
- package/dist/lib/config/aws/identityCenterUser.d.ts +0 -16
- package/dist/lib/config/aws/identityCenterUser.js +0 -125
- package/dist/lib/resources/aws/database/rds.d.ts +0 -23
- package/dist/lib/resources/aws/database/rds.js +0 -130
- package/dist/lib/utils/usersConfig.d.ts +0 -7
- package/dist/lib/utils/usersConfig.js +0 -18
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getConfig =
|
|
3
|
+
exports.getConfig = getConfig;
|
|
4
4
|
const app_1 = require("../app");
|
|
5
5
|
const util_1 = require("@fjall/util");
|
|
6
6
|
function getConfig(accountName) {
|
|
@@ -27,8 +27,20 @@ function getConfig(accountName) {
|
|
|
27
27
|
config.environment = providerAccount.environment;
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
|
+
// If we still don't have an account name - try to retrieve accountId from context
|
|
31
|
+
if (!accountName) {
|
|
32
|
+
const accountId = app.node.tryGetContext("accountId");
|
|
33
|
+
// If we find an accountId - retrieve the associated account from config
|
|
34
|
+
if (accountId) {
|
|
35
|
+
config.accountId = accountId;
|
|
36
|
+
const providerAccount = fjallConfig.getProviderAccountById(accountId);
|
|
37
|
+
if (!!providerAccount) {
|
|
38
|
+
config.accountName = providerAccount.name;
|
|
39
|
+
config.environment = providerAccount.environment;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
30
43
|
return config;
|
|
31
44
|
}
|
|
32
|
-
exports.getConfig = getConfig;
|
|
33
45
|
exports.default = getConfig;
|
|
34
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0Q29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL3V0aWxzL2dldENvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWFBLDhCQTRDQztBQXZERCxnQ0FBeUI7QUFDekIsc0NBQW9EO0FBVXBELFNBQWdCLFNBQVMsQ0FBQyxXQUFvQjtJQUM1QyxNQUFNLEdBQUcsR0FBRyxhQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7SUFFOUIsTUFBTSxNQUFNLEdBQVc7UUFDckIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLFdBQVc7UUFDN0MsV0FBVyxFQUFFLGFBQWE7UUFDMUIsZ0JBQWdCLEVBQUUsRUFBRTtLQUNyQixDQUFDO0lBRUYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVTtRQUN6QixPQUFPLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxDQUFDLENBQUM7SUFFakUsMkNBQTJDO0lBQzNDLE1BQU0sV0FBVyxHQUFHLGFBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUM3QyxNQUFNLENBQUMsZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFFNUQsNkRBQTZEO0lBQzdELElBQUksQ0FBQyxXQUFXO1FBQUUsV0FBVyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3RFLG9FQUFvRTtJQUNwRSxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN0QixNQUFNLENBQUMsU0FBUyxHQUFHLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDdEMsTUFBTSxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsZUFBZSxDQUFDLFdBQVcsQ0FBQztRQUNuRCxDQUFDO0lBQ0gsQ0FBQztJQUVELGtGQUFrRjtJQUNsRixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakIsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdEQsd0VBQXdFO1FBQ3hFLElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxNQUFNLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUU3QixNQUFNLGVBQWUsR0FBRyxXQUFXLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdEUsSUFBSSxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sQ0FBQyxXQUFXLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQztnQkFDMUMsTUFBTSxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUMsV0FBVyxDQUFDO1lBQ25ELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxrQkFBZSxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY2NvdW50IH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1vcmdhbml6YXRpb25zXCI7XG5cbmltcG9ydCBBcHAgZnJvbSBcIi4uL2FwcFwiO1xuaW1wb3J0IHsgQ29uZmlnIGFzIEZqYWxsQ29uZmlnIH0gZnJvbSBcIkBmamFsbC91dGlsXCI7XG5cbmludGVyZmFjZSBDb25maWcge1xuICByZWdpb246IHN0cmluZztcbiAgZW52aXJvbm1lbnQ6IHN0cmluZztcbiAgZXhpc3RpbmdBY2NvdW50czogQWNjb3VudFtdO1xuICBhY2NvdW50SWQ/OiBzdHJpbmc7XG4gIGFjY291bnROYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnKGFjY291bnROYW1lPzogc3RyaW5nKTogQ29uZmlnIHtcbiAgY29uc3QgYXBwID0gQXBwLmdldEluc3RhbmNlKCk7XG5cbiAgY29uc3QgY29uZmlnOiBDb25maWcgPSB7XG4gICAgcmVnaW9uOiBwcm9jZXNzLmVudi5BV1NfUkVHSU9OIHx8IFwidXMtZWFzdC0xXCIsXG4gICAgZW52aXJvbm1lbnQ6IFwiZGV2ZWxvcG1lbnRcIixcbiAgICBleGlzdGluZ0FjY291bnRzOiBbXVxuICB9O1xuXG4gIGlmICghcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTilcbiAgICBjb25zb2xlLndhcm4oXCJBV1NfUkVHSU9OIGlzIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gdXMtZWFzdC0xXCIpO1xuXG4gIC8vIFJldHJpZXZlIGFueSBwcmUtZXhpc3RpbmcgYWNjb3VudCBjb25maWdcbiAgY29uc3QgZmphbGxDb25maWcgPSBGamFsbENvbmZpZy5sb2FkQ29uZmlnKCk7XG4gIGNvbmZpZy5leGlzdGluZ0FjY291bnRzID0gZmphbGxDb25maWcuZ2V0RXhpc3RpbmdBY2NvdW50cygpO1xuXG4gIC8vIElmIHVuc3BlY2lmaWVkIGFjY291bnQgbmFtZSAtIHRyeSB0byByZXRyaWV2ZSBmcm9tIGNvbnRleHRcbiAgaWYgKCFhY2NvdW50TmFtZSkgYWNjb3VudE5hbWUgPSBhcHAubm9kZS50cnlHZXRDb250ZXh0KFwiYWNjb3VudE5hbWVcIik7XG4gIC8vIElmIHdlIGhhdmUgYW4gYWNjb3VudCBuYW1lIC0gbG9vayBmb3IgYXNzb2NpYXRlZCBwcm92aWRlciBhY2NvdW50XG4gIGlmIChhY2NvdW50TmFtZSkge1xuICAgIGNvbnN0IHByb3ZpZGVyQWNjb3VudCA9IGZqYWxsQ29uZmlnLmdldFByb3ZpZGVyQWNjb3VudChhY2NvdW50TmFtZSk7XG4gICAgaWYgKCEhcHJvdmlkZXJBY2NvdW50KSB7XG4gICAgICBjb25maWcuYWNjb3VudElkID0gcHJvdmlkZXJBY2NvdW50LmlkO1xuICAgICAgY29uZmlnLmFjY291bnROYW1lID0gcHJvdmlkZXJBY2NvdW50Lm5hbWU7XG4gICAgICBjb25maWcuZW52aXJvbm1lbnQgPSBwcm92aWRlckFjY291bnQuZW52aXJvbm1lbnQ7XG4gICAgfVxuICB9XG5cbiAgLy8gSWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSBhbiBhY2NvdW50IG5hbWUgLSB0cnkgdG8gcmV0cmlldmUgYWNjb3VudElkIGZyb20gY29udGV4dFxuICBpZiAoIWFjY291bnROYW1lKSB7XG4gICAgY29uc3QgYWNjb3VudElkID0gYXBwLm5vZGUudHJ5R2V0Q29udGV4dChcImFjY291bnRJZFwiKTtcbiAgICAvLyBJZiB3ZSBmaW5kIGFuIGFjY291bnRJZCAtIHJldHJpZXZlIHRoZSBhc3NvY2lhdGVkIGFjY291bnQgZnJvbSBjb25maWdcbiAgICBpZiAoYWNjb3VudElkKSB7XG4gICAgICBjb25maWcuYWNjb3VudElkID0gYWNjb3VudElkO1xuXG4gICAgICBjb25zdCBwcm92aWRlckFjY291bnQgPSBmamFsbENvbmZpZy5nZXRQcm92aWRlckFjY291bnRCeUlkKGFjY291bnRJZCk7XG4gICAgICBpZiAoISFwcm92aWRlckFjY291bnQpIHtcbiAgICAgICAgY29uZmlnLmFjY291bnROYW1lID0gcHJvdmlkZXJBY2NvdW50Lm5hbWU7XG4gICAgICAgIGNvbmZpZy5lbnZpcm9ubWVudCA9IHByb3ZpZGVyQWNjb3VudC5lbnZpcm9ubWVudDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZmlnO1xufVxuXG5leHBvcnQgZGVmYXVsdCBnZXRDb25maWc7XG4iXX0=
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = getStackOutput;
|
|
3
4
|
const fs_1 = require("fs");
|
|
4
5
|
function getStackOutput(stackname, key) {
|
|
5
6
|
const path = `./output/${stackname}.json`;
|
|
@@ -16,5 +17,4 @@ function getStackOutput(stackname, key) {
|
|
|
16
17
|
return value[`${key}`];
|
|
17
18
|
}
|
|
18
19
|
}
|
|
19
|
-
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0U3RhY2tPdXRwdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvdXRpbHMvZ2V0U3RhY2tPdXRwdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwyQkFBeUQ7QUFRekQsU0FBd0IsY0FBYyxDQUFDLFNBQWlCLEVBQUUsR0FBVztJQUNuRSxNQUFNLElBQUksR0FBRyxZQUFZLFNBQVMsT0FBTyxDQUFDO0lBRTFDLElBQUk7UUFDRixJQUFBLGVBQVUsRUFBQyxJQUFJLEVBQUUsY0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ2xDO0lBQUMsT0FBTyxLQUFLLEVBQUU7UUFDZCwrREFBK0Q7UUFDL0QsT0FBTyxTQUFTLENBQUM7S0FDbEI7SUFFRCxNQUFNLGVBQWUsR0FBRyxJQUFBLGlCQUFZLEVBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ25ELE1BQU0sVUFBVSxHQUFjLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDMUQsS0FBSyxNQUFNLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1FBQ2xELE9BQU8sS0FBSyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQztLQUN4QjtBQUNILENBQUM7QUFmRCxpQ0FlQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFjY2Vzc1N5bmMsIHJlYWRGaWxlU3luYywgY29uc3RhbnRzIH0gZnJvbSBcImZzXCI7XG5cbmludGVyZmFjZSBTdGFja0pTT04ge1xuICBTdGFja05hbWU6IHtcbiAgICBPdXRwdXRzOiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFN0YWNrT3V0cHV0KHN0YWNrbmFtZTogc3RyaW5nLCBrZXk6IHN0cmluZykge1xuICBjb25zdCBwYXRoID0gYC4vb3V0cHV0LyR7c3RhY2tuYW1lfS5qc29uYDtcblxuICB0cnkge1xuICAgIGFjY2Vzc1N5bmMocGF0aCwgY29uc3RhbnRzLlJfT0spO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIEZpbGUgZG9lcyBub3QgZXhpc3Qgb3Igd2UgZG8gbm90IGhhdmUgcGVybWlzc2lvbnMgdG8gcmVhZCBpdFxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBzdGFja091dHB1dEZpbGUgPSByZWFkRmlsZVN5bmMocGF0aCwgXCJ1dGY4XCIpO1xuICBjb25zdCBzdGFja091cHV0OiBTdGFja0pTT04gPSBKU09OLnBhcnNlKHN0YWNrT3V0cHV0RmlsZSk7XG4gIGZvciAoY29uc3QgWywgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHN0YWNrT3VwdXQpKSB7XG4gICAgcmV0dXJuIHZhbHVlW2Ake2tleX1gXTtcbiAgfVxufVxuIl19
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0U3RhY2tPdXRwdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvdXRpbHMvZ2V0U3RhY2tPdXRwdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFRQSxpQ0FlQztBQXZCRCwyQkFBeUQ7QUFRekQsU0FBd0IsY0FBYyxDQUFDLFNBQWlCLEVBQUUsR0FBVztJQUNuRSxNQUFNLElBQUksR0FBRyxZQUFZLFNBQVMsT0FBTyxDQUFDO0lBRTFDLElBQUksQ0FBQztRQUNILElBQUEsZUFBVSxFQUFDLElBQUksRUFBRSxjQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZiwrREFBK0Q7UUFDL0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELE1BQU0sZUFBZSxHQUFHLElBQUEsaUJBQVksRUFBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbkQsTUFBTSxVQUFVLEdBQWMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUMxRCxLQUFLLE1BQU0sQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUNuRCxPQUFPLEtBQUssQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDekIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhY2Nlc3NTeW5jLCByZWFkRmlsZVN5bmMsIGNvbnN0YW50cyB9IGZyb20gXCJmc1wiO1xuXG5pbnRlcmZhY2UgU3RhY2tKU09OIHtcbiAgU3RhY2tOYW1lOiB7XG4gICAgT3V0cHV0czogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRTdGFja091dHB1dChzdGFja25hbWU6IHN0cmluZywga2V5OiBzdHJpbmcpIHtcbiAgY29uc3QgcGF0aCA9IGAuL291dHB1dC8ke3N0YWNrbmFtZX0uanNvbmA7XG5cbiAgdHJ5IHtcbiAgICBhY2Nlc3NTeW5jKHBhdGgsIGNvbnN0YW50cy5SX09LKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBGaWxlIGRvZXMgbm90IGV4aXN0IG9yIHdlIGRvIG5vdCBoYXZlIHBlcm1pc3Npb25zIHRvIHJlYWQgaXRcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3Qgc3RhY2tPdXRwdXRGaWxlID0gcmVhZEZpbGVTeW5jKHBhdGgsIFwidXRmOFwiKTtcbiAgY29uc3Qgc3RhY2tPdXB1dDogU3RhY2tKU09OID0gSlNPTi5wYXJzZShzdGFja091dHB1dEZpbGUpO1xuICBmb3IgKGNvbnN0IFssIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzdGFja091cHV0KSkge1xuICAgIHJldHVybiB2YWx1ZVtgJHtrZXl9YF07XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.stripAndCamelCase =
|
|
3
|
+
exports.stripAndCamelCase = stripAndCamelCase;
|
|
4
4
|
function stripAndCamelCase(input) {
|
|
5
5
|
const lettersOnly = input.replace(/[^a-zA-Z]/g, " ");
|
|
6
6
|
return lettersOnly
|
|
@@ -13,5 +13,4 @@ function stripAndCamelCase(input) {
|
|
|
13
13
|
})
|
|
14
14
|
.join("");
|
|
15
15
|
}
|
|
16
|
-
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaXBBbmRDYW1lbENhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvdXRpbHMvc3RyaXBBbmRDYW1lbENhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsU0FBZ0IsaUJBQWlCLENBQUMsS0FBYTtJQUM3QyxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNyRCxPQUFPLFdBQVc7U0FDZixLQUFLLENBQUMsR0FBRyxDQUFDO1NBQ1YsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQ25CLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtZQUNmLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQzNCO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDcEUsQ0FBQyxDQUFDO1NBQ0QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2QsQ0FBQztBQVhELDhDQVdDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIHN0cmlwQW5kQ2FtZWxDYXNlKGlucHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBsZXR0ZXJzT25seSA9IGlucHV0LnJlcGxhY2UoL1teYS16QS1aXS9nLCBcIiBcIik7XG4gIHJldHVybiBsZXR0ZXJzT25seVxuICAgIC5zcGxpdChcIiBcIilcbiAgICAubWFwKCh3b3JkLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgIHJldHVybiB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd29yZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSkudG9Mb3dlckNhc2UoKTtcbiAgICB9KVxuICAgIC5qb2luKFwiXCIpO1xufVxuIl19
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaXBBbmRDYW1lbENhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvdXRpbHMvc3RyaXBBbmRDYW1lbENhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw4Q0FXQztBQVhELFNBQWdCLGlCQUFpQixDQUFDLEtBQWE7SUFDN0MsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDckQsT0FBTyxXQUFXO1NBQ2YsS0FBSyxDQUFDLEdBQUcsQ0FBQztTQUNWLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUNuQixJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNoQixPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM1QixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDcEUsQ0FBQyxDQUFDO1NBQ0QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBzdHJpcEFuZENhbWVsQ2FzZShpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbGV0dGVyc09ubHkgPSBpbnB1dC5yZXBsYWNlKC9bXmEtekEtWl0vZywgXCIgXCIpO1xuICByZXR1cm4gbGV0dGVyc09ubHlcbiAgICAuc3BsaXQoXCIgXCIpXG4gICAgLm1hcCgod29yZCwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gd29yZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdvcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCk7XG4gICAgfSlcbiAgICAuam9pbihcIlwiKTtcbn1cbiJdfQ==
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = tagResource;
|
|
3
4
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
4
5
|
function tagResource(resource, tags) {
|
|
5
6
|
for (const tag in tags) {
|
|
6
7
|
aws_cdk_lib_1.Tags.of(resource).add(tag, tags[tag]);
|
|
7
8
|
}
|
|
8
9
|
}
|
|
9
|
-
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnUmVzb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvdXRpbHMvdGFnUmVzb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2Q0FBbUM7QUFHbkMsU0FBd0IsV0FBVyxDQUNqQyxRQUFvQixFQUNwQixJQUErQjtJQUUvQixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtRQUN0QixrQkFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQ3ZDO0FBQ0gsQ0FBQztBQVBELDhCQU9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGFncyB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgSUNvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRhZ1Jlc291cmNlKFxuICByZXNvdXJjZTogSUNvbnN0cnVjdCxcbiAgdGFnczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfVxuKSB7XG4gIGZvciAoY29uc3QgdGFnIGluIHRhZ3MpIHtcbiAgICBUYWdzLm9mKHJlc291cmNlKS5hZGQodGFnLCB0YWdzW3RhZ10pO1xuICB9XG59XG4iXX0=
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnUmVzb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvdXRpbHMvdGFnUmVzb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSw4QkFPQztBQVZELDZDQUFtQztBQUduQyxTQUF3QixXQUFXLENBQ2pDLFFBQW9CLEVBQ3BCLElBQStCO0lBRS9CLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsa0JBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRhZ3MgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IElDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0YWdSZXNvdXJjZShcbiAgcmVzb3VyY2U6IElDb25zdHJ1Y3QsXG4gIHRhZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH1cbikge1xuICBmb3IgKGNvbnN0IHRhZyBpbiB0YWdzKSB7XG4gICAgVGFncy5vZihyZXNvdXJjZSkuYWRkKHRhZywgdGFnc1t0YWddKTtcbiAgfVxufVxuIl19
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fjall/components-infrastructure",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.31",
|
|
4
4
|
"bin": {
|
|
5
5
|
"infrastructure": "bin/infrastructure.js"
|
|
6
6
|
},
|
|
@@ -33,7 +33,8 @@
|
|
|
33
33
|
"list:plat": "npx cdk list -c accountName=platform",
|
|
34
34
|
"destroy:plat": "npx cdk destroy -c accountName=platform",
|
|
35
35
|
"synth:plat": "npx cdk synthesize -c accountName=platform",
|
|
36
|
-
"
|
|
36
|
+
"clean": "rm -rf ./dist",
|
|
37
|
+
"clean:node": "rm -rf ./node_modules",
|
|
37
38
|
"build": "tsc",
|
|
38
39
|
"watch": "tsc -w",
|
|
39
40
|
"test": "jest",
|
|
@@ -42,29 +43,30 @@
|
|
|
42
43
|
"devDependencies": {
|
|
43
44
|
"@types/aws-lambda": "^8.10.109",
|
|
44
45
|
"@types/jest": "^29.2.4",
|
|
45
|
-
"@types/node": "
|
|
46
|
-
"@types/uuid": "^
|
|
47
|
-
"@typescript-eslint/eslint-plugin": "^
|
|
48
|
-
"@typescript-eslint/parser": "^
|
|
49
|
-
"eslint": "^
|
|
46
|
+
"@types/node": "^22.13.10",
|
|
47
|
+
"@types/uuid": "^10.0.0",
|
|
48
|
+
"@typescript-eslint/eslint-plugin": "^8.26.1",
|
|
49
|
+
"@typescript-eslint/parser": "^8.26.1",
|
|
50
|
+
"eslint": "^9.22.0",
|
|
50
51
|
"jest": "^29.3.1",
|
|
51
52
|
"ts-jest": "^29.0.3",
|
|
52
53
|
"ts-node": "^10.9.1",
|
|
53
|
-
"typescript": "
|
|
54
|
+
"typescript": "^5.8.2"
|
|
54
55
|
},
|
|
55
56
|
"dependencies": {
|
|
56
57
|
"@aws-sdk/client-cost-explorer": "^3.717.0",
|
|
57
58
|
"@aws-sdk/client-organizations": "^3.716.0",
|
|
58
|
-
"@fjall/util": "^0.1.
|
|
59
|
+
"@fjall/util": "^0.1.31",
|
|
59
60
|
"@pepperize/cdk-organizations": "^0.7.135",
|
|
60
61
|
"aws-cdk": "^2.146.0",
|
|
61
62
|
"aws-cdk-lib": "^2.146.0",
|
|
62
63
|
"aws-lambda": "^1.0.7",
|
|
63
64
|
"constructs": "^10.0.0",
|
|
64
65
|
"source-map-support": "^0.5.21",
|
|
65
|
-
"uuid": "^
|
|
66
|
+
"uuid": "^10.0.0"
|
|
66
67
|
},
|
|
67
68
|
"overrides": {
|
|
68
69
|
"@smithy/core": "2.5.5"
|
|
69
|
-
}
|
|
70
|
+
},
|
|
71
|
+
"gitHead": "17bb4042fa0beb788f874af1c2d50e3fe4ded83f"
|
|
70
72
|
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { Construct } from "constructs";
|
|
2
|
-
import { Group } from "../../resources/aws/iam/identityCenter/group";
|
|
3
|
-
export interface User {
|
|
4
|
-
email: string;
|
|
5
|
-
firstName: string;
|
|
6
|
-
lastName: string;
|
|
7
|
-
groups: string[];
|
|
8
|
-
}
|
|
9
|
-
interface IdentityCenterUserProps {
|
|
10
|
-
identityStoreId: string;
|
|
11
|
-
identityCenterGroups: Group[];
|
|
12
|
-
}
|
|
13
|
-
export declare class IdentityCenterUser extends Construct {
|
|
14
|
-
constructor(scope: Construct, id: string, props: IdentityCenterUserProps);
|
|
15
|
-
}
|
|
16
|
-
export {};
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.IdentityCenterUser = void 0;
|
|
4
|
-
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
|
-
const customResources = require("aws-cdk-lib/custom-resources");
|
|
6
|
-
const constructs_1 = require("constructs");
|
|
7
|
-
const awsCustomResource_1 = require("../../resources/aws/utilities/awsCustomResource");
|
|
8
|
-
const usersConfig_1 = require("../../utils/usersConfig");
|
|
9
|
-
const capitalizeString_1 = require("../../utils/capitalizeString");
|
|
10
|
-
class IdentityCenterUser extends constructs_1.Construct {
|
|
11
|
-
constructor(scope, id, props) {
|
|
12
|
-
super(scope, id);
|
|
13
|
-
const users = new usersConfig_1.default().getUsers();
|
|
14
|
-
const identityStoreId = props.identityStoreId;
|
|
15
|
-
const userCount = users.length;
|
|
16
|
-
for (let i = 0; i < userCount; i++) {
|
|
17
|
-
const user = users[i];
|
|
18
|
-
const givenName = (0, capitalizeString_1.capitalizeString)(user.firstName);
|
|
19
|
-
const familyName = (0, capitalizeString_1.capitalizeString)(user.lastName);
|
|
20
|
-
const userParams = {
|
|
21
|
-
IdentityStoreId: identityStoreId,
|
|
22
|
-
UserName: user.email,
|
|
23
|
-
DisplayName: `${givenName} ${familyName}`,
|
|
24
|
-
Name: {
|
|
25
|
-
FamilyName: user.lastName,
|
|
26
|
-
GivenName: user.firstName
|
|
27
|
-
},
|
|
28
|
-
Emails: [
|
|
29
|
-
{
|
|
30
|
-
Primary: true,
|
|
31
|
-
Value: user.email
|
|
32
|
-
}
|
|
33
|
-
]
|
|
34
|
-
};
|
|
35
|
-
const createUser = new awsCustomResource_1.AwsCustomResource(this, `createUser${givenName}${familyName}`, {
|
|
36
|
-
functionName: "createUsers",
|
|
37
|
-
onCreate: {
|
|
38
|
-
service: "IdentityStore",
|
|
39
|
-
action: "createUser",
|
|
40
|
-
parameters: userParams,
|
|
41
|
-
physicalResourceId: customResources.PhysicalResourceId.of("createUsers")
|
|
42
|
-
},
|
|
43
|
-
onUpdate: {
|
|
44
|
-
service: "IdentityStore",
|
|
45
|
-
action: "updateUser",
|
|
46
|
-
parameters: userParams,
|
|
47
|
-
physicalResourceId: customResources.PhysicalResourceId.of("updateUsers")
|
|
48
|
-
},
|
|
49
|
-
resourceType: "Custom::IdentityCenterUsers"
|
|
50
|
-
});
|
|
51
|
-
new awsCustomResource_1.AwsCustomResource(this, `deleteUser${givenName}${familyName}`, {
|
|
52
|
-
functionName: "deleteUsers",
|
|
53
|
-
onDelete: {
|
|
54
|
-
service: "IdentityStore",
|
|
55
|
-
action: "deleteUser",
|
|
56
|
-
parameters: {
|
|
57
|
-
IdentityStoreId: identityStoreId,
|
|
58
|
-
UserId: createUser.getResponseField("UserId")
|
|
59
|
-
}
|
|
60
|
-
},
|
|
61
|
-
resourceType: "Custom::IdentityCenterUsers"
|
|
62
|
-
});
|
|
63
|
-
new aws_cdk_lib_1.CfnOutput(this, `UserId${givenName}${familyName}`, {
|
|
64
|
-
key: `UserId${givenName}${familyName}`,
|
|
65
|
-
value: createUser.getResponseField("UserId"),
|
|
66
|
-
exportName: `UserId${givenName}${familyName}`
|
|
67
|
-
});
|
|
68
|
-
// props.identityCenterGroups.forEach((identityCenterGroup))
|
|
69
|
-
user.groups.forEach((group) => {
|
|
70
|
-
const identityCenterGroup = props.identityCenterGroups.find((identityCenterGroup) => identityCenterGroup.displayName === group);
|
|
71
|
-
if (!identityCenterGroup) {
|
|
72
|
-
throw new Error(`Group ${group} does not exist in Identity Center Groups`);
|
|
73
|
-
}
|
|
74
|
-
const groupId = identityCenterGroup.attrGroupId;
|
|
75
|
-
const groupName = identityCenterGroup.displayName;
|
|
76
|
-
const groupMembershipId = new awsCustomResource_1.AwsCustomResource(this, `createGroupMembership${givenName}${familyName}To${groupName}`, {
|
|
77
|
-
functionName: "createGroupMembership",
|
|
78
|
-
onCreate: {
|
|
79
|
-
service: "IdentityStore",
|
|
80
|
-
action: "createGroupMembership",
|
|
81
|
-
parameters: {
|
|
82
|
-
GroupId: groupId,
|
|
83
|
-
IdentityStoreId: identityStoreId,
|
|
84
|
-
MemberId: {
|
|
85
|
-
UserId: createUser.getResponseField("UserId")
|
|
86
|
-
}
|
|
87
|
-
},
|
|
88
|
-
physicalResourceId: customResources.PhysicalResourceId.of(`createGroupMembership${groupName}`)
|
|
89
|
-
},
|
|
90
|
-
onUpdate: {
|
|
91
|
-
service: "IdentityStore",
|
|
92
|
-
action: "createGroupMembership",
|
|
93
|
-
parameters: {
|
|
94
|
-
GroupId: groupId,
|
|
95
|
-
IdentityStoreId: identityStoreId,
|
|
96
|
-
MemberId: {
|
|
97
|
-
UserId: createUser.getResponseField("UserId")
|
|
98
|
-
}
|
|
99
|
-
},
|
|
100
|
-
physicalResourceId: customResources.PhysicalResourceId.of(`updateGroupMembership${groupName}`)
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
new awsCustomResource_1.AwsCustomResource(this, `deleteGroupMembership${givenName}${familyName}From${groupName}`, {
|
|
104
|
-
functionName: "deleteGroupMembership",
|
|
105
|
-
onDelete: {
|
|
106
|
-
service: "IdentityStore",
|
|
107
|
-
action: "deleteGroupMembership",
|
|
108
|
-
parameters: {
|
|
109
|
-
IdentityStoreId: identityStoreId,
|
|
110
|
-
MembershipId: groupMembershipId.getResponseField("MembershipId")
|
|
111
|
-
}
|
|
112
|
-
},
|
|
113
|
-
resourceType: "Custom::IdentityCenterUsers"
|
|
114
|
-
});
|
|
115
|
-
new aws_cdk_lib_1.CfnOutput(this, `GroupMembershipId${givenName}${familyName}${groupName}`, {
|
|
116
|
-
key: `GroupMembershipId${givenName}${familyName}${groupName}`,
|
|
117
|
-
value: groupMembershipId.getResponseField("MembershipId"),
|
|
118
|
-
exportName: `GroupMembershipId${givenName}${familyName}${groupName}`
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
exports.IdentityCenterUser = IdentityCenterUser;
|
|
125
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpdHlDZW50ZXJVc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL2NvbmZpZy9hd3MvaWRlbnRpdHlDZW50ZXJVc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUF3QztBQUN4QyxnRUFBZ0U7QUFDaEUsMkNBQXVDO0FBQ3ZDLHVGQUFvRjtBQUNwRix5REFBa0Q7QUFFbEQsbUVBQWdFO0FBNEJoRSxNQUFhLGtCQUFtQixTQUFRLHNCQUFTO0lBQy9DLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBOEI7UUFDdEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLEtBQUssR0FBVyxJQUFJLHFCQUFXLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNuRCxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDO1FBRTlDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNsQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsTUFBTSxTQUFTLEdBQUcsSUFBQSxtQ0FBZ0IsRUFBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbkQsTUFBTSxVQUFVLEdBQUcsSUFBQSxtQ0FBZ0IsRUFBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbkQsTUFBTSxVQUFVLEdBQXlCO2dCQUN2QyxlQUFlLEVBQUUsZUFBZTtnQkFDaEMsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNwQixXQUFXLEVBQUUsR0FBRyxTQUFTLElBQUksVUFBVSxFQUFFO2dCQUN6QyxJQUFJLEVBQUU7b0JBQ0osVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRO29CQUN6QixTQUFTLEVBQUUs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Q0FDRjtBQXZKRCxnREF1SkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5PdXRwdXQgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCAqIGFzIGN1c3RvbVJlc291cmNlcyBmcm9tIFwiYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IEF3c0N1c3RvbVJlc291cmNlIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvdXRpbGl0aWVzL2F3c0N1c3RvbVJlc291cmNlXCI7XG5pbXBvcnQgVXNlcnNDb25maWcgZnJvbSBcIi4uLy4uL3V0aWxzL3VzZXJzQ29uZmlnXCI7XG5pbXBvcnQgeyBHcm91cCB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL2lhbS9pZGVudGl0eUNlbnRlci9ncm91cFwiO1xuaW1wb3J0IHsgY2FwaXRhbGl6ZVN0cmluZyB9IGZyb20gXCIuLi8uLi91dGlscy9jYXBpdGFsaXplU3RyaW5nXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlciB7XG4gIGVtYWlsOiBzdHJpbmc7XG4gIGZpcnN0TmFtZTogc3RyaW5nO1xuICBsYXN0TmFtZTogc3RyaW5nO1xuICBncm91cHM6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgY3JlYXRlVXNlclBhcmFtZXRlcnMge1xuICBJZGVudGl0eVN0b3JlSWQ6IHN0cmluZztcbiAgVXNlck5hbWU6IHN0cmluZztcbiAgRGlzcGxheU5hbWU6IHN0cmluZztcbiAgTmFtZToge1xuICAgIEZhbWlseU5hbWU6IHN0cmluZztcbiAgICBHaXZlbk5hbWU6IHN0cmluZztcbiAgfTtcbiAgRW1haWxzOiB7XG4gICAgUHJpbWFyeTogYm9vbGVhbjtcbiAgICBWYWx1ZTogc3RyaW5nO1xuICB9W107XG59XG5cbmludGVyZmFjZSBJZGVudGl0eUNlbnRlclVzZXJQcm9wcyB7XG4gIGlkZW50aXR5U3RvcmVJZDogc3RyaW5nO1xuICBpZGVudGl0eUNlbnRlckdyb3VwczogR3JvdXBbXTtcbn1cblxuZXhwb3J0IGNsYXNzIElkZW50aXR5Q2VudGVyVXNlciBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJZGVudGl0eUNlbnRlclVzZXJQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCB1c2VyczogVXNlcltdID0gbmV3IFVzZXJzQ29uZmlnKCkuZ2V0VXNlcnMoKTtcbiAgICBjb25zdCBpZGVudGl0eVN0b3JlSWQgPSBwcm9wcy5pZGVudGl0eVN0b3JlSWQ7XG5cbiAgICBjb25zdCB1c2VyQ291bnQgPSB1c2Vycy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1c2VyQ291bnQ7IGkrKykge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJzW2ldO1xuICAgICAgY29uc3QgZ2l2ZW5OYW1lID0gY2FwaXRhbGl6ZVN0cmluZyh1c2VyLmZpcnN0TmFtZSk7XG4gICAgICBjb25zdCBmYW1pbHlOYW1lID0gY2FwaXRhbGl6ZVN0cmluZyh1c2VyLmxhc3ROYW1lKTtcbiAgICAgIGNvbnN0IHVzZXJQYXJhbXM6IGNyZWF0ZVVzZXJQYXJhbWV0ZXJzID0ge1xuICAgICAgICBJZGVudGl0eVN0b3JlSWQ6IGlkZW50aXR5U3RvcmVJZCxcbiAgICAgICAgVXNlck5hbWU6IHVzZXIuZW1haWwsXG4gICAgICAgIERpc3BsYXlOYW1lOiBgJHtnaXZlbk5hbWV9ICR7ZmFtaWx5TmFtZX1gLFxuICAgICAgICBOYW1lOiB7XG4gICAgICAgICAgRmFtaWx5TmFtZTogdXNlci5sYXN0TmFtZSxcbiAgICAgICAgICBHaXZlbk5hbWU6IHVzZXIuZmlyc3ROYW1lXG4gICAgICAgIH0sXG4gICAgICAgIEVtYWlsczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFByaW1hcnk6IHRydWUsXG4gICAgICAgICAgICBWYWx1ZTogdXNlci5lbWFpbFxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfTtcblxuICAgICAgY29uc3QgY3JlYXRlVXNlciA9IG5ldyBBd3NDdXN0b21SZXNvdXJjZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYGNyZWF0ZVVzZXIke2dpdmVuTmFtZX0ke2ZhbWlseU5hbWV9YCxcbiAgICAgICAge1xuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogXCJjcmVhdGVVc2Vyc1wiLFxuICAgICAgICAgIG9uQ3JlYXRlOiB7XG4gICAgICAgICAgICBzZXJ2aWNlOiBcIklkZW50aXR5U3RvcmVcIixcbiAgICAgICAgICAgIGFjdGlvbjogXCJjcmVhdGVVc2VyXCIsIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NKYXZhU2NyaXB0U0RLL2xhdGVzdC9BV1MvSWRlbnRpdHlTdG9yZS5odG1sI2NyZWF0ZVVzZXItcHJvcGVydHlcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHVzZXJQYXJhbXMsXG4gICAgICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6XG4gICAgICAgICAgICAgIGN1c3RvbVJlc291cmNlcy5QaHlzaWNhbFJlc291cmNlSWQub2YoXCJjcmVhdGVVc2Vyc1wiKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25VcGRhdGU6IHtcbiAgICAgICAgICAgIHNlcnZpY2U6IFwiSWRlbnRpdHlTdG9yZVwiLFxuICAgICAgICAgICAgYWN0aW9uOiBcInVwZGF0ZVVzZXJcIixcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHVzZXJQYXJhbXMsXG4gICAgICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6XG4gICAgICAgICAgICAgIGN1c3RvbVJlc291cmNlcy5QaHlzaWNhbFJlc291cmNlSWQub2YoXCJ1cGRhdGVVc2Vyc1wiKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzb3VyY2VUeXBlOiBcIkN1c3RvbTo6SWRlbnRpdHlDZW50ZXJVc2Vyc1wiXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIG5ldyBBd3NDdXN0b21SZXNvdXJjZSh0aGlzLCBgZGVsZXRlVXNlciR7Z2l2ZW5OYW1lfSR7ZmFtaWx5TmFtZX1gLCB7XG4gICAgICAgIGZ1bmN0aW9uTmFtZTogXCJkZWxldGVVc2Vyc1wiLFxuICAgICAgICBvbkRlbGV0ZToge1xuICAgICAgICAgIHNlcnZpY2U6IFwiSWRlbnRpdHlTdG9yZVwiLFxuICAgICAgICAgIGFjdGlvbjogXCJkZWxldGVVc2VyXCIsIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NKYXZhU2NyaXB0U0RLL2xhdGVzdC9BV1MvSWRlbnRpdHlTdG9yZS5odG1sI2RlbGV0ZVVzZXItcHJvcGVydHlcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICBJZGVudGl0eVN0b3JlSWQ6IGlkZW50aXR5U3RvcmVJZCxcbiAgICAgICAgICAgIFVzZXJJZDogY3JlYXRlVXNlci5nZXRSZXNwb25zZUZpZWxkKFwiVXNlcklkXCIpXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICByZXNvdXJjZVR5cGU6IFwiQ3VzdG9tOjpJZGVudGl0eUNlbnRlclVzZXJzXCJcbiAgICAgIH0pO1xuXG4gICAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGBVc2VySWQke2dpdmVuTmFtZX0ke2ZhbWlseU5hbWV9YCwge1xuICAgICAgICBrZXk6IGBVc2VySWQke2dpdmVuTmFtZX0ke2ZhbWlseU5hbWV9YCxcbiAgICAgICAgdmFsdWU6IGNyZWF0ZVVzZXIuZ2V0UmVzcG9uc2VGaWVsZChcIlVzZXJJZFwiKSxcbiAgICAgICAgZXhwb3J0TmFtZTogYFVzZXJJZCR7Z2l2ZW5OYW1lfSR7ZmFtaWx5TmFtZX1gXG4gICAgICB9KTtcblxuICAgICAgLy8gcHJvcHMuaWRlbnRpdHlDZW50ZXJHcm91cHMuZm9yRWFjaCgoaWRlbnRpdHlDZW50ZXJHcm91cCkpXG5cbiAgICAgIHVzZXIuZ3JvdXBzLmZvckVhY2goKGdyb3VwKSA9PiB7XG4gICAgICAgIGNvbnN0IGlkZW50aXR5Q2VudGVyR3JvdXAgPSBwcm9wcy5pZGVudGl0eUNlbnRlckdyb3Vwcy5maW5kKFxuICAgICAgICAgIChpZGVudGl0eUNlbnRlckdyb3VwKSA9PiBpZGVudGl0eUNlbnRlckdyb3VwLmRpc3BsYXlOYW1lID09PSBncm91cFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICghaWRlbnRpdHlDZW50ZXJHcm91cCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBHcm91cCAke2dyb3VwfSBkb2VzIG5vdCBleGlzdCBpbiBJZGVudGl0eSBDZW50ZXIgR3JvdXBzYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBncm91cElkID0gaWRlbnRpdHlDZW50ZXJHcm91cC5hdHRyR3JvdXBJZDtcbiAgICAgICAgY29uc3QgZ3JvdXBOYW1lID0gaWRlbnRpdHlDZW50ZXJHcm91cC5kaXNwbGF5TmFtZTtcblxuICAgICAgICBjb25zdCBncm91cE1lbWJlcnNoaXBJZCA9IG5ldyBBd3NDdXN0b21SZXNvdXJjZShcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGBjcmVhdGVHcm91cE1lbWJlcnNoaXAke2dpdmVuTmFtZX0ke2ZhbWlseU5hbWV9VG8ke2dyb3VwTmFtZX1gLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogXCJjcmVhdGVHcm91cE1lbWJlcnNoaXBcIixcbiAgICAgICAgICAgIG9uQ3JlYXRlOiB7XG4gICAgICAgICAgICAgIHNlcnZpY2U6IFwiSWRlbnRpdHlTdG9yZVwiLFxuICAgICAgICAgICAgICBhY3Rpb246IFwiY3JlYXRlR3JvdXBNZW1iZXJzaGlwXCIsXG4gICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgICBHcm91cElkOiBncm91cElkLFxuICAgICAgICAgICAgICAgIElkZW50aXR5U3RvcmVJZDogaWRlbnRpdHlTdG9yZUlkLFxuICAgICAgICAgICAgICAgIE1lbWJlcklkOiB7XG4gICAgICAgICAgICAgICAgICBVc2VySWQ6IGNyZWF0ZVVzZXIuZ2V0UmVzcG9uc2VGaWVsZChcIlVzZXJJZFwiKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBjdXN0b21SZXNvdXJjZXMuUGh5c2ljYWxSZXNvdXJjZUlkLm9mKFxuICAgICAgICAgICAgICAgIGBjcmVhdGVHcm91cE1lbWJlcnNoaXAke2dyb3VwTmFtZX1gXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvblVwZGF0ZToge1xuICAgICAgICAgICAgICBzZXJ2aWNlOiBcIklkZW50aXR5U3RvcmVcIixcbiAgICAgICAgICAgICAgYWN0aW9uOiBcImNyZWF0ZUdyb3VwTWVtYmVyc2hpcFwiLFxuICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgICAgR3JvdXBJZDogZ3JvdXBJZCxcbiAgICAgICAgICAgICAgICBJZGVudGl0eVN0b3JlSWQ6IGlkZW50aXR5U3RvcmVJZCxcbiAgICAgICAgICAgICAgICBNZW1iZXJJZDoge1xuICAgICAgICAgICAgICAgICAgVXNlcklkOiBjcmVhdGVVc2VyLmdldFJlc3BvbnNlRmllbGQoXCJVc2VySWRcIilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogY3VzdG9tUmVzb3VyY2VzLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihcbiAgICAgICAgICAgICAgICBgdXBkYXRlR3JvdXBNZW1iZXJzaGlwJHtncm91cE5hbWV9YFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIG5ldyBBd3NDdXN0b21SZXNvdXJjZShcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGBkZWxldGVHcm91cE1lbWJlcnNoaXAke2dpdmVuTmFtZX0ke2ZhbWlseU5hbWV9RnJvbSR7Z3JvdXBOYW1lfWAsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBcImRlbGV0ZUdyb3VwTWVtYmVyc2hpcFwiLFxuICAgICAgICAgICAgb25EZWxldGU6IHtcbiAgICAgICAgICAgICAgc2VydmljZTogXCJJZGVudGl0eVN0b3JlXCIsXG4gICAgICAgICAgICAgIGFjdGlvbjogXCJkZWxldGVHcm91cE1lbWJlcnNoaXBcIixcbiAgICAgICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICAgIElkZW50aXR5U3RvcmVJZDogaWRlbnRpdHlTdG9yZUlkLFxuICAgICAgICAgICAgICAgIE1lbWJlcnNoaXBJZDogZ3JvdXBNZW1iZXJzaGlwSWQuZ2V0UmVzcG9uc2VGaWVsZChcIk1lbWJlcnNoaXBJZFwiKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzb3VyY2VUeXBlOiBcIkN1c3RvbTo6SWRlbnRpdHlDZW50ZXJVc2Vyc1wiXG4gICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIG5ldyBDZm5PdXRwdXQoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBgR3JvdXBNZW1iZXJzaGlwSWQke2dpdmVuTmFtZX0ke2ZhbWlseU5hbWV9JHtncm91cE5hbWV9YCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBrZXk6IGBHcm91cE1lbWJlcnNoaXBJZCR7Z2l2ZW5OYW1lfSR7ZmFtaWx5TmFtZX0ke2dyb3VwTmFtZX1gLFxuICAgICAgICAgICAgdmFsdWU6IGdyb3VwTWVtYmVyc2hpcElkLmdldFJlc3BvbnNlRmllbGQoXCJNZW1iZXJzaGlwSWRcIiksXG4gICAgICAgICAgICBleHBvcnROYW1lOiBgR3JvdXBNZW1iZXJzaGlwSWQke2dpdmVuTmFtZX0ke2ZhbWlseU5hbWV9JHtncm91cE5hbWV9YFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { Duration } from "aws-cdk-lib";
|
|
2
|
-
import { Connections, IConnectable, Vpc } from "aws-cdk-lib/aws-ec2";
|
|
3
|
-
import { BackupProps, ClusterInstance, IClusterEngine } from "aws-cdk-lib/aws-rds";
|
|
4
|
-
import { Construct } from "constructs";
|
|
5
|
-
import { KeyValue } from "../../../types";
|
|
6
|
-
interface RdsProps {
|
|
7
|
-
vpc: Vpc;
|
|
8
|
-
databaseName?: string;
|
|
9
|
-
engine?: IClusterEngine;
|
|
10
|
-
backup?: BackupProps;
|
|
11
|
-
clusterIdentifier?: string;
|
|
12
|
-
monitoringInterval?: Duration;
|
|
13
|
-
preferredMaintenanceWindow?: string;
|
|
14
|
-
port?: number;
|
|
15
|
-
writer?: ClusterInstance;
|
|
16
|
-
readers?: ClusterInstance[];
|
|
17
|
-
tags: KeyValue;
|
|
18
|
-
}
|
|
19
|
-
export default class Rds extends Construct implements IConnectable {
|
|
20
|
-
connections: Connections;
|
|
21
|
-
constructor(scope: Construct, id: string, props: RdsProps);
|
|
22
|
-
}
|
|
23
|
-
export {};
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
4
|
-
const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
|
|
5
|
-
const aws_rds_1 = require("aws-cdk-lib/aws-rds");
|
|
6
|
-
const aws_secretsmanager_1 = require("aws-cdk-lib/aws-secretsmanager");
|
|
7
|
-
const constructs_1 = require("constructs");
|
|
8
|
-
const iam_1 = require("../iam");
|
|
9
|
-
const secrets_1 = require("../secrets");
|
|
10
|
-
class Rds extends constructs_1.Construct {
|
|
11
|
-
constructor(scope, id, props) {
|
|
12
|
-
super(scope, id);
|
|
13
|
-
// Database Credentials
|
|
14
|
-
const databaseCredentials = new secrets_1.Secret(this, `${props.databaseName}Credentials`, {
|
|
15
|
-
secretName: `${props.databaseName}Credentials`,
|
|
16
|
-
generateSecretString: {
|
|
17
|
-
secretStringTemplate: JSON.stringify({
|
|
18
|
-
username: "postgres"
|
|
19
|
-
}),
|
|
20
|
-
excludePunctuation: true,
|
|
21
|
-
includeSpace: false,
|
|
22
|
-
generateStringKey: "password"
|
|
23
|
-
},
|
|
24
|
-
tags: props.tags
|
|
25
|
-
});
|
|
26
|
-
// Customer Managed Keys
|
|
27
|
-
const encryptionKey = new secrets_1.CustomerManagedKey(this, `${props.databaseName}ClusterEncryptionKey`, {
|
|
28
|
-
aliasName: `cmk/rds/${props.databaseName}/encryptionKey`,
|
|
29
|
-
tags: props.tags
|
|
30
|
-
});
|
|
31
|
-
const primaryReaderInsightsKey = new secrets_1.CustomerManagedKey(this, `${props.databaseName}PrimaryReaderInsightsKey`, {
|
|
32
|
-
aliasName: `cmk/rds/${props.databaseName}/PrimaryReaderInsightsKey`,
|
|
33
|
-
tags: props.tags
|
|
34
|
-
});
|
|
35
|
-
const secondaryReaderInsightsKey = new secrets_1.CustomerManagedKey(this, `${props.databaseName}SecondaryReaderInsightsKey`, {
|
|
36
|
-
aliasName: `cmk/rds/${props.databaseName}/SecondaryReaderInsightsKey`,
|
|
37
|
-
tags: props.tags
|
|
38
|
-
});
|
|
39
|
-
const primaryWriterPerformanceInsightsKey = new secrets_1.CustomerManagedKey(this, `${props.databaseName}PrimaryWriterPerformanceInsightsKey`, {
|
|
40
|
-
aliasName: `cmk/rds/${props.databaseName}/PrimaryWriterInsightsKey`,
|
|
41
|
-
tags: props.tags
|
|
42
|
-
});
|
|
43
|
-
const clusterSecurityGroup = new iam_1.SecurityGroup(this, `${id}SecurityGroup`, {
|
|
44
|
-
vpc: props.vpc,
|
|
45
|
-
description: `Security group that allows inbound access to the postgres cluster for ${props.databaseName}`
|
|
46
|
-
});
|
|
47
|
-
//TODO: Remove this line, that allows the proxy to connect to the database. Replace with seperated security groups
|
|
48
|
-
clusterSecurityGroup.addIngressRule(clusterSecurityGroup, aws_ec2_1.Port.tcp(5432));
|
|
49
|
-
this.connections = clusterSecurityGroup.connections;
|
|
50
|
-
// Database Cluster
|
|
51
|
-
const databaseCluster = new aws_rds_1.DatabaseCluster(scope, `${id}Database`, {
|
|
52
|
-
vpc: props.vpc,
|
|
53
|
-
vpcSubnets: {
|
|
54
|
-
subnetType: aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS
|
|
55
|
-
},
|
|
56
|
-
securityGroups: [clusterSecurityGroup],
|
|
57
|
-
engine: props.engine ||
|
|
58
|
-
aws_rds_1.DatabaseClusterEngine.auroraPostgres({
|
|
59
|
-
//TODO: Do we update these when we release a new version? Or try to keep them constantly updated?
|
|
60
|
-
version: aws_rds_1.AuroraPostgresEngineVersion.VER_15_6
|
|
61
|
-
}),
|
|
62
|
-
backup: props.backup || {
|
|
63
|
-
retention: aws_cdk_lib_1.Duration.days(14)
|
|
64
|
-
},
|
|
65
|
-
storageEncrypted: true,
|
|
66
|
-
storageEncryptionKey: encryptionKey.key,
|
|
67
|
-
clusterIdentifier: props.clusterIdentifier || `${props.databaseName}-cluster`,
|
|
68
|
-
credentials: aws_rds_1.Credentials.fromSecret(databaseCredentials.secret),
|
|
69
|
-
defaultDatabaseName: props.databaseName || `${id.replace("Rds", "")}`,
|
|
70
|
-
monitoringInterval: props.monitoringInterval || aws_cdk_lib_1.Duration.minutes(1),
|
|
71
|
-
preferredMaintenanceWindow: props.preferredMaintenanceWindow || "Sat:12:30-Sat:20:30",
|
|
72
|
-
port: props.port || 5432,
|
|
73
|
-
removalPolicy: aws_cdk_lib_1.RemovalPolicy.SNAPSHOT,
|
|
74
|
-
writer: props.writer ||
|
|
75
|
-
aws_rds_1.ClusterInstance.serverlessV2(`${props.databaseName}Writer`, {
|
|
76
|
-
enablePerformanceInsights: true,
|
|
77
|
-
performanceInsightEncryptionKey: primaryWriterPerformanceInsightsKey.key,
|
|
78
|
-
instanceIdentifier: `${props.databaseName}-primary-writer`,
|
|
79
|
-
//TODO: Do we update these when we release a new version? Or try to keep them constantly updated?
|
|
80
|
-
caCertificate: aws_rds_1.CaCertificate.RDS_CA_RSA4096_G1
|
|
81
|
-
}),
|
|
82
|
-
readers: props.readers || [
|
|
83
|
-
aws_rds_1.ClusterInstance.serverlessV2(`${props.databaseName}PrimaryReader`, {
|
|
84
|
-
scaleWithWriter: true,
|
|
85
|
-
enablePerformanceInsights: true,
|
|
86
|
-
performanceInsightEncryptionKey: primaryReaderInsightsKey.key,
|
|
87
|
-
instanceIdentifier: `${props.databaseName}-primary-reader`,
|
|
88
|
-
caCertificate: aws_rds_1.CaCertificate.RDS_CA_RSA4096_G1
|
|
89
|
-
}),
|
|
90
|
-
aws_rds_1.ClusterInstance.serverlessV2(`${props.databaseName}SecondaryReader`, {
|
|
91
|
-
scaleWithWriter: false,
|
|
92
|
-
enablePerformanceInsights: true,
|
|
93
|
-
performanceInsightEncryptionKey: secondaryReaderInsightsKey.key,
|
|
94
|
-
instanceIdentifier: `${props.databaseName}-secondary-reader`,
|
|
95
|
-
caCertificate: aws_rds_1.CaCertificate.RDS_CA_RSA4096_G1
|
|
96
|
-
})
|
|
97
|
-
]
|
|
98
|
-
});
|
|
99
|
-
const databaseProxy = new aws_rds_1.DatabaseProxy(this, `${props.databaseName}DatabaseProxy`, {
|
|
100
|
-
proxyTarget: aws_rds_1.ProxyTarget.fromCluster(databaseCluster),
|
|
101
|
-
secrets: [databaseCredentials.secret],
|
|
102
|
-
securityGroups: [clusterSecurityGroup],
|
|
103
|
-
vpc: props.vpc,
|
|
104
|
-
vpcSubnets: {
|
|
105
|
-
subnetType: aws_ec2_1.SubnetType.PUBLIC
|
|
106
|
-
}
|
|
107
|
-
});
|
|
108
|
-
new aws_cdk_lib_1.CfnOutput(this, `${props.databaseName}ProxyEndpointOutput`, {
|
|
109
|
-
key: `${props.databaseName}ProxyEndpoint`,
|
|
110
|
-
exportName: `${props.databaseName}ProxyEndpoint`,
|
|
111
|
-
value: databaseProxy.endpoint
|
|
112
|
-
});
|
|
113
|
-
// Rotate the Secret every 30 days
|
|
114
|
-
const masterSecret = new secrets_1.Secret(this, `${props.databaseName}MasterSecret`, {
|
|
115
|
-
secretName: `${props.databaseName}MasterSecret`,
|
|
116
|
-
tags: props.tags
|
|
117
|
-
});
|
|
118
|
-
new aws_secretsmanager_1.SecretRotation(this, `${props.databaseName}SecretRotation`, {
|
|
119
|
-
application: new aws_secretsmanager_1.SecretRotationApplication("SecretsManagerRDSPostgreSQLRotationMultiUser", "1.1.367", {
|
|
120
|
-
isMultiUser: true
|
|
121
|
-
}),
|
|
122
|
-
secret: databaseCredentials.secret,
|
|
123
|
-
masterSecret: masterSecret.secret,
|
|
124
|
-
target: databaseCluster,
|
|
125
|
-
vpc: databaseCluster.vpc
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
exports.default = Rds;
|
|
130
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvZGF0YWJhc2UvcmRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQWlFO0FBQ2pFLGlEQU02QjtBQUM3QixpREFXNkI7QUFDN0IsdUVBR3dDO0FBQ3hDLDJDQUF1QztBQUN2QyxnQ0FBdUM7QUFDdkMsd0NBQXdEO0FBaUJ4RCxNQUFxQixHQUFJLFNBQVEsc0JBQVM7SUFHeEMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFlO1FBQ3ZELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsdUJBQXVCO1FBQ3ZCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxnQkFBTSxDQUNwQyxJQUFJLEVBQ0osR0FBRyxLQUFLLENBQUMsWUFBWSxhQUFhLEVBQ2xDO1lBQ0UsVUFBVSxFQUFFLEdBQUcsS0FBSyxDQUFDLFlBQVksYUFBYTtZQUM5QyxvQkFBb0IsRUFBRTtnQkFDcEIsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDbkMsUUFBUSxFQUFFLFVBQVU7aUJBQ3JCLENBQUM7Z0JBQ0Ysa0JBQWtCLEVBQUUsSUFBSTtnQkFDeEIsWUFBWSxFQUFFLEtBQUs7Z0JBQ25CLGlCQUFpQixFQUFFLFVBQVU7YUFDOUI7WUFDRCxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7U0FDakIsQ0FDRixDQUFDO1FBRUYsd0JBQXdCO1FBQ3hCLE1BQU0sYUFBYSxHQUFHLElBQUksNEJBQWtCLENBQzFDLElBQUksRUFDSixHQUFHLEtBQUssQ0FBQyxZQUFZLHNCQUFzQixFQUMzQztZQUNFLFNBQVMsRUFBRSxXQUFXLEtBQUssQ0FBQyxZQUFZLGdCQUFnQjtZQUN4RCxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7U0FDakIsQ0FDRixDQUFDO1FBRUYsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLDRCQUFrQixDQUNyRCxJ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QUNGLENBQ0YsQ0FBQztRQUVGLElBQUksdUJBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsWUFBWSxxQkFBcUIsRUFBRTtZQUM5RCxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUMsWUFBWSxlQUFlO1lBQ3pDLFVBQVUsRUFBRSxHQUFHLEtBQUssQ0FBQyxZQUFZLGVBQWU7WUFDaEQsS0FBSyxFQUFFLGFBQWEsQ0FBQyxRQUFRO1NBQzlCLENBQUMsQ0FBQztRQUVILGtDQUFrQztRQUNsQyxNQUFNLFlBQVksR0FBRyxJQUFJLGdCQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLFlBQVksY0FBYyxFQUFFO1lBQ3pFLFVBQVUsRUFBRSxHQUFHLEtBQUssQ0FBQyxZQUFZLGNBQWM7WUFDL0MsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1NBQ2pCLENBQUMsQ0FBQztRQUVILElBQUksbUNBQWMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsWUFBWSxnQkFBZ0IsRUFBRTtZQUM5RCxXQUFXLEVBQUUsSUFBSSw4Q0FBeUIsQ0FDeEMsOENBQThDLEVBQzlDLFNBQVMsRUFDVDtnQkFDRSxXQUFXLEVBQUUsSUFBSTthQUNsQixDQUNGO1lBQ0QsTUFBTSxFQUFFLG1CQUFtQixDQUFDLE1BQU07WUFDbEMsWUFBWSxFQUFFLFlBQVksQ0FBQyxNQUFNO1lBQ2pDLE1BQU0sRUFBRSxlQUFlO1lBQ3ZCLEdBQUcsRUFBRSxlQUFlLENBQUMsR0FBRztTQUN6QixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUF0S0Qsc0JBc0tDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuT3V0cHV0LCBEdXJhdGlvbiwgUmVtb3ZhbFBvbGljeSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtcbiAgQ29ubmVjdGlvbnMsXG4gIElDb25uZWN0YWJsZSxcbiAgUG9ydCxcbiAgU3VibmV0VHlwZSxcbiAgVnBjXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQge1xuICBBdXJvcmFQb3N0Z3Jlc0VuZ2luZVZlcnNpb24sXG4gIEJhY2t1cFByb3BzLFxuICBDYUNlcnRpZmljYXRlLFxuICBDbHVzdGVySW5zdGFuY2UsXG4gIENyZWRlbnRpYWxzLFxuICBEYXRhYmFzZUNsdXN0ZXIsXG4gIERhdGFiYXNlQ2x1c3RlckVuZ2luZSxcbiAgRGF0YWJhc2VQcm94eSxcbiAgSUNsdXN0ZXJFbmdpbmUsXG4gIFByb3h5VGFyZ2V0XG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtcmRzXCI7XG5pbXBvcnQge1xuICBTZWNyZXRSb3RhdGlvbixcbiAgU2VjcmV0Um90YXRpb25BcHBsaWNhdGlvblxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgU2VjdXJpdHlHcm91cCB9IGZyb20gXCIuLi9pYW1cIjtcbmltcG9ydCB7IEN1c3RvbWVyTWFuYWdlZEtleSwgU2VjcmV0IH0gZnJvbSBcIi4uL3NlY3JldHNcIjtcbmltcG9ydCB7IEtleVZhbHVlIH0gZnJvbSBcIi4uLy4uLy4uL3R5cGVzXCI7XG5cbmludGVyZmFjZSBSZHNQcm9wcyB7XG4gIHZwYzogVnBjO1xuICBkYXRhYmFzZU5hbWU/OiBzdHJpbmc7XG4gIGVuZ2luZT86IElDbHVzdGVyRW5naW5lO1xuICBiYWNrdXA/OiBCYWNrdXBQcm9wcztcbiAgY2x1c3RlcklkZW50aWZpZXI/OiBzdHJpbmc7XG4gIG1vbml0b3JpbmdJbnRlcnZhbD86IER1cmF0aW9uO1xuICBwcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdz86IHN0cmluZztcbiAgcG9ydD86IG51bWJlcjtcbiAgd3JpdGVyPzogQ2x1c3Rlckluc3RhbmNlO1xuICByZWFkZXJzPzogQ2x1c3Rlckluc3RhbmNlW107XG4gIHRhZ3M6IEtleVZhbHVlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZHMgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJQ29ubmVjdGFibGUge1xuICBwdWJsaWMgY29ubmVjdGlvbnM6IENvbm5lY3Rpb25zO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBSZHNQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICAvLyBEYXRhYmFzZSBDcmVkZW50aWFsc1xuICAgIGNvbnN0IGRhdGFiYXNlQ3JlZGVudGlhbHMgPSBuZXcgU2VjcmV0KFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1DcmVkZW50aWFsc2AsXG4gICAgICB7XG4gICAgICAgIHNlY3JldE5hbWU6IGAke3Byb3BzLmRhdGFiYXNlTmFtZX1DcmVkZW50aWFsc2AsXG4gICAgICAgIGdlbmVyYXRlU2VjcmV0U3RyaW5nOiB7XG4gICAgICAgICAgc2VjcmV0U3RyaW5nVGVtcGxhdGU6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIHVzZXJuYW1lOiBcInBvc3RncmVzXCJcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBleGNsdWRlUHVuY3R1YXRpb246IHRydWUsXG4gICAgICAgICAgaW5jbHVkZVNwYWNlOiBmYWxzZSxcbiAgICAgICAgICBnZW5lcmF0ZVN0cmluZ0tleTogXCJwYXNzd29yZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHRhZ3M6IHByb3BzLnRhZ3NcbiAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gQ3VzdG9tZXIgTWFuYWdlZCBLZXlzXG4gICAgY29uc3QgZW5jcnlwdGlvbktleSA9IG5ldyBDdXN0b21lck1hbmFnZWRLZXkoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfUNsdXN0ZXJFbmNyeXB0aW9uS2V5YCxcbiAgICAgIHtcbiAgICAgICAgYWxpYXNOYW1lOiBgY21rL3Jkcy8ke3Byb3BzLmRhdGFiYXNlTmFtZX0vZW5jcnlwdGlvbktleWAsXG4gICAgICAgIHRhZ3M6IHByb3BzLnRhZ3NcbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3QgcHJpbWFyeVJlYWRlckluc2lnaHRzS2V5ID0gbmV3IEN1c3RvbWVyTWFuYWdlZEtleShcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9UHJpbWFyeVJlYWRlckluc2lnaHRzS2V5YCxcbiAgICAgIHtcbiAgICAgICAgYWxpYXNOYW1lOiBgY21rL3Jkcy8ke3Byb3BzLmRhdGFiYXNlTmFtZX0vUHJpbWFyeVJlYWRlckluc2lnaHRzS2V5YCxcbiAgICAgICAgdGFnczogcHJvcHMudGFnc1xuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zdCBzZWNvbmRhcnlSZWFkZXJJbnNpZ2h0c0tleSA9IG5ldyBDdXN0b21lck1hbmFnZWRLZXkoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVNlY29uZGFyeVJlYWRlckluc2lnaHRzS2V5YCxcbiAgICAgIHtcbiAgICAgICAgYWxpYXNOYW1lOiBgY21rL3Jkcy8ke3Byb3BzLmRhdGFiYXNlTmFtZX0vU2Vjb25kYXJ5UmVhZGVySW5zaWdodHNLZXlgLFxuICAgICAgICB0YWdzOiBwcm9wcy50YWdzXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IHByaW1hcnlXcml0ZXJQZXJmb3JtYW5jZUluc2lnaHRzS2V5ID0gbmV3IEN1c3RvbWVyTWFuYWdlZEtleShcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9UHJpbWFyeVdyaXRlclBlcmZvcm1hbmNlSW5zaWdodHNLZXlgLFxuICAgICAge1xuICAgICAgICBhbGlhc05hbWU6IGBjbWsvcmRzLyR7cHJvcHMuZGF0YWJhc2VOYW1lfS9QcmltYXJ5V3JpdGVySW5zaWdodHNLZXlgLFxuICAgICAgICB0YWdzOiBwcm9wcy50YWdzXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IGNsdXN0ZXJTZWN1cml0eUdyb3VwID0gbmV3IFNlY3VyaXR5R3JvdXAodGhpcywgYCR7aWR9U2VjdXJpdHlHcm91cGAsIHtcbiAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgZGVzY3JpcHRpb246IGBTZWN1cml0eSBncm91cCB0aGF0IGFsbG93cyBpbmJvdW5kIGFjY2VzcyB0byB0aGUgcG9zdGdyZXMgY2x1c3RlciBmb3IgJHtwcm9wcy5kYXRhYmFzZU5hbWV9YFxuICAgIH0pO1xuXG4gICAgLy9UT0RPOiBSZW1vdmUgdGhpcyBsaW5lLCB0aGF0IGFsbG93cyB0aGUgcHJveHkgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuIFJlcGxhY2Ugd2l0aCBzZXBlcmF0ZWQgc2VjdXJpdHkgZ3JvdXBzXG4gICAgY2x1c3RlclNlY3VyaXR5R3JvdXAuYWRkSW5ncmVzc1J1bGUoY2x1c3RlclNlY3VyaXR5R3JvdXAsIFBvcnQudGNwKDU0MzIpKTtcblxuICAgIHRoaXMuY29ubmVjdGlvbnMgPSBjbHVzdGVyU2VjdXJpdHlHcm91cC5jb25uZWN0aW9ucztcblxuICAgIC8vIERhdGFiYXNlIENsdXN0ZXJcbiAgICBjb25zdCBkYXRhYmFzZUNsdXN0ZXIgPSBuZXcgRGF0YWJhc2VDbHVzdGVyKHNjb3BlLCBgJHtpZH1EYXRhYmFzZWAsIHtcbiAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgdnBjU3VibmV0czoge1xuICAgICAgICBzdWJuZXRUeXBlOiBTdWJuZXRUeXBlLlBSSVZBVEVfV0lUSF9FR1JFU1NcbiAgICAgIH0sXG4gICAgICBzZWN1cml0eUdyb3VwczogW2NsdXN0ZXJTZWN1cml0eUdyb3VwXSxcbiAgICAgIGVuZ2luZTpcbiAgICAgICAgcHJvcHMuZW5naW5lIHx8XG4gICAgICAgIERhdGFiYXNlQ2x1c3RlckVuZ2luZS5hdXJvcmFQb3N0Z3Jlcyh7XG4gICAgICAgICAgLy9UT0RPOiBEbyB3ZSB1cGRhdGUgdGhlc2Ugd2hlbiB3ZSByZWxlYXNlIGEgbmV3IHZlcnNpb24/IE9yIHRyeSB0byBrZWVwIHRoZW0gY29uc3RhbnRseSB1cGRhdGVkP1xuICAgICAgICAgIHZlcnNpb246IEF1cm9yYVBvc3RncmVzRW5naW5lVmVyc2lvbi5WRVJfMTVfNlxuICAgICAgICB9KSxcbiAgICAgIGJhY2t1cDogcHJvcHMuYmFja3VwIHx8IHtcbiAgICAgICAgcmV0ZW50aW9uOiBEdXJhdGlvbi5kYXlzKDE0KVxuICAgICAgfSxcbiAgICAgIHN0b3JhZ2VFbmNyeXB0ZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlRW5jcnlwdGlvbktleTogZW5jcnlwdGlvbktleS5rZXksXG4gICAgICBjbHVzdGVySWRlbnRpZmllcjpcbiAgICAgICAgcHJvcHMuY2x1c3RlcklkZW50aWZpZXIgfHwgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfS1jbHVzdGVyYCxcbiAgICAgIGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscy5mcm9tU2VjcmV0KGRhdGFiYXNlQ3JlZGVudGlhbHMuc2VjcmV0KSxcbiAgICAgIGRlZmF1bHREYXRhYmFzZU5hbWU6IHByb3BzLmRhdGFiYXNlTmFtZSB8fCBgJHtpZC5yZXBsYWNlKFwiUmRzXCIsIFwiXCIpfWAsXG4gICAgICBtb25pdG9yaW5nSW50ZXJ2YWw6IHByb3BzLm1vbml0b3JpbmdJbnRlcnZhbCB8fCBEdXJhdGlvbi5taW51dGVzKDEpLFxuICAgICAgcHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3c6XG4gICAgICAgIHByb3BzLnByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93IHx8IFwiU2F0OjEyOjMwLVNhdDoyMDozMFwiLFxuICAgICAgcG9ydDogcHJvcHMucG9ydCB8fCA1NDMyLFxuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5TTkFQU0hPVCxcbiAgICAgIHdyaXRlcjpcbiAgICAgICAgcHJvcHMud3JpdGVyIHx8XG4gICAgICAgIENsdXN0ZXJJbnN0YW5jZS5zZXJ2ZXJsZXNzVjIoYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVdyaXRlcmAsIHtcbiAgICAgICAgICBlbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzOiB0cnVlLFxuICAgICAgICAgIHBlcmZvcm1hbmNlSW5zaWdodEVuY3J5cHRpb25LZXk6XG4gICAgICAgICAgICBwcmltYXJ5V3JpdGVyUGVyZm9ybWFuY2VJbnNpZ2h0c0tleS5rZXksXG4gICAgICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9LXByaW1hcnktd3JpdGVyYCxcbiAgICAgICAgICAvL1RPRE86IERvIHdlIHVwZGF0ZSB0aGVzZSB3aGVuIHdlIHJlbGVhc2UgYSBuZXcgdmVyc2lvbj8gT3IgdHJ5IHRvIGtlZXAgdGhlbSBjb25zdGFudGx5IHVwZGF0ZWQ/XG4gICAgICAgICAgY2FDZXJ0aWZpY2F0ZTogQ2FDZXJ0aWZpY2F0ZS5SRFNfQ0FfUlNBNDA5Nl9HMVxuICAgICAgICB9KSxcbiAgICAgIHJlYWRlcnM6IHByb3BzLnJlYWRlcnMgfHwgW1xuICAgICAgICBDbHVzdGVySW5zdGFuY2Uuc2VydmVybGVzc1YyKGAke3Byb3BzLmRhdGFiYXNlTmFtZX1QcmltYXJ5UmVhZGVyYCwge1xuICAgICAgICAgIHNjYWxlV2l0aFdyaXRlcjogdHJ1ZSxcbiAgICAgICAgICBlbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzOiB0cnVlLFxuICAgICAgICAgIHBlcmZvcm1hbmNlSW5zaWdodEVuY3J5cHRpb25LZXk6IHByaW1hcnlSZWFkZXJJbnNpZ2h0c0tleS5rZXksXG4gICAgICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9LXByaW1hcnktcmVhZGVyYCxcbiAgICAgICAgICBjYUNlcnRpZmljYXRlOiBDYUNlcnRpZmljYXRlLlJEU19DQV9SU0E0MDk2X0cxXG4gICAgICAgIH0pLFxuICAgICAgICBDbHVzdGVySW5zdGFuY2Uuc2VydmVybGVzc1YyKGAke3Byb3BzLmRhdGFiYXNlTmFtZX1TZWNvbmRhcnlSZWFkZXJgLCB7XG4gICAgICAgICAgc2NhbGVXaXRoV3JpdGVyOiBmYWxzZSxcbiAgICAgICAgICBlbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzOiB0cnVlLFxuICAgICAgICAgIHBlcmZvcm1hbmNlSW5zaWdodEVuY3J5cHRpb25LZXk6IHNlY29uZGFyeVJlYWRlckluc2lnaHRzS2V5LmtleSxcbiAgICAgICAgICBpbnN0YW5jZUlkZW50aWZpZXI6IGAke3Byb3BzLmRhdGFiYXNlTmFtZX0tc2Vjb25kYXJ5LXJlYWRlcmAsXG4gICAgICAgICAgY2FDZXJ0aWZpY2F0ZTogQ2FDZXJ0aWZpY2F0ZS5SRFNfQ0FfUlNBNDA5Nl9HMVxuICAgICAgICB9KVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgY29uc3QgZGF0YWJhc2VQcm94eSA9IG5ldyBEYXRhYmFzZVByb3h5KFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1EYXRhYmFzZVByb3h5YCxcbiAgICAgIHtcbiAgICAgICAgcHJveHlUYXJnZXQ6IFByb3h5VGFyZ2V0LmZyb21DbHVzdGVyKGRhdGFiYXNlQ2x1c3RlciksXG4gICAgICAgIHNlY3JldHM6IFtkYXRhYmFzZUNyZWRlbnRpYWxzLnNlY3JldF0sXG4gICAgICAgIHNlY3VyaXR5R3JvdXBzOiBbY2x1c3RlclNlY3VyaXR5R3JvdXBdLFxuICAgICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgICAgdnBjU3VibmV0czoge1xuICAgICAgICAgIHN1Ym5ldFR5cGU6IFN1Ym5ldFR5cGUuUFVCTElDXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9UHJveHlFbmRwb2ludE91dHB1dGAsIHtcbiAgICAgIGtleTogYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVByb3h5RW5kcG9pbnRgLFxuICAgICAgZXhwb3J0TmFtZTogYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVByb3h5RW5kcG9pbnRgLFxuICAgICAgdmFsdWU6IGRhdGFiYXNlUHJveHkuZW5kcG9pbnRcbiAgICB9KTtcblxuICAgIC8vIFJvdGF0ZSB0aGUgU2VjcmV0IGV2ZXJ5IDMwIGRheXNcbiAgICBjb25zdCBtYXN0ZXJTZWNyZXQgPSBuZXcgU2VjcmV0KHRoaXMsIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1NYXN0ZXJTZWNyZXRgLCB7XG4gICAgICBzZWNyZXROYW1lOiBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9TWFzdGVyU2VjcmV0YCxcbiAgICAgIHRhZ3M6IHByb3BzLnRhZ3NcbiAgICB9KTtcblxuICAgIG5ldyBTZWNyZXRSb3RhdGlvbih0aGlzLCBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9U2VjcmV0Um90YXRpb25gLCB7XG4gICAgICBhcHBsaWNhdGlvbjogbmV3IFNlY3JldFJvdGF0aW9uQXBwbGljYXRpb24oXG4gICAgICAgIFwiU2VjcmV0c01hbmFnZXJSRFNQb3N0Z3JlU1FMUm90YXRpb25NdWx0aVVzZXJcIixcbiAgICAgICAgXCIxLjEuMzY3XCIsXG4gICAgICAgIHtcbiAgICAgICAgICBpc011bHRpVXNlcjogdHJ1ZVxuICAgICAgICB9XG4gICAgICApLFxuICAgICAgc2VjcmV0OiBkYXRhYmFzZUNyZWRlbnRpYWxzLnNlY3JldCxcbiAgICAgIG1hc3RlclNlY3JldDogbWFzdGVyU2VjcmV0LnNlY3JldCxcbiAgICAgIHRhcmdldDogZGF0YWJhc2VDbHVzdGVyLFxuICAgICAgdnBjOiBkYXRhYmFzZUNsdXN0ZXIudnBjXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const fs = require("fs");
|
|
4
|
-
class UsersConfig {
|
|
5
|
-
constructor() {
|
|
6
|
-
this.configFile = "fjall/users-config.json";
|
|
7
|
-
if (!fs.existsSync(this.configFile)) {
|
|
8
|
-
throw new Error(`Config file ${this.configFile} does not exist`);
|
|
9
|
-
}
|
|
10
|
-
const fileContent = fs.readFileSync(this.configFile, "utf-8");
|
|
11
|
-
this.users = JSON.parse(fileContent);
|
|
12
|
-
}
|
|
13
|
-
getUsers() {
|
|
14
|
-
return this.users;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
exports.default = UsersConfig;
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlcnNDb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvdXRpbHMvdXNlcnNDb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx5QkFBeUI7QUFHekIsTUFBcUIsV0FBVztJQUk5QjtRQUhRLGVBQVUsR0FBRyx5QkFBeUIsQ0FBQztRQUk3QyxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLElBQUksQ0FBQyxVQUFVLGlCQUFpQixDQUFDLENBQUM7U0FDbEU7UUFFRCxNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQWhCRCw4QkFnQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiLi4vY29uZmlnL2F3cy9pZGVudGl0eUNlbnRlclVzZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXNlcnNDb25maWcge1xuICBwcml2YXRlIGNvbmZpZ0ZpbGUgPSBcImZqYWxsL3VzZXJzLWNvbmZpZy5qc29uXCI7XG4gIHB1YmxpYyB1c2VyczogVXNlcltdO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmNvbmZpZ0ZpbGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbmZpZyBmaWxlICR7dGhpcy5jb25maWdGaWxlfSBkb2VzIG5vdCBleGlzdGApO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHRoaXMuY29uZmlnRmlsZSwgXCJ1dGYtOFwiKTtcbiAgICB0aGlzLnVzZXJzID0gSlNPTi5wYXJzZShmaWxlQ29udGVudCk7XG4gIH1cblxuICBnZXRVc2VycygpIHtcbiAgICByZXR1cm4gdGhpcy51c2VycztcbiAgfVxufVxuIl19
|